لوحة مشروع Amazon Chime SDK
ملاحظة: إذا كان بناء رمز مصدر SDK ، فإن فرع
development
يحتوي على تغييرات حافة النزيف التي قد لا تبني مع مكتبة وسائط التناغم المتاحة علنًا أو قد لا تكون مستقرة مثل الإصدارات العامة.
يجعل Amazon Chime SDK for iOS من السهل إضافة مكالمات الصوت التعاونية ومكالمات الفيديو ومشاركة الشاشة لتطبيقات iOS باستخدام نفس خدمات البنية التحتية التي تلتقطها اجتماعات الطاقة على خدمة الأمازون.
يعمل Amazon Chime SDK لأعمال iOS من خلال الاتصال بموارد جلسة الاجتماع التي قمت بإنشائها في حساب AWS الخاص بك. يحتوي SDK على كل ما تحتاجه لإنشاء تجارب مخصصة للاتصال والتعاون في تطبيق iOS الخاص بك ، بما في ذلك الأساليب إلى: تكوين جلسات الاجتماع ، وسرد الأجهزة الصوتية وتحديدها ، وتبديل أجهزة الفيديو ، وبدء وإيقاف عرض مشاركة الشاشة ، وتلقي عمليات الاسترجاع عند حدوث أحداث الوسائط مثل هذه مع تغير مستوى الصوت ، وإدارة ميزات الاجتماعات مثل روابط صوتية الصوت وبلاط الفيديو.
لدينا أيضًا لوحة مشروع Amazon Chime SDK حيث يمكنك العثور على طلبات المجتمع وأوضعها.
للبدء ، راجع الموارد التالية:
ومراجعة الأدلة التالية:
يمكنك دمج Amazon Chime SDK في مشروعك من SPM أو Cocoapods أو الثنائيات من خلال إصدار 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. إذا كنت لا تحتاج إلى وظائف مشاركة الفيديو والمحتوى ، أو دعم برامج ترميز الفيديو ، فيمكنك اختيار عدم استخدام برنامج Codecs SPM بدلاً من ذلك.
افتح مشروعك في Xcode
انتقل إلى ملف > حزم سويفت > إضافة تبعية الحزمة ...
في الحقل ، أدخل عنوان URL لمستودع الحزمة ، أدخل "https://github.com/aws/amazon-chime-sdk-ios-spm". لاستخدام وحدة الوسائط الترفيهية للفيديو بدلاً من ذلك ، أدخل "https://github.com/aws/amazon-chime-sdk-ios-no-video-codecs-spm".
أدخل أحدث إصدار (على سبيل المثال 0.23.1
) وانقر فوق التالي .
اختر الحزم لمشروعك وانقر فوق "إنهاء" . هناك حاجة إلى AmazonChimeSDK
و AmazonChimeSDKMedia
. تحقق من AmazonChimeSDKMachineLearning
إذا كنت ترغب في استخدام طمس الخلفية واستبدال الخلفية.
AmazonChimeSDK
و AmazonChimeSDKMedia
من الإصدار الأخير.AmazonChimeSDKMachineLearning
ثنائي. خلاف ذلك ، يمكنك تجاهل جميع الإشارات إلى 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
كنت تستخدم .framework
التقليدية ، حدد موقع AmazonChimeSDK.framework
.xcframework
AmazonChimeSDKMedia.framework
و AmazonChimeSDKMachineLearning.framework
من الخطوة 1. .xcframework
بدلاً من ذلك ، وهو متاح بعد Amazon Chime SDK IOS V0.15.0..xcframework
، حدد موقع AmazonChimeSDK.xcframework
و AmazonChimeSDKMedia.xcframework
و AmazonChimeSDKMachineLearning.xcframework
من الخطوة 1.AmazonChimeSDK.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
، قم بتشغيل الأمر التالي لتثبيت القرون:
$ pod install --repo-update
قم بتنزيل ثنائيات AmazonChimeSDKMedia
و AmazonChimeSDKMachineLearning
من أحدث إصدار.
unsip and copy AmazonChimeSDKMedia.xcframework
to amazon-chime-sdk-ios/AmazonChimeSDK
Folder ومجلد AmazonChimeSDKMachineLearning.xcframework
إلى amazon-chime-sdk-ios/AmazonChimeSDKDemo
.
نشر العرض التوضيحي بدون خادم من Amazon-Chime-SDK-JS
AmazonChimeDemoSDKBroadcast.appex
هو امتداد بث لمشاركة شاشة مستوى الجهاز المستخدمة من قبل AmazonChimesDkDemo ، تحقق من أن Embed without Signing
يتم تحديده تحت خيار Embed
. قم بإزالته من Frameworks, Libraries, and Embedded Content
إذا كنت لا ترغب في اختبار هذا. لكل هدف ، ضمن علامة التبويب Signing & Capabilities
،
Signing
، استخدم فريق Apple Developer الخاص بك ومعرف الحزمة.App Groups
، حدد مجموعات التطبيق الخاصة بك إذا كنت ترغب في اختبار التقاط شاشة مستوى الجهاز. انظر مشاركة المحتوى لمزيد من التفاصيل. تحديث عنوان URL والمنطقة الخادم:
AppConfiguration.swift
مع عنوان URL للخادم ومنطقة العرض التجريبي بدون خادم.ViewControllerObjC.h
مع عنوان URL للخادم ومنطقة العرض التجريبي بدون خادم. (اختياري) تحديث broadcastBundleId
و appGroupId
في كل من AppConfiguration.swift
و SampleHandler.swift
مع معرف حزمة تمديد عملية تحميل البث ومعرف مجموعة التطبيق إذا كنت ترغب في اختبار التقاط شاشة مستوى الجهاز. انظر مشاركة المحتوى لمزيد من التفاصيل.
افتح ملف AmazonChimeSDKDemo.xcworkspace
في AmazonChimeSDKDemo/
باستخدام Xcode ، حدد AmazonChimeSDKDemoPods
من قائمة المنسدلة في الشريط العلوي من Xcode IDE ، واختر جهاز بناء وانقر على زر التشغيل.
افتح ملف AmazonChimeSDKDemo.xcworkspace
في AmazonChimeSDKDemo/
باستخدام XCode ، حدد AmazonChimeSDKDemo
من قائمة المنسدلة المخطط في الشريط العلوي من XCode IDE ، واختر جهاز بناء وانقر فوق زر التشغيل.
على شاشة الانضمام ، اختر الانضمام إلى الاجتماع بدون CallKit
أو الانضمام عبر مكالمة CallKit
الواردة/الصادرة. نظرًا لأن التطبيق التجريبي لا يحتوي على إشعار بالدفع ، فإنه يتأخر الانضمام عبر المكالمة الواردة بنسبة 10 ثوانٍ لمنح المستخدم وقتًا كافيًا لخلفية التطبيق أو قفل الشاشة لتقليد السلوك.
إذا اكتشفت مشكلة أمان محتملة في هذا المشروع ، نطلب منك إخطار AWS/Amazon Security عبر صفحة الإبلاغ عن الضعف لدينا. من فضلك لا تنشئ قضية github العامة.
تحتاج إلى بدء جلسة الاجتماع لبدء إرسال واستلام الصوت.
meetingSession . audioVideo . start ( )
التكوينات الافتراضية هي:
.none
الميكروفون والمكبر صوت ، الأمر الذي يتطلب أذونات تسجيل الصوت (استخدام .outputOnly
يمكنك تحديد الخيارات غير الافتراضية في AudioVideoConfiguration
، ثم بدء جلسة الاجتماع.
var audioVideoConfig = AudioVideoConfiguration (
audioMode : . mono48k ,
audioDeviceCapabilities : . outputOnly ,
callKitEnabled : true ,
enableAudioRedundancy : false ,
reconnectTimeoutMs : 180 * 1000 )
meetingSession . audioVideo . start ( audioVideoConfiguration : audioVideoConfig )
ملاحظة: لتجنب فقدان أي أحداث ، أضف مراقبًا قبل بدء الجلسة. يمكنك إزالة المراقب عن طريق استدعاء Meetingsession.Audiovideo.removeaudiovideoObserver (Observer).
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 و Stereo/48khz . سيتم تعيين ستيريو/48 كيلو هرتز كوضع الصوت الافتراضي إذا لم يتم تحديده بشكل صريح عند بدء جلسة الصوت.
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
يمكنك استخدام هذا لبناء واجهة مستخدم مؤشرات في الوقت الفعلي وتحديثها للتغييرات التي ألقاها الصفيف.
ملاحظة: ستتضمن عمليات الاسترجاعات هذه الدلتا فقط من رد الاتصال السابق.
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
. انظر مشاركة الشاشة والمحتوى.يتم إنشاء بلاط مع معرف بلاط جديد عندما يعيد الحضور عن بُعد نفس الفيديو.
يمكنك العثور على مزيد من التفاصيل حول إضافة/إزالة/عرض الفيديو من إنشاء تطبيق اجتماع على 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 = صحيح
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 )
}
للحصول على مزيد من إدارة بلاط الفيديو ، ألقِ نظرة على تراجع الفيديو.
ملاحظة: عندما تشارك أنت أو الحاضرين الآخرين المحتوى (مثل التقاط الشاشة أو أي كائن مقاطع فيديو أخرى) ، ينضم حاضر المحتوى (محتوى الحضور#) إلى الجلسة ويشارك المحتوى كما لو كان الحاضر العادي يشارك مقطع فيديو.
على سبيل المثال ، معرف الحضور الخاص بك هو "my-id". عندما تتصل بـ
meetingSession.audioVideo.startContentShare
، سينضم حاضر المحتوى "My-id#content" إلى الجلسة ومشاركة المحتوى الخاص بك.
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 )
}
يمكنك إرسال رسالة في الوقت الفعلي إلى أي موضوع ، سيتم إخطار المراقبين المشتركين به.
ملاحظة: يجب أن يكون الموضوع غير رقمي ألفا رقمي ويمكن أن يشمل الواصلة والرسومات السفلية. لا يمكن أن تتجاوز البيانات 2 كيلو بايت وعمرها اختياري ولكن عدد صحيح إيجابي.
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.
يمكن للتطبيقات الحصول على سجلات من SDK Chime عن طريق تمرير مثيلات من المسجل عند إنشاء اجتماعات. لدى Amazon Chime SDK بعض التطبيقات الافتراضية للمسجل الذي يمكن أن يستخدمه التطبيق الخاص بك ، مثل Consomelogger الذي يقوم بتسجيل الدخول إلى وحدة التحكم. تم تعيين ConsoleLogger
على مستوى INFO
كما الافتراضي. لذلك ، من أجل الحصول على جميع السجلات ، بما في ذلك سجلات الوسائط ، قم بإنشاء مسجل بالمتابعة:
logger = ConsoleLogger ( name : " logger " , level : . DEFAULT )
أنت ومستخدميك النهائيون مسؤولون عن جميع المحتوى (بما في ذلك أي صور) تم تحميله للاستخدام مع استبدال الخلفية ، ويجب أن تتأكد من اتفاقك مع Amazon (بما في ذلك الوثائق أو شروط خدمة AWS أو سياسة الاستخدام المقبولة).
حقوق الطبع والنشر Amazon.com ، Inc. أو الشركات التابعة لها. جميع الحقوق محفوظة.