Amazon Chime SDK Project Board
หมายเหตุ: หากการสร้างด้วยซอร์สโค้ด SDK สาขา
development
มีการเปลี่ยนแปลงที่มีเลือดออกซึ่งอาจไม่สามารถสร้างได้ด้วยห้องสมุดสื่อมวลชนที่มีอยู่ในที่สาธารณะหรืออาจไม่มั่นคงเท่ากับการเผยแพร่สาธารณะ
Amazon Chime SDK สำหรับ iOS ทำให้ง่ายต่อการเพิ่มการเรียกเสียงการทำงานร่วมกันการโทรวิดีโอและคุณสมบัติการดูหน้าจอแชร์ไปยังแอปพลิเคชัน iOS โดยใช้บริการโครงสร้างพื้นฐานเดียวกันกับที่ให้บริการการประชุมบนบริการ Amazon Chime
Amazon Chime SDK สำหรับ iOS นี้ทำงานได้โดยเชื่อมต่อกับทรัพยากรเซสชันการประชุมที่คุณสร้างขึ้นในบัญชี AWS ของคุณ SDK มีทุกสิ่งที่คุณต้องการในการสร้างการโทรที่กำหนดเองและประสบการณ์การทำงานร่วมกันในแอปพลิเคชัน iOS ของคุณรวมถึงวิธีการ: กำหนดค่าเซสชันการประชุมรายการและเลือกอุปกรณ์เสียงสลับอุปกรณ์วิดีโอเริ่มต้นและหยุดการดูหน้าจอ เมื่อมีการเปลี่ยนแปลงระดับเสียงและจัดการคุณสมบัติการประชุมเช่นเสียงปิดเสียงและการผูกกระเบื้องวิดีโอ
นอกจากนี้เรายังมีคณะกรรมการโครงการ SDK ของ Amazon Chime ซึ่งคุณสามารถค้นหาคำขอชุมชนและสถานะของพวกเขาได้
ในการเริ่มต้นดูแหล่งข้อมูลต่อไปนี้:
และตรวจสอบคำแนะนำต่อไปนี้:
คุณสามารถรวม Amazon Chime SDK ในโครงการของคุณได้จาก SPM, Cocoapods หรือ Binaries ผ่านการเปิดตัว GitHub
เพื่อจุดประสงค์ในการตั้งค่าโฟลเดอร์รูทของโครงการของคุณ (ซึ่งคุณสามารถค้นหาไฟล์ .xcodeproj
) จะถูกเรียกว่า root
Amazon Chime SDK มีให้บริการผ่าน Cocoapods หากคุณยังไม่ได้ติดตั้ง cocoapods ให้ติดตั้ง cocoapods โดยเรียกใช้คำสั่ง:
$ gem install cocoapods
$ pod setup
ขึ้นอยู่กับการตั้งค่าระบบของคุณคุณอาจต้องใช้ sudo สำหรับการติดตั้ง cocoapods ดังนี้:
$ sudo gem install cocoapods
$ pod setup
ในไดเรกทอรีรูท (ไดเรกทอรีที่ไฟล์ *.xcodeproj ของคุณคือ) ให้เรียกใช้สิ่งต่อไปนี้เพื่อสร้าง podfile ในโครงการของคุณ:
$ pod init
แก้ไข Podfile
เพื่อรวม AmazonChimeSDK
ไว้ในโครงการของคุณ:
target 'YourTarget' do
pod 'AmazonChimeSDK'
...
end
หากคุณไม่ต้องการฟังก์ชั่นการแชร์วิดีโอและเนื้อหาหรือการสนับสนุนตัวแปลงสัญญาณวิดีโอซอฟต์แวร์คุณสามารถใช้ AmazonChimeSDKNoVideoCodecs
แทนเพื่อลดขนาด:
target 'YourTarget' do
pod 'AmazonChimeSDKNoVideoCodecs'
...
end
(ไม่บังคับ) หากคุณต้องการใช้คุณสมบัติเบลอและการเปลี่ยนพื้นหลังเพิ่ม:
target 'YourTarget' do
pod 'AmazonChimeSDKMachineLearning'
...
end
จากนั้นเรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้งพ็อด:
$ pod install --repo-update
ในการเปิดโครงการของคุณให้เปิดไฟล์ *.xcworkspace
ที่สร้างขึ้นใหม่ในไดเรกทอรีรูทโดยใช้ XCode คุณสามารถทำได้โดยการออกคำสั่งต่อไปนี้ในโฟลเดอร์โครงการของคุณ
$ xed .
หมายเหตุ: อย่า ใช้ *.xcodeproj เพื่อเปิดโครงการ
หากคุณใช้คุณสมบัติเบลอและการเปลี่ยนพื้นหลังภายใต้แท็บ Build Settings
ภายใต้ส่วน Linking
ให้เพิ่ม -framework AmazonChimeSDKMachineLearning
ไปยัง Other Linker Flags
Amazon Chime SDK มีให้บริการผ่าน SPM หากคุณไม่ต้องการฟังก์ชั่นการแชร์วิดีโอและเนื้อหาหรือการสนับสนุนตัวแปลงสัญญาณวิดีโอซอฟต์แวร์คุณสามารถเลือกใช้ตัวแปลงสัญญาณวิดีโอ SPM แทนได้
เปิดโครงการของคุณใน xcode
ไปที่ ไฟล์ > แพ็คเกจที่รวดเร็ว > เพิ่มการพึ่งพาแพ็คเกจ ...
ในฟิลด์ ป้อน URL ที่เก็บแพ็คเกจ ป้อน "https://github.com/aws/amazon-chime-sdk-ios-spm" หากต้องการใช้โมดูลสื่อตัวแปลงสัญญาณวิดีโอแทนให้ป้อน "https://github.com/aws/amazon-chime-sdk-ios-ino-video-codecs-spm"
ป้อนเวอร์ชันล่าสุด (เช่น 0.23.1
) และคลิก ถัดไป
เลือกแพ็คเกจสำหรับโครงการของคุณและคลิก เสร็จสิ้น จำเป็นต้องใช้ AmazonChimeSDK
และ AmazonChimeSDKMedia
ตรวจสอบ AmazonChimeSDKMachineLearning
หากคุณต้องการใช้พื้นหลังเบลอและการเปลี่ยนพื้นหลัง
AmazonChimeSDK
และ AmazonChimeSDKMedia
จากรุ่นล่าสุดAmazonChimeSDKMachineLearning
Binary มิฉะนั้นคุณสามารถเพิกเฉยต่อการอ้างอิงทั้งหมดของ AmazonChimeSDKMachineLearning
ในคำแนะนำด้านล่างAmazonChimeSDKMediaNoVideoCodecs
แทน AmazonChimeSDKMedia
และปฏิบัติต่อการอ้างอิงทั้งหมดของ AmazonChimeSDKMedia
เป็น AmazonChimeSDKMediaNoVideoCodecs
ในคำแนะนำด้านล่างหมายเหตุ: เราไม่สนับสนุนการผสมและการจับคู่ไบนารีจากรุ่นที่แตกต่างกัน
.framework
s หรือ .xcframework
s ถึง root
ซึ่งขึ้นอยู่กับกรอบการทำงานของโครงการของคุณ สำหรับ xcode12.3 และใหม่กว่าโปรดใช้ .xcframework
หากคุณมีปัญหาในการรวบรวม .xcframework
พร้อมใช้งานหลังจาก Amazon Chime SDK iOS v0.15.0 เปิดไฟล์ .xcodeproj
ของคุณใน XCode และคลิกที่เป้าหมายการสร้างของคุณ
ภายใต้แท็บ Build Settings
เพิ่ม $(PROJECT_DIR)
ไปยัง Framework Search Path
เพิ่ม @executable_path/Frameworks
ไปยัง Runpath Search Paths
ภายใต้ส่วน Linking
ให้เพิ่มสองธงต่อไปนี้ใน Other Linker Flags
:
-lc++
-ObjC
ภายใต้แท็บ General
ให้มองหา Frameworks, Libraries, and Embedded Content
คลิกที่ +จากนั้น Add Others
จากนั้น Add Files
.framework
แบบดั้งเดิมให้ระบุตำแหน่งของ AmazonChimeSDK.framework
, AmazonChimeSDKMedia.framework
และ AmazonChimeSDKMachineLearning.framework
จากขั้นตอนที่ 1 หากคุณ .xcframework
ข้อผิด .framework
ในการรวบรวม .xcframework
แทนซึ่งมีให้หลังจาก Amazon Chime SDK iOS v0.15.0.xcframework
ให้ระบุตำแหน่งของ AmazonChimeSDK.xcframework
, AmazonChimeSDKMedia.xcframework
และ AmazonChimeSDKMachineLearning.xcframework
จากขั้นตอนที่ 1AmazonChimeSDK.framework
AmazonChimeSDKMedia.framework
และ Frameworks ตรวจสอบว่า Embed & Sign
ถูกเลือกภายใต้ตัวเลือก Embed
สำหรับ AmazonChimeSDKMachineLearning.framework
เลือก Do Not Embed
ในการเรียกใช้แอปพลิเคชันสาธิตให้ทำตามขั้นตอนเหล่านี้
git clone [email protected]:aws/amazon-chime-sdk-ios.git
สำหรับเป้าหมายทั้งสองใน /AmazonChimeSDKDemo/Podfile
ให้แทนที่ AMAZON_CHIME_SDK_VERSION
ด้วยรุ่น SDK ที่เฉพาะเจาะจงเช่น 0.19.3
หรือลบออกหากใช้ amazon chime SDK เวอร์ชันล่าสุด
Under /AmazonChimeSDKDemo
รันคำสั่งต่อไปนี้เพื่อติดตั้ง PODS:
$ pod install --repo-update
ดาวน์โหลด AmazonChimeSDKMedia
และ AmazonChimeSDKMachineLearning
Binaries จากรุ่นล่าสุด
คลายซิปและคัดลอก AmazonChimeSDKMedia.xcframework
ไปยังโฟลเดอร์ amazon-chime-sdk-ios/AmazonChimeSDK
และ AmazonChimeSDKMachineLearning.xcframework
ไปยัง amazon-chime-sdk-ios/AmazonChimeSDKDemo
ปรับใช้การสาธิต Serverless จาก Amazon-Chime-SDK-JS
AmazonChimeDemoSDKBroadcast.appex
เป็นส่วนขยายออกอากาศสำหรับการแชร์หน้าจอระดับอุปกรณ์ที่ใช้โดย AmazonChimesDkDemo ตรวจสอบว่า Embed without Signing
ภายใต้ตัวเลือก Embed
ลบออกจาก Frameworks, Libraries, and Embedded Content
หากคุณไม่ต้องการทดสอบสิ่งนี้ สำหรับแต่ละเป้าหมายภายใต้แท็บ Signing & Capabilities
Signing
ใช้ทีมนักพัฒนา Apple ของคุณเองและตัวระบุชุดข้อมูลApp Groups
เลือกกลุ่มแอพของคุณเองหากคุณต้องการทดสอบการจับภาพหน้าจอระดับอุปกรณ์แชร์ ดูการแบ่งปันเนื้อหาสำหรับรายละเอียดเพิ่มเติม อัปเดต URL เซิร์ฟเวอร์และภูมิภาค:
AppConfiguration.swift
ด้วย URL เซิร์ฟเวอร์และภูมิภาคของการสาธิตแบบไร้เซิร์ฟเวอร์ViewControllerObjC.h
พร้อม URL เซิร์ฟเวอร์และภูมิภาคของการสาธิตแบบไร้เซิร์ฟเวอร์ (ไม่บังคับ) อัปเดต broadcastBundleId
และ appGroupId
ในทั้ง AppConfiguration.swift
และ SampleHandler.swift
พร้อมกับ ID Bundle Bundle Bundle Bundle และ ID กลุ่มแอพหากคุณต้องการทดสอบการจับภาพหน้าจอระดับอุปกรณ์แชร์ ดูการแบ่งปันเนื้อหาสำหรับรายละเอียดเพิ่มเติม
เปิดไฟล์ AmazonChimeSDKDemo.xcworkspace
ใน AmazonChimeSDKDemo/
การใช้ XCode เลือก AmazonChimeSDKDemoPods
จากรายการแบบเลื่อนลงในแถบด้านบนของ XCode IDE เลือกอุปกรณ์สร้างและคลิกปุ่มเรียกใช้
เปิดไฟล์ AmazonChimeSDKDemo.xcworkspace
ใน AmazonChimeSDKDemo/
การใช้ XCODE เลือก AmazonChimeSDKDemo
จากรายการแบบเลื่อนลงในแถบด้านบนของ XCode IDE เลือกอุปกรณ์สร้างและคลิกปุ่มเรียกใช้
บนหน้าจอการเข้าร่วมเลือกที่จะเข้าร่วมการประชุมโดยไม่ต้อง CallKit
หรือเข้าร่วมผ่านการโทรเข้า/ออก CallKit
เนื่องจากแอพสาธิตไม่มีการแจ้งเตือนแบบพุชจึงทำให้การเข้าร่วมผ่านการโทรเข้ามา 10 วินาทีเพื่อให้ผู้ใช้มีเวลาพอที่จะพื้นหลังแอพหรือล็อคหน้าจอเพื่อเลียนแบบพฤติกรรม
หากคุณค้นพบปัญหาด้านความปลอดภัยที่อาจเกิดขึ้นในโครงการนี้เราขอให้คุณแจ้งความปลอดภัย AWS/Amazon ผ่านหน้ารายงานช่องโหว่ของเรา โปรด อย่า สร้างปัญหา GitHub สาธารณะ
คุณต้องเริ่มเซสชันการประชุมเพื่อเริ่มส่งและรับเสียง
meetingSession . audioVideo . start ( )
การกำหนดค่าเริ่มต้นคือ:
.outputOnly
หรือ .none
เพื่อหลีกเลี่ยงการอนุญาตการบันทึกเสียง) คุณสามารถระบุตัวเลือกที่ไม่ได้รับการป้องกันในการกำหนดค่า AudioVideoConfiguration
จากนั้นเริ่มการประชุม
var audioVideoConfig = AudioVideoConfiguration (
audioMode : . mono48k ,
audioDeviceCapabilities : . outputOnly ,
callKitEnabled : true ,
enableAudioRedundancy : false ,
reconnectTimeoutMs : 180 * 1000 )
meetingSession . audioVideo . start ( audioVideoConfiguration : audioVideoConfig )
หมายเหตุ: หากต้องการหลีกเลี่ยงเหตุการณ์ใด ๆ ให้เพิ่มผู้สังเกตการณ์ก่อนที่เซสชันจะเริ่มขึ้น คุณสามารถลบผู้สังเกตการณ์ได้โดยโทรไปที่การประชุม. audiovideo.removeaudiovideoobserver (ผู้สังเกตการณ์)
class MyAudioVideoObserver : AudioVideoObserver {
func audioSessionDidStartConnecting ( reconnecting : Bool ) {
if ( reconnecting ) {
// e.g. the network connection is dropped.
}
}
func audioSessionDidStart ( reconnecting : Bool ) {
// Meeting session starts.
// Can use realtime, devices APIs.
}
func audioSessionDidDrop ( ) { }
func audioSessionDidStopWithStatus ( sessionStatus : MeetingSessionStatus ) {
// See the "Stopping a session" section for details.
}
func audioSessionDidCancelReconnect ( ) { }
func connectionDidRecover ( ) { }
func connectionDidBecomePoor ( ) { }
func videoSessionDidStartConnecting ( ) { }
func videoSessionDidStartWithStatus ( sessionStatus : MeetingSessionStatus ) {
// Video session starts.
// Can use video APIs.
}
func videoSessionDidStopWithStatus ( sessionStatus : MeetingSessionStatus ) { }
meetingSession . audioVideo . addAudioVideoObserver ( observer : self )
}
รายการอุปกรณ์เสียงที่มีอยู่สำหรับการประชุม
// An list of MediaDevice objects
let audioDevices = meetingSession . audioVideo . listAudioDevices ( )
for device in audioDevices {
logger . info ( msg : " Device type: ( device . type ) , label: ( device . label ) " )
}
MediaDevice
หมายเหตุ: คุณควรเรียกสิ่งนี้หลังจากเริ่มต้นเซสชันหรือจะไม่เป็นไปได้ คุณควรโทรหา Chooseaudiodevice ด้วยหนึ่งในอุปกรณ์ที่ส่งคืนจาก listaudiodevices ()
let audioDevices = audioVideo . listAudioDevices ( )
val device = /* An item from audioDevices */
meetingSession . audioVideo . chooseAudioDevice ( mediaDevice : device )
หมายเหตุ: SwitchCamera () ไม่ได้ใช้ถ้าคุณใช้แหล่งถ่ายกล้องที่กำหนดเอง โปรดดูวิดีโอที่กำหนดเองสำหรับรายละเอียดเพิ่มเติม
สลับเพื่อใช้กล้องด้านหน้าหรือด้านหลังบนอุปกรณ์หากมี
meetingSession . audioVideo . switchCamera ( )
เพิ่ม DeviceChangeObserver
เพื่อรับการโทรกลับเมื่ออุปกรณ์เสียงใหม่เชื่อมต่อหรือเมื่ออุปกรณ์เสียงตัดการเชื่อมต่อ audioDeviceDidChange
มีรายการอุปกรณ์ที่ได้รับการปรับปรุง
class MyDeviceChangeObserver : DeviceChangeObserver {
func audioDeviceDidChange ( freshAudioDeviceList : [ MediaDevice ] ) {
// A list of updated MediaDevice objects
for device in freshAudioDeviceList {
logger . info ( msg : " Device type: ( device . type ) , label: ( device . label ) " )
}
}
meetingSession . audioVideo . addDeviceChangeObserver ( observer : self )
}
let activeAudioDevice = meetingSession . audioVideo . getActiveAudioDevice ( )
เมื่อเข้าร่วมการประชุม Mono/16KHz , Mono/48kHz และ สเตอริโอ/48kHz ได้รับการสนับสนุน สเตอริโอ/48kHz จะถูกตั้งค่าเป็นโหมดเสียงเริ่มต้นหากไม่ได้ระบุไว้อย่างชัดเจนเมื่อเริ่มต้นเซสชันเสียง
meetingSession . audioVideo . start ( ) // starts the audio video session with Stereo/48KHz audio, audio input and output devices enabled, callkit disabled, and audio redundancy enabled
meetingSession . audioVideo . start ( audioVideoConfiguration ) // starts the audio video session with the specified [AudioVideoConfiguration]
หมายเหตุ: จนถึงตอนนี้คุณได้เพิ่มผู้สังเกตการณ์เพื่อรับอุปกรณ์และเหตุการณ์วงจรชีวิตเซสชัน ในกรณีการใช้งานต่อไปนี้คุณจะใช้วิธี API แบบเรียลไทม์เพื่อส่งและรับตัวบ่งชี้ระดับเสียงและควบคุมสถานะปิดเสียง
let muted = meetingSession . audioVideo . realtimeLocalMute ( ) // returns true if muted, false if failed
let unmuted = meetingSession . audioVideo . realtimeLocalUnmute // returns true if unmuted, false if failed
คุณสามารถใช้สิ่งนี้เพื่อสร้างตัวบ่งชี้แบบเรียลไทม์ UI และรับการอัปเดตสำหรับการเปลี่ยนแปลงที่จัดส่งโดยอาร์เรย์
หมายเหตุ: การโทรกลับเหล่านี้จะรวมเฉพาะเดลต้าจากการโทรกลับก่อนหน้า
class MyRealtimeObserver : RealtimeObserver {
func volumeDidChange ( volumeUpdates : [ VolumeUpdate ] ) {
for currentVolumeUpdate in volumeUpdates {
// Muted, NotSpeaking, Low, Medium, High
logger . info ( msg : " ( currentVolumeUpdate . attendeeInfo . attendeeId ) 's volume changed: ( currentVolumeUpdate . volumeLevel ) " )
}
}
func signalStrengthDidChange ( signalUpdates : [ SignalUpdate ] ) {
for currentSignalUpdate in signalUpdates {
// None, Low, High
logger . info ( msg : " ( currentSignalUpdate . attendeeInfo . attendeeId ) 's signal strength changed: ( currentSignalUpdate . signalStrength ) " )
}
}
func attendeesDidJoin ( attendeeInfo : [ AttendeeInfo ] ) {
for currentAttendeeInfo in attendeeInfo {
logger . info ( msg : " ( currentAttendeeInfo . attendeeId ) joined the meeting " )
}
}
func attendeesDidLeave ( attendeeInfo : [ AttendeeInfo ] ) {
for currentAttendeeInfo in attendeeInfo {
logger . info ( msg : " ( currentAttendeeInfo . attendeeId ) left the meeting " )
}
}
func attendeesDidDrop ( attendeeInfo : [ AttendeeInfo ] ) {
for currentAttendeeInfo in attendeeInfo {
logger . info ( msg : " ( currentAttendeeInfo . attendeeId ) dropped from the meeting " )
}
}
func attendeesDidMute ( attendeeInfo : [ AttendeeInfo ] ) {
for currentAttendeeInfo in attendeeInfo {
logger . info ( msg : " ( currentAttendeeInfo . attendeeId ) muted " )
}
}
func attendeesDidUnmute ( attendeeInfo : [ AttendeeInfo ] ) {
for currentAttendeeInfo in attendeeInfo {
logger . info ( msg : " ( currentAttendeeInfo . attendeeId ) unmuted " )
}
}
meetingSession . audioVideo . addRealtimeObserver ( observer : self )
}
คุณสามารถใช้กิจกรรม activeSpeakerDidDetect
เพื่อขยายหรือเน้นวิดีโอกระเบื้องวิดีโอของลำโพงที่ใช้งานมากที่สุดหากมี ด้วยการตั้งค่า scoreCallbackIntervalMs
และการใช้งาน activeSpeakerScoreDidChange
คุณสามารถรับคะแนนของลำโพงที่ใช้งานอยู่เป็นระยะ
class MyActiveSpeakerObserver : ActiveSpeakerObserver {
let activeSpeakerObserverId = UUID ( ) . uuidString
var observerId : String {
return activeSpeakerObserverId
}
func activeSpeakerDidDetect ( attendeeInfo : [ AttendeeInfo ] ) {
if !attendeeInfo . isEmpty {
logger . info ( msg : " ( attendeeInfo [ 0 ] . attendeeId ) is the most active speaker " )
}
}
var scoresCallbackIntervalMs : Int {
return 1000 // 1 second
}
func activeSpeakerScoreDidChange ( scores : [ AttendeeInfo : Double ] ) {
let scoresInString = scores . map { ( score ) -> String in
let ( key , value ) = score
return " ( key . attendeeId ) : ( value ) "
} . joined ( separator : " , " )
logger . info ( msg : " Scores of active speakers are: ( scoresInString ) " )
}
// Calculating the active speaker base on the SDK provided policy, you can provide any custom algorithm
meetingSession . audioVideo . addActiveSpeakerObserver ( policy : DefaultActiveSpeakerPolicy ( ) , observer : self )
}
หมายเหตุ: คุณจะต้องผูกวิดีโอไปยัง
VideoRenderView
เพื่อแสดงวิดีโอสามารถระบุกระเบื้องวิดีโอท้องถิ่นโดยใช้คุณสมบัติ
isLocalTile
สามารถระบุกระเบื้องวิดีโอเนื้อหาโดยใช้คุณสมบัติ
isContent
ดูการแชร์หน้าจอและเนื้อหากระเบื้องถูกสร้างขึ้นด้วย ID กระเบื้องใหม่เมื่อผู้เข้าร่วมระยะไกลเดียวกันรีสตาร์ทวิดีโอ
คุณสามารถค้นหารายละเอียดเพิ่มเติมเกี่ยวกับการเพิ่ม/ลบ/ดูวิดีโอจากการสร้างแอปพลิเคชันการประชุมบน iOS โดยใช้ Amazon Chime SDK
คุณสามารถเรียก startRemoteVideo
เพื่อเริ่มรับวิดีโอระยะไกลเนื่องจากไม่ได้เกิดขึ้นตามค่าเริ่มต้น
meetingSession . audioVideo . startRemoteVideo ( )
stopRemoteVideo
หยุดรับวิดีโอระยะไกลและทริกเกอร์ onVideoTileRemoved
สำหรับวิดีโอระยะไกลที่มีอยู่
meetingSession . audioVideo . stopRemoteVideo ( )
class MyVideoTileObserver : VideoTileObserver {
func videoTileDidAdd ( tileState : VideoTileState ) {
// Ignore local video (see View local video), content video (see Screen and content share)
if tileState . isLocalTile || tileState . isContent {
return
}
let videoRenderView = /* a VideoRenderView object in your application to show the video */
meetingSession . audioVideo . bind ( videoView : videoRenderView , tileId : tileState . tileId )
}
func videoTileDidRemove ( tileState : VideoTileState ) {
// unbind video view to stop viewing the tile
meetingSession . audioVideo . unbindVideoView ( tileId : tileState . tileId )
}
meetingSession . audioVideo . addVideoTileObserver ( observer : self )
}
// Use internal camera capture for the local video
meetingSession . audioVideo . startLocalVideo ( )
// Use internal camera capture and set configuration for the video, e.g. simulcastEnabled, maxBitRateKbps
// If maxBitRateKbps is not set, it will be self adjusted depending on number of users and videos in the meeting
// This can be called multiple times to enable/disable simulcast and adjust video max bit rate on the fly
let localVideoConfig = LocalVideoConfiguration ( simulcastEnabled : true, maxBitRateKbps : 600 )
meetingSession . audioVideo . startLocalVideo ( config : localVideoConfig )
// You can switch camera to change the video input device
meetingSession . audioVideo . switchCamera ( )
// Or you can inject custom video source for local video, see custom video guide
meetingSession . audioVideo . stopLocalVideo ( )
หมายเหตุ: ควรทำวิดีโอในท้องถิ่น ตั้งค่า videorenderview.mirror = true
class MyVideoTileObserver : VideoTileObserver {
func videoTileDidAdd ( tileState : VideoTileState ) {
if tileState . isLocalTile {
let localVideoView = /* a VideoRenderView object in your application to show the video */
meetingSession . audioVideo . bind ( videoView : localVideoView , tileId : tileState . tileId )
}
}
}
func videoTileDidRemove ( tileState : VideoTileState ) {
// unbind video view to stop viewing the tile
meetingSession . audioVideo . unbindVideoView ( tileId : tileState . tileId )
}
meetingSession . audioVideo . addVideoTileObserver ( observer : self )
}
สำหรับการจัดการกระเบื้องวิดีโอขั้นสูงดูที่การแบ่งหน้าวิดีโอ
หมายเหตุ: เมื่อคุณหรือผู้เข้าร่วมประชุมอื่นแชร์เนื้อหา (เช่นการจับภาพหน้าจอหรือวัตถุวิดีโออื่น ๆ ) ผู้เข้าร่วมเนื้อหา (เนื้อหาผู้เข้าร่วมประชุม#ID) เข้าร่วมเซสชันและแชร์เนื้อหาราวกับว่าผู้เข้าร่วมประชุมทั่วไปแชร์วิดีโอ
ตัวอย่างเช่นรหัสผู้เข้าร่วมของคุณคือ "My-id" เมื่อคุณโทรไปที่
meetingSession.audioVideo.startContentShare
ผู้เข้าร่วมเนื้อหา "My-Id#เนื้อหา" จะเข้าร่วมเซสชันและแบ่งปันเนื้อหาของคุณ
class MyContentShareObserver : ContentShareObserver {
func contentShareDidStart ( ) {
logger . info ( msg : " Content Share has started " )
}
func contentShareDidStop ( status : ContentShareStatus ) {
logger . info ( msg : " Content Share has stopped " )
}
meetingSession . audioVideo . addContentShareObserver ( observer : self )
let contentShareSource = /* a ContentShareSource object, can use InAppScreenCaptureSource for screen share or any subclass with custom video source */
// ContentShareSource object is not managed by SDK, builders need to start, stop, release accordingly
meetingSession . audioVideo . startContentShare ( source : contentShareSource )
}
คุณสามารถตั้งค่าการกำหนดค่าสำหรับการแชร์เนื้อหาเช่น MaxBitrateKBPS คุณภาพที่เกิดขึ้นจริงอาจแตกต่างกันไปตามการโทรขึ้นอยู่กับระบบและเครือข่ายที่สามารถให้ได้
let contentShareConfig = LocalVideoConfiguration ( maxBitRateKbps : 200 )
meetingSession . audioVideo . startContentShare ( source : contentShareSource , config : contentShareConfig )
ดูการแบ่งปันเนื้อหาสำหรับรายละเอียดเพิ่มเติม
meetingSession . audioVideo . stopContentShare ( )
Chime SDK อนุญาตให้มีการแชร์เนื้อหาพร้อมกันสองรายการต่อการประชุม การแชร์เนื้อหาระยะไกลจะทริกเกอร์ onVideoTileAdded
ในขณะที่การแบ่งปันในท้องถิ่นจะไม่ หากต้องการแสดงวิดีโอเพื่อดูตัวอย่างให้เพิ่ม VideoSink
ลงใน VideoSource
ใน ContentShareSource
class MyVideoTileObserver : VideoTileObserver {
func videoTileDidAdd ( tileState : VideoTileState ) {
if ( tileState . isContent ) {
// tileState.attendeeId is formatted as "attendee-id#content"
let attendeeId = tileState . attendeeId
// Get the attendee ID from "attendee-id#content"
let baseAttendeeId = DefaultModality ( attendeeId ) . base ( )
logger . info ( msg : " $baseAttendeeId is sharing screen " )
let screenVideoView = /* a VideoRenderView object in your application to show the video */
meetingSession . audioVideo . bindVideoView ( videoView : screenVideoView , tileId : tileState . tileId )
}
}
func videoTileDidRemove ( tileState : VideoTileState ) {
meetingSession . audioVideo . unbindVideoView ( tileId : tileState . tileId )
}
meetingSession . audioVideo . addVideoTileObserver ( observer : self )
}
ดูที่ ObservableMetric
สำหรับตัวชี้วัดที่มีอยู่มากขึ้นและเพื่อตรวจสอบคุณภาพเสียงวิดีโอและคุณภาพการแบ่งปันเนื้อหา
class MyMetricsObserver : MetricsObserver {
func metricsDidReceive ( metrics : [ AnyHashable : Any ] ) {
logger . info ( msg : " Media metrics have been received: ( metrics ) " )
}
meetingSession . audioVideo . addMetricsObserver ( observer : self )
}
คุณสามารถรับข้อความแบบเรียลไทม์จากหลายหัวข้อหลังจากเริ่มการประชุม
class MyDataMessageObserver : DataMessageObserver {
let dataMessageTopic = " chat "
// A throttled message is returned by backend from local sender
func dataMessageDidReceived ( dataMessage : DataMessage ) {
logger . info ( msg : " ( dataMessage . timestampMs ) ( dataMessage . text ( ) ) ( dataMessage . senderAttendeeId ) " )
}
// You can also subscribe to multiple topics.
meetingSession . audioVideo . addRealtimeDataMessageObserver ( topic : dataMessageTopic , observer : self )
}
คุณสามารถส่งข้อความแบบเรียลไทม์ไปยังหัวข้อใดก็ได้ซึ่งผู้สังเกตการณ์ที่สมัครสมาชิกจะได้รับแจ้ง
หมายเหตุ: หัวข้อจะต้องเป็นอัลฟ่า-ตัวเลขและอาจรวมถึงยัติภังค์และขีดเส้นใต้ ข้อมูลต้องไม่เกิน 2KB และอายุการใช้งานเป็นตัวเลือก แต่เป็นจำนวนเต็มบวก
let dataMessageTopic = " chat "
let dataMessageLifetimeMs = 1000
do {
// Send "Hello Chime" to any subscribers who are listening to "chat" topic with 1 seconds of lifetime
try meetingSession
. audioVideo
. realtimeSendDataMessage ( topic : dataMessageTopic ,
data : " Hello Chime " ,
lifetimeMs : dataMessageLifetimeMs )
} catch let err as SendDataMessageError {
logger . error ( msg : " Failed to send message! ( err ) " )
} catch {
logger . error ( msg : " Unknown error ( error . localizedDescription ) " )
}
หมายเหตุ: ตรวจสอบให้แน่ใจว่าได้ลบผู้สังเกตการณ์ทั้งหมดและปล่อยทรัพยากรที่คุณเพิ่มเพื่อหลีกเลี่ยงการรั่วไหลของหน่วยความจำ
class MyAudioVideoObserver : AudioVideoObserver {
func audioSessionDidStopWithStatus ( sessionStatus : MeetingSessionStatus ) {
// This is where meeting ended.
// You can do some clean up work here.
}
func videoSessionDidStopWithStatus ( sessionStatus : MeetingSessionStatus ) {
// This will be invoked as well.
}
meetingSession . audioVideo . addAudioVideoObserver ( observer : self )
meetingSession . audioVideo . stop ( )
}
Amazon Voice Focus ช่วยลดเสียงรบกวนพื้นหลังในการประชุมเพื่อประสบการณ์การประชุมที่ดีขึ้น สำหรับรายละเอียดเพิ่มเติมดู Amazon Voice Focus
let enabled = audioVideo . realtimeSetVoiceFocusEnabled ( enabled : true ) // enabling Amazon Voice Focus successful
let disabled = audioVideo . realtimeSetVoiceFocusEnabled ( enabled : false ) // disabling Amazon Voice Focus successful
แหล่งวิดีโอที่กำหนดเองช่วยให้คุณสามารถควบคุมวิดีโอเช่นการใช้ตัวกรองวิดีโอ สำหรับรายละเอียดเพิ่มเติมดูวิดีโอที่กำหนดเอง
เริ่มต้นจากเวอร์ชัน 0.23.3 SDK เริ่มส่งข้อมูลเสียงซ้ำซ้อนไปยังเซิร์ฟเวอร์ของเราในการตรวจจับการสูญเสียแพ็กเก็ตเพื่อช่วยลดผลกระทบต่อคุณภาพเสียง แพ็คเก็ตเสียงซ้ำซ้อนจะถูกส่งออกไปสำหรับแพ็กเก็ตที่มีเสียงที่ใช้งานอยู่เช่นคำพูดหรือเพลง สิ่งนี้อาจเพิ่มแบนด์วิดท์ที่ใช้โดยเสียงมากถึง 3 เท่าของจำนวนปกติขึ้นอยู่กับปริมาณของการสูญเสียแพ็กเก็ตที่ตรวจพบ SDK จะหยุดส่งข้อมูลซ้ำซ้อนโดยอัตโนมัติหากไม่พบการสูญเสียแพ็กเก็ตใด ๆ เป็นเวลา 5 นาที
หากคุณต้องการปิดการใช้งานคุณสมบัตินี้คุณสามารถทำได้ผ่านการกำหนดค่า AudioVideOconfiguration ก่อนเริ่มเซสชัน
meetingSession . audioVideo . start ( AudioVideoConfiguration ( enableAudioRedundancy : false ) )
ในขณะที่มีตัวเลือกในการปิดใช้งานคุณสมบัติเราขอแนะนำให้เปิดใช้งานเพื่อปรับปรุงคุณภาพเสียง เหตุผลหนึ่งที่เป็นไปได้ที่จะปิดการใช้งานอาจเป็นเพราะลูกค้าของคุณมีข้อ จำกัด แบนด์วิดท์ที่เข้มงวดมาก
อ้างถึงคำถามที่พบบ่อยทั่วไปสำหรับ Amazon Chime SDK
แอปพลิเคชันสามารถรับบันทึกจาก CHIME SDK โดยผ่านอินสแตนซ์ของ Logger เมื่อสร้างการประชุม Amazon Chime SDK มีการใช้งานเครื่องบันทึกเริ่มต้นที่แอปพลิเคชันของคุณสามารถใช้งานได้เช่น consolelogger ซึ่งเข้าสู่คอนโซล ConsoleLogger
ถูกตั้งค่าเป็นระดับ INFO
เป็นค่าเริ่มต้น ดังนั้นเพื่อให้ได้บันทึกทั้งหมดรวมถึงบันทึกสื่อสร้าง logger โดยติดตาม:
logger = ConsoleLogger ( name : " logger " , level : . DEFAULT )
คุณและผู้ใช้ปลายทางของคุณต้องรับผิดชอบต่อเนื้อหาทั้งหมด (รวมถึงรูปภาพใด ๆ ) ที่อัปโหลดเพื่อใช้กับการเปลี่ยนพื้นหลังและต้องตรวจสอบให้แน่ใจว่าเนื้อหาดังกล่าวไม่ละเมิดกฎหมายละเมิดหรือใช้สิทธิของบุคคลที่สามหรือละเมิดคำที่เป็นสาระสำคัญ จากข้อตกลงของคุณกับ Amazon (รวมถึงเอกสารข้อกำหนดบริการ AWS หรือนโยบายการใช้งานที่ยอมรับได้)
Copyright Amazon.com, Inc. หรือ บริษัท ในเครือ สงวนลิขสิทธิ์