لوحة مشروع Amazon Chime SDK
ملاحظة: إذا كان بناء رمز مصدر SDK ، فإن فرع
development
يحتوي على تغييرات حافة النزيف التي قد لا تبني مع مكتبة وسائط التناغم المتاحة علنًا أو قد لا تكون مستقرة مثل الإصدارات العامة.
يجعل Amazon Chime SDK for Android من السهل إضافة مكالمات الصوت التعاونية ، ومكالمات الفيديو ، وميزات المشاركة على شاشة لتطبيقات Android باستخدام نفس خدمات البنية التحتية التي تجمعها اجتماعات الأمازون.
يعمل Amazon Chime SDK لأعمال Android من خلال الاتصال بموارد جلسة الاجتماع التي قمت بإنشائها في حساب AWS الخاص بك. يحتوي SDK على كل ما تحتاجه لإنشاء تجارب مخصصة للاتصال والتعاون في تطبيق Android الخاص بك ، بما في ذلك الأساليب إلى: تكوين جلسات الاجتماع ، وسرد الأجهزة الصوتية وتحديدها ، وتبديل أجهزة الفيديو ، وبدء وإيقاف عرض مشاركة الشاشة ، وتلقي عمليات الاسترداد عند حدوث أحداث الوسائط مثل هذه مع تغير مستوى الصوت ، وإدارة ميزات الاجتماعات مثل روابط صوتية الصوت وبلاط الفيديو.
لدينا أيضًا لوحة مشروع Amazon Chime SDK حيث يمكنك العثور على طلبات المجتمع وأوضعها.
للبدء ، راجع الموارد التالية:
ومراجعة الأدلة التالية:
ملاحظة: إذا كنت ترغب فقط في تشغيل التطبيق التجريبي ، تخطي لتشغيل التطبيق التجريبي
يمكن تنزيل SDKs للهاتف المحمول لنظام Android من مستودع Maven Central ، بواسطة دمج في ملفات Gradle الخاصة بمشروع Android ، أو يمكنك تضمينك مباشرة عبر ملفات .Aar.
لغرض الإعداد ، سيتم الإشارة إلى مجلد الجذر لمشروعك باسم root
.
للحصول على التبعيات من Maven ، أضف التبعيات إلى build.gradle
.
تحديث build.gradle
في root/app
وأضف ما يلي ضمن dependencies
:
dependencies {
implementation 'software.aws.chimesdk:amazon-chime-sdk-media:$MEDIA_VERSION'
implementation 'software.aws.chimesdk:amazon-chime-sdk:$SDK_VERSION'
}
يمكن الحصول على أرقام الإصدار من أحدث إصدار.
إذا لم تكن بحاجة إلى وظائف مشاركة الفيديو والمحتوى ، أو دعم برامج ترميز الفيديو ، فيمكنك استخدام amazon-chime-sdk-media-no-video-codecs
بدلاً من ذلك لتقليل الحجم. استبعاد استخدام الوحدة amazon-chime-sdk-media
و/أو amazon-chime-sdk-machine-learning
من التبعية المتعدية لـ amazon-chime-sdk
:
dependencies {
implementation 'software.aws.chimesdk:amazon-chime-sdk-media-no-video-codecs:$MEDIA_VERSION'
implementation ('software.aws.chimesdk:amazon-chime-sdk:$MEDIA_VERSION') {
exclude module: 'amazon-chime-sdk-media'
exclude module: 'amazon-chime-sdk-machine-learning'
}
}
يمكن للمشاريع الآن إنشاء أهداف ARM و X86 ، والتي قد تكون مفيدة إذا تجميع التطبيق. لن تعمل أهداف x86 ولا تهدف إلى تثبيتها أو تشغيلها على أي جهاز أو محاكي x86. هام: يتم دعم أجهزة الذراع فقط.
إذا كنت بحاجة إلى كعب X86 غير وظيفي في وسائل الإعلام الثنائية من أجل تجميع التطبيق الخاص بك ، فيمكنك إلحاق -x86-stub
إلى تبعية الوسائط التي اخترتها. على سبيل المثال:
dependencies {
implementation 'software.aws.chimesdk:amazon-chime-sdk-media-no-video-codecs-x86-stub:$MEDIA_VERSION'
implementation ('software.aws.chimesdk:amazon-chime-sdk:$MEDIA_VERSION') {
exclude module: 'amazon-chime-sdk-media'
exclude module: 'amazon-chime-sdk-machine-learning'
}
}
لتضمين ثنائيات SDK في مشروعك ، اتبع هذه الخطوات.
قم بتنزيل ثنائيات الوسائط amazon-chime-sdk
و amazon-chime-sdk-media
من أحدث إصدار.
إذا كنت ترغب في استخدام المزيد من ميزات التعلم الآلي ، على سبيل المثال ، قم بتشويش الخلفية/الاستبدال ، قم أيضًا بتنزيل ثنائي علم amazon-chime-sdk-machine-learning
من أحدث إصدار. خلاف ذلك ، يمكنك تجاهل جميع الإشارات إلى amazon-chime-sdk-machine-learning
في التعليمات أدناه.
إذا لم تكن بحاجة إلى وظائف مشاركة الفيديو والمحتوى ، أو دعم برامج ترميز الفيديو ، فيمكنك استخدام amazon-chime-sdk-media-no-video-codecs
بدلاً من amazon-chime-sdk-media
لاستبعاد دعم برامج ترميز الفيديو والبرنامج تقليل الحجم. إذا قمت بذلك ، فيمكنك التعامل مع جميع الإشارات إلى amazon-chime-sdk-media
باسم amazon-chime-sdk-media-no-video-codecs
في التعليمات أدناه.
يمكن للمشاريع الآن إنشاء أهداف ARM و X86 ، والتي قد تكون مفيدة إذا تجميع التطبيق. لن تعمل أهداف x86 ولا تهدف إلى تثبيتها أو تشغيلها على أي جهاز أو محاكي x86. هام: يتم دعم أجهزة الذراع فقط.
إذا كنت بحاجة إلى Stubs X86 غير وظيفي مع بنية ذراع تعمل بكامل طاقتها من أجل تجميع التطبيق الخاص بك ، فيمكنك استخدام amazon-chime-sdk-media-x86-stub
أو amazon-chime-sdk-media-no-video-codecs-x86-stub
Media Binaries واستبدلها بمراجع amazon-chime-sdk-media
في التعليمات أدناه.
ملاحظة: نحن لا ندعم خلط الثنائيات ومطابقة من الإصدارات المختلفة.
قم بفك ضغطهم ونسخ ملفات AAR إلى root/app/libs
تحديث build.gradle
في root
عن طريق إضافة ما يلي تحت repositories
في allprojects
:
allprojects {
repositories {
jcenter()
flatDir {
dirs 'libs'
}
}
}
تحديث build.gradle
في root/app
وأضف ما يلي ضمن dependencies
:
implementation(name: 'amazon-chime-sdk', ext: 'aar')
implementation(name: 'amazon-chime-sdk-media', ext: 'aar')
إذا كنت تستخدم مكتبة amazon-chime-sdk-machine-learning
، فقم بإضافة عبارة أدناه أيضًا تحت dependencies
:
implementation(name: 'amazon-chime-sdk-machine-learning', ext: 'aar')
تحديث build.gradle
في root/app
ضمن compileOptions
:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
ملاحظة: هذا فقط لتشغيل التطبيق التجريبي واستخدام SDK كرمز بدلاً من مكتبة AAR.
لتشغيل التطبيق التجريبي ، اتبع هذه الخطوات.
ملاحظة: يرجى التأكد من قيامك بتشغيل الأجهزة المدعومة من ARM (الأجهزة الحقيقية) أو Simulator مع دعم ARM. نحن لا ندعم X86 حاليًا ، لذا فإن أجهزة المحاكاة مع X86 لن تعمل.
نشر العرض التوضيحي بدون خادم من Amazon-Chime-SDK-JS ، والذي يعيد https://xxxxx.xxxxx.xxx.com/Prod/
قدم https://xxxxx.xxxxx.xxx.com/Prod/
لتطبيق تجريبي للجوال.
قم بتنزيل amazon-chime-sdk-media
Binary من أحدث إصدار.
قم بتنزيل amazon-chime-sdk-machine-learning
Binary لميزات التعلم الآلي.
قم بفك ضغط ملفات AAR ونسخها إلى amazon-chime-sdk-android/amazon-chime-sdk/libs
تحديث test_url
في strings.xml
في المسار amazon-chime-sdk-android/app/src/main/res/values
مع عنوان URL الخاص بالتوضيح الخادم الذي تم نشره في الخطوة 1.
ملاحظة: استخدم
https://xxxxx.xxxxx.xxx.com/Prod/
إذا اكتشفت مشكلة أمان محتملة في هذا المشروع ، نطلب منك إخطار AWS/Amazon Security عبر صفحة الإبلاغ عن الضعف لدينا. من فضلك لا تنشئ قضية github العامة.
تحتاج إلى بدء جلسة الاجتماع لبدء إرسال واستلام الصوت.
ابدأ جلسة مع التكوينات الافتراضية:
meetingSession.audioVideo.start()
ابدأ جلسة مع تكوينات مخصصة:
meetingSession.audioVideo.start(audioVideoConfiguration)
هذه التكوينات متوفرة في audioVideoConfiguration
:
audioMode
audioDeviceCapabilities
audioStreamType
audioRecordingPresetOverride
enableAudioRedundancy
reconnectTimeoutMs
AudioMode: تنسيق الصوت الافتراضي هو ستيريو/48 كيلو هرتز أي صوت ستيريو مع معدل أخذ العينات 48 كيلو هرتز (Steroo48k). تشمل تنسيقات الصوت المدعومة الأخرى أحادي/48 كيلو هرتز (Mono48k) أو Mono/16khz (Mono16k). يمكنك تحديد وضع الصوت غير الافتراضي في AudioVideoConfiguration
، ثم بدء جلسة الاجتماع.
AudiodeVicEcapabilities: يتم تمكين إمكانيات جهاز الصوت الافتراضية على كل من أجهزة الإدخال والإخراج الصوتي ( InputAndOutput
) ، أي يتم تمكين كل من الميكروفون والمكبر. سيتطلب InputAndOutput
MODIFY_AUDIO_SETTINGS
و RECORD_AUDIO
أذونات. الخيارات الأخرى هي OutputOnly
(تعطيل الميكروفون وتمكين مكبر الصوت ؛ يتطلب إذن MODIFY_AUDIO_SETTINGS
) None
(كل من الميكروفون والمعطين المعاقين ؛ لا يتطلب أي أذونات صوتية).
AudioStreamType: القيمة الافتراضية هي VoiceCall
. الخيارات المتاحة هي VoiceCall
Music
، فهي مكافئة لـ STREAM_VOICE_CALL
و STREAM_MUSIC
على التوالي في Audiomanager. هذا التكوين مخصص لمعالجة مشكلة حجم الصوت في Oculus Quest 2. إذا كنت لا تعرف ما هو ، فربما لا داعي للقلق بشأنه. لمزيد من المعلومات ، يرجى الرجوع إلى وثائق Android: Stream_Voice_Call ، Stream_Music.
ملاحظة: على الرغم من وجود المزيد من خيارات الدفق المتاحة في Android ، يتم دعم STREM_VOICE_CALL و Stream_MUSIC حاليًا فقط في Amazon Chime SDK لنظام Android.
AudiorEcordingPreSetoverRide: القيمة الافتراضية هي None
. الخيارات المتاحة هي None
، Generic
، Camcorder
، VoiceRecognition
و VoiceCommunication
. هذه تعادل الخيارات المذكورة هنا تحت تكوين Android AudioreCorder .
التمكين الواسعة: القيمة الافتراضية صحيحة. عند التمكين ، سترسل SDK بيانات صوتية زائدة عن الحاجة حول اكتشاف فقدان الحزم للمساعدة في تقليل تأثيراتها على جودة الصوت. يمكن العثور على مزيد من التفاصيل في قسم الصوت الزائد .
ReconnectTimeOutMs: القيمة الافتراضية هي 180،000 مللي ثانية. استخدم هذا التكوين للتحكم في مهلة إعادة توصيل الجلسة بسبب ضعف حالة الشبكة.
ملاحظة: لتجنب فقدان أي أحداث ، أضف مراقبًا قبل بدء الجلسة. يمكنك إزالة المراقب عن طريق استدعاء Meetingsession.Audiovideo.removeaudiovideoObserver (Observer).
val observer = object : AudioVideoObserver {
override fun onAudioSessionStartedConnecting ( reconnecting : Boolean ) {
if (reconnecting) {
// e.g. the network connection is dropped
}
}
override fun onAudioSessionStarted ( reconnecting : Boolean ) {
// Meeting session starts.
// Can use realtime, devices APIs.
}
override fun onAudioSessionDropped ( reconnecting : Boolean ) {}
override fun onAudioSessionStopped ( sessionStatus : MeetingSessionStatus ) {
// See the "Stopping a session" section for details.
}
override fun onAudioSessionCancelledReconnect () {}
override fun onConnectionRecovered () {}
override fun onConnectionBecamePoor () {}
override fun onVideoSessionStartedConnecting () {}
override fun onVideoSessionStarted ( sessionStatus : MeetingSessionStatus ) {
// Video session starts.
// Can use video APIs.
}
override fun onVideoSessionStopped ( sessionStatus : MeetingSessionStatus ) {}
}
meetingSession.audioVideo.addAudioVideoObserver(observer)
قائمة الأجهزة الصوتية المتاحة للاجتماع.
val audioDevices = meetingSession.audioVideo.listAudioDevices()
// A list of MediaDevice objects
audioDevices.forEach {
logger.info( TAG , " Device type: ${it.type} , label: ${it.label} " )
}
MediaDevice
.ملاحظة: يجب عليك الاتصال بـ chooseaudiodevice بعد بدء الجلسة ، أو ستكون غير محدودة. يجب عليك أيضًا استدعاء chooseaudiodevice مع أحد الأجهزة التي يتم إرجاعها من Listaudiodevices.
// Filter out OTHER type which is currently not supported for selection
val audioDevices = meetingSession.audioVideo.listAudioDevices().filter {
it.type != MediaDeviceType . OTHER )
}
val device = /* An item from audioDevices */
meetingSession.audioVideo.chooseAudioDevice(device)
ملاحظة: SwitchCamera () هو عدم وجود OP إذا كنت تستخدم مصدرًا مخصصًا لالتقاط الكاميرا. يرجى الرجوع إلى الفيديو المخصص لمزيد من التفاصيل.
قم بالتبديل بين الكاميرا الأمامية أو الخلفية على الجهاز ، إذا كان ذلك متاحًا.
meetingSession.audioVideo.switchCamera()
أضف DeviceChangeObserver
لتلقي رد اتصال عند توصيل جهاز صوتي جديد أو عند فصل جهاز الصوت. يتضمن onAudioDeviceChanged
قائمة أجهزة محدثة.
val observer = object : DeviceChangeObserver {
override fun onAudioDeviceChanged ( freshAudioDeviceList : List < MediaDevice >) {
// A list of updated MediaDevice objects
freshAudioDeviceList.forEach {
logger.info( TAG , " Device type: ${it.type} , label: ${it.label} " )
}
}
}
meetingSession.audioVideo.addDeviceChangeObserver(observer)
ملاحظة: يتطلب
getActiveAudioDevice
API مستوى API 24 أو أعلى.
if ( Build . VERSION . SDK_INT >= Build . VERSION_CODES . N ) {
val activeAudioDevice = meetingSession.audioVideo.getActiveAudioDevice()
}
بالنسبة لمستويات API المنخفضة ، يمكن للبنائين تحقيق الشيء نفسه من خلال تتبع الجهاز المحدد مع المنطق التالي:
var activeAudioDevice : MediaDevice ? = null
override fun onAudioDeviceChanged ( freshAudioDeviceList : List < MediaDevice >) {
val device = /* An item from freshAudioDeviceList */
meetingSession.audioVideo.chooseAudioDevice(device)
activeAudioDevice = device // Update current device
}
عند الانضمام إلى اجتماع ، سيكون لكل تكوين افتراضي إذا لم يتم تحديده بشكل صريح عند بدء جلسة الصوت.
- خيارات AudioMode المدعومة: Mono/16khz ، Mono/48khz ، و Stereo/48khz . الافتراضي هو ستيريو/48 كيلو هرتز .
- خيارات AudiodeViceCapabilities المدعومة: الإدخال والإخراج ، والإخراج فقط ، وليس . الافتراضي هو الإدخال والإخراج .
- خيارات AudioStreamType المدعومة: VoiceCall والموسيقى . الافتراضي هو VoicEcall
- خيارات AudiorEcordingPreSetoverride المدعومة: لا شيء ، عام ، كاميرا الفيديو ، VoicerEcognition و VoicEcommunication . الافتراضي هو لا شيء .
- خيارات التمكين المدعومة: صواب وكاذب . الافتراضي صحيح .
- قيم ReconnectTimeOutMs المدعومة: الأعداد الصحيحة أكبر من أو تساوي 0. الافتراضي هو 180،000 .
meetingSession.audioVideo.start() // starts the audio video session with defaults mentioned above
meetingSession.audioVideo.start(audioVideoConfiguration) // starts the audio video session with the specified [AudioVideoConfiguration]
ملاحظة: حتى الآن ، أضفت المراقبين لتلقي أحداث دورة حياة الجهاز والجلسة. في حالات الاستخدام التالية ، ستستخدم أساليب API في الوقت الفعلي لإرسال واستقبال مؤشرات وحدة التخزين وحالة الكتم التحكم.
val muted = meetingSession.audioVideo.realtimeLocalMute() // returns true if muted, false if failed
val unmuted = meetingSession.audioVideo.realtimeLocalUnmute() // returns true if unmuted, false if failed
يمكنك استخدام هذا لبناء واجهة مستخدم مؤشرات في الوقت الفعلي وتحديثها للتغييرات التي ألقاها الصفيف.
ملاحظة: ستتضمن عمليات الاسترجاعات هذه الدلتا فقط من رد الاتصال السابق.
val observer = object : RealtimeObserver {
override fun onVolumeChanged ( volumeUpdates : Array < VolumeUpdate >) {
volumeUpdates.forEach { (attendeeInfo, volumeLevel) ->
logger.info( TAG , " ${attendeeInfo.attendeeId} 's volume changed: " +
$volumeLevel // Muted, NotSpeaking, Low, Medium, High
)
}
}
override fun onSignalStrengthChanged ( signalUpdates : Array < SignalUpdate >) {
signalUpdates.forEach { (attendeeInfo, signalStrength) ->
logger.info( TAG , " ${attendeeInfo.attendeeId} 's signal strength changed: " +
$signalStrength // None, Low, High
)
}
}
override fun onAttendeesJoined ( attendeeInfo : Array < AttendeeInfo >) {
attendeeInfo.forEach { logger.info( TAG , " ${attendeeInfo.attendeeId} joined the meeting " ) }
}
override fun onAttendeesLeft ( attendeeInfo : Array < AttendeeInfo >) {
attendeeInfo.forEach { logger.info( TAG , " ${attendeeInfo.attendeeId} left the meeting " ) }
}
override fun onAttendeesDropped ( attendeeInfo : Array < AttendeeInfo >) {
attendeeInfo.forEach { logger.info( TAG , " ${attendeeInfo.attendeeId} dropped from the meeting " ) }
}
override fun onAttendeesMuted ( attendeeInfo : Array < AttendeeInfo >) {
attendeeInfo.forEach { logger.info( TAG , " ${attendeeInfo.attendeeId} muted " ) }
}
override fun onAttendeesUnmuted ( attendeeInfo : Array < AttendeeInfo >) {
attendeeInfo.forEach { logger.info( TAG , " ${attendeeInfo.attendeeId} unmuted " ) }
}
}
meetingSession.audioVideo.addRealtimeObserver(observer)
يمكنك استخدام حدث onActiveSpeakerDetected
لتكبير أو التأكيد على بلاط الفيديو الأكثر نشاطًا إذا كان ذلك متاحًا. من خلال تعيين scoreCallbackIntervalMs
وتنفيذ onActiveSpeakerScoreChanged
، يمكنك تلقي عشرات السماعات النشطة بشكل دوري.
val observer = object : ActiveSpeakerObserver {
override fun onActiveSpeakerDetected ( attendeeInfo : Array < AttendeeInfo >) {
if (attendeeInfo.isNotEmpty()) {
logger.info( TAG , " ${attendeeInfo[ 0 ].attendeeId} is the most active speaker " )
}
}
// Set to receive onActiveSpeakerScoreChanged event at interval of 1s
override val scoreCallbackIntervalMs : Int? get() = 1000
override fun onActiveSpeakerScoreChanged ( scores : Map < AttendeeInfo , Double >) {
val scoreString = scores.map { entry -> " ${entry.key.attendeeId} : ${entry.value} " }.joinToString( " , " )
logger.info( TAG , " Scores of active speakers are: $scoreString " )
}
}
// Calculating the active speaker base on the SDK provided policy, you can provide any custom algorithm
meetingSession.audioVideo.addActiveSpeakerObserver( DefaultActiveSpeakerPolicy (), observer)
ملاحظة: ستحتاج إلى ربط الفيديو بـ
VideoRenderView
لتقديمه.يمكن التعرف على بلاط الفيديو المحلي باستخدام خاصية
isLocalTile
.يمكن التعرف على بلاط فيديو المحتوى باستخدام خاصية
isContent
. انظر مشاركة الشاشة والمحتوى.يتم إنشاء بلاط مع معرف بلاط جديد عندما يعيد الحضور عن بُعد نفس الفيديو.
يمكنك العثور على مزيد من التفاصيل حول إضافة/إزالة/عرض الفيديو من إنشاء تطبيق اجتماع على Android باستخدام Amazon Chime SDK.
يمكنك الاتصال بـ startRemoteVideo
لبدء استلام مقاطع الفيديو عن بُعد ، لأن هذا لا يحدث افتراضيًا.
meetingSession.audioVideo.startRemoteVideo()
يتوقف stopRemoteVideo
عن تلقي مقاطع الفيديو عن بُعد ومشغلات onVideoTileRemoved
لمقاطع الفيديو عن بُعد الحالية.
meetingSession.audioVideo.stopRemoteVideo()
val observer = object : VideoTileObserver {
override fun onVideoTileAdded ( tileState : VideoTileState ) {
// Ignore local video (see View local video), content video (seeScreen and content share)
if (tileState.isLocalTile || tileState.isContent) return
val videoRenderView = /* a VideoRenderView object in your application to show the video */
meetingSession.audioVideo.bindVideoView(videoRenderView, tileState.tileId)
}
override onVideoTileRemoved(tileState : VideoTileState ) {
// unbind video view to stop viewing the tile
audioVideo.unbindVideoView(tileState.tileId)
}
}
meetingSession.audioVideo.addVideoTileObserver(observer)
للحصول على مزيد من إدارة بلاط الفيديو ، ألقِ نظرة على تراجع الفيديو.
// Use internal camera capture for the local video
meetingSession.audioVideo.startLocalVideo()
// Use internal camera capture and set configuration for the video, e.g. 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 dynamically adjust video configuration
val localVideoConfig = LocalVideoConfiguration ( 600 )
meetingSession.audioVideo.startLocalVideo(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()
val observer = object : VideoTileObserver {
override fun onVideoTileAdded ( tileState : VideoTileState ) {
// onVideoTileAdded is called after startLocalVideo
val localVideoRenderView = /* a VideoRenderView object to show local video */
if (tileState.isLocalTile) {
audioVideo.bindVideoView(localVideoRenderView, tileState.tileId)
}
}
override onVideoTileRemoved(tileState : VideoTileState ) {
// onVideoTileRemoved is called after stopLocalVideo
if (tileState.isLocalTile) {
logger.info( TAG , " Local video is removed " )
audioVideo.unbindVideoView(tileState.tileId)
}
}
}
meetingSession.audioVideo.addVideoTileObserver(observer)
ملاحظة: عندما تشارك أنت أو الحاضرين الآخرين المحتوى (على سبيل المثال ، التقاط الشاشة أو أي كائن مقاطع فيديو أخرى) ، ينضم حاضر المحتوى (محتوى الحضور#) إلى الجلسة وتبادل المحتوى كما لو كان الحاضر العادي يشارك مقطع فيديو.
على سبيل المثال ، معرف الحضور الخاص بك هو "my-id". عندما تتصل بـ
meetingSession.audioVideo.startContentShare
، سينضم حاضر المحتوى "My-id#content" إلى الجلسة ومشاركة المحتوى الخاص بك.
val observer = object : ContentShareObserver {
override fun onContentShareStarted () {
logger.info( TAG , " Content share started " )
}
override fun onContentShareStopped ( status : ContentShareStatus ) {
logger.info( TAG , " Content share stopped with status ${status.statusCode} " )
}
}
meetingSession.audioVideo.addContentShareObserver(observer)
val contentShareSource = /* a ContentShareSource object, can use DefaultScreenCaptureSource 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(contentShareSource)
يمكنك تعيين التكوين لمشاركة المحتوى ، على سبيل المثال maxbitratekbps. قد تختلف الجودة الفعلية المحققة خلال المكالمة اعتمادًا على النظام والشبكة التي يمكن أن توفرها.
val contentShareConfig = LocalVideoConfiguration ( 200 )
meetingSession.audioVideo.startContentShare(contentShareSource, contentShareConfig)
انظر مشاركة المحتوى لمزيد من التفاصيل.
meetingSession.audioVideo.stopContentShare()
يسمح Chime SDK بحمل محتوى متزامن لكل اجتماع. سوف تؤدي أسهم المحتوى عن بُعد إلى ظهور onVideoTileAdded
، في حين أن المشاركة المحلية لن. لتقديم مقطع الفيديو للمعاينة ، أضف VideoSink
إلى VideoSource
في ContentShareSource
.
val observer = object : VideoTileObserver {
override fun onVideoTileAdded ( tileState : VideoTileState ) {
if (tileState.isContent) {
// tileState.attendeeId is formatted as "attendee-id#content"
val attendeeId = tileState.attendeeId
// Get the attendee ID from "attendee-id#content"
val baseAttendeeId = DefaultModality (attendeeId).base()
logger.info( TAG , " $baseAttendeeId is sharing screen " )
val contentVideoRenderView = /* a VideoRenderView object in your application to show the content video */
meetingSession.audioVideo.bindVideoView(contentVideoRenderView, tileState.tileId)
}
}
override onVideoTileRemoved(tileState : VideoTileState ) {
// unbind video view to stop viewing the tile
meetingSession.audioVideo.unbindVideoView(tileId)
}
}
meetingSession.audioVideo.addVideoTileObserver(observer)
انظر ObservableMetric
للحصول على مزيد من المقاييس المتاحة ومراقبة جودة الصوت والفيديو والمحتوى.
val observer = object : MetricsObserver {
override fun onMetricsReceived ( metrics : Map < ObservableMetric , Any >) {
metrics.forEach { (metricsName, metricsValue) ->
logger.info( TAG , " $metricsName : $metricsValue " )
}
}
}
meetingSession.audioVideo.addMetricsObserver(observer)
يمكنك تلقي رسائل في الوقت الفعلي من مواضيع متعددة بعد بدء جلسة الاجتماع.
ملاحظة: لن تؤدي رسائل البيانات المرسلة من المشارك المحلي إلى تشغيل رد الاتصال هذا ما لم يتم اختناقه.
val YOUR_ATTENDEE_ID = meetingSession.configuration.credentials.attendeeId
val observer = object : DataMessageObserver {
override fun onDataMessageReceived ( dataMessage : DataMessage ) {
// A throttled message is returned by backend
if ( ! dataMessage.throttled) {
logger.info( TAG , " [ ${dataMessage.timestampMs} ][{ $dataMessage .senderAttendeeId}] : ${dataMessage.text()} " )
}
}
// You can subscribe to multiple topics.
const val DATA_MESSAGE_TOPIC = " chat "
meetingSession.audioVideo.addRealtimeDataMessageObserver( DATA_MESSAGE_TOPIC , observer)
يمكنك إرسال رسالة في الوقت الفعلي إلى أي موضوع ، سيتم إخطار المراقبين المشتركين به.
ملاحظة: يجب أن يكون الموضوع غير رقمي ألفا رقمي ويمكن أن يشمل الواصلة والرسومات السفلية. لا يمكن أن تتجاوز البيانات 2 كيلو بايت وعمرها اختياري ولكن عدد صحيح إيجابي.
const val DATA_MESSAGE_TOPIC = " chat "
const val DATA_MESSAGE_LIFETIME_MS = 1000
// Send "Hello Chime" to any subscribers who are listening to "chat" topic with 1 seconds of lifetime
meetingSession.audioVideo.realtimeSendDataMessage(
DATA_MESSAGE_TOPIC ,
" Hello Chime " ,
DATA_MESSAGE_LIFETIME_MS
)
ملاحظة: تأكد من إزالة جميع المراقبين والموارد التي أضفتها لتجنب أي تسرب ذاكرة.
val observer = object : AudioVideoObserver {
override fun onAudioSessionStopped ( sessionStatus : MeetingSessionStatus ) {
// This is where meeting ended.
// You can do some clean up work here.
}
override fun onVideoSessionStopped ( sessionStatus : MeetingSessionStatus ) {
// This will be invoked as well.
}
}
meetingSession.audioVideo.addAudioVideoObserver(observer)
meetingSession.audioVideo.stop()
يقلل Amazon Voice Focus من ضوضاء الخلفية في الاجتماع للحصول على خبرة أفضل في الاجتماع. لمزيد من التفاصيل ، انظر Amazon Voice Focus.
val enbabled = meetingSession.audioVideo.realtimeSetVoiceFocusEnabled( true ) // enabling Amazon Voice Focus successful
val disabled = meetingSession.audioVideo.realtimeSetVoiceFocusEnabled( false ) // disabling Amazon Voice Focus successful
يتيح لك مصدر الفيديو المخصص التحكم في الفيديو ، مثل تطبيق مرشح الفيديو. لمزيد من التفاصيل ، شاهد الفيديو المخصص.
يتيح لك طمس الخلفية/الاستبدال تطبيق Blur على خلفية الفيديو الخاصة بك أو استبدالها بصورة. لمزيد من التفاصيل ، انظر BackgroundFilter.
بدءًا من الإصدار 0.18.3 ، تبدأ SDK في إرسال بيانات صوتية زائدة إلى خوادمنا على اكتشاف فقدان الحزمة للمساعدة في تقليل تأثيرها على جودة الصوت. يتم إرسال حزم الصوت المتكررة فقط للحزم التي تحتوي على صوت نشط أو خطاب أو موسيقى. قد يزيد هذا من عرض النطاق الترددي الذي تستهلكه الصوت إلى ما يصل إلى 3 أضعاف المبلغ العادي اعتمادًا على كمية فقدان الحزمة المكتشفة. ستتوقف SDK تلقائيًا عن إرسال بيانات زائدة عن الحاجة إذا لم تكتشف أي خسارة حزمة لمدة 5 دقائق.
إذا كنت بحاجة إلى تعطيل هذه الميزة ، فيمكنك القيام بذلك من خلال تكوين AudiovideOconfiguration قبل بدء الجلسة.
meetingSession.audioVideo.start( AudioVideoConfiguration (enableAudioRedundancy = false ))
على الرغم من وجود خيار لتعطيل الميزة ، فإننا نوصي بإبقائها ممكّنة لتحسين جودة الصوت. أحد الأسباب المحتملة لتعطيله إذا كان لعملائك قيودًا صارمة للغاية على النطاق الترددي.
الرجوع إلى الأسئلة الشائعة العامة لـ Amazon Chime SDK.
يمكن للتطبيقات الحصول على سجلات من SDK Chime عن طريق تمرير مثيلات من المسجل عند إنشاء اجتماعات. لدى Amazon Chime SDK بعض التطبيقات الافتراضية للمسجل الذي يمكن أن يستخدمه التطبيق الخاص بك ، مثل Consomelogger الذي يقوم بتسجيل الدخول إلى وحدة التحكم. تم تعيين ConsoleLogger
على مستوى INFO
كما الافتراضي. لذلك ، من أجل الحصول على جميع السجلات ، بما في ذلك سجلات الوسائط ، قم بإنشاء مسجل بالمتابعة:
val logger = ConsoleLogger ( LogLevel . VERBOSE )
يستخدم SDK OpenSl ES أسفله والذي يتطلب إعداد مسبقات تسجيل أثناء فتح الاتصال بجهاز الميكروفون. لقد اكتشفنا أنه لا توجد قيمة محددة محددة تعمل بشكل جيد على جميع أجهزة Android الممكنة. يستخدم SDK الإعداد المسبق الافتراضي لـ VoiceCommunication
التي وصلنا إليها بعد إجراء بعض الاختبارات على الأجهزة التي في حوزتنا. إذا كان هذا الإعداد المسبق الافتراضي لا يعمل ويؤدي إلى عدم تمكن الطرف البعيد من سماعك ، فيرجى محاولة بدء الجلسة مع تسجيل مسبق مختلف من خلال تحديد audioRecordingPresetOverride
في تكوين AudioVideoConfiguration
الذي تم تمريره إلى واجهة برمجة تطبيقات البدء.
// Creating a config where the preset is overriden with Generic (for example)
val audioVideoConfig = AudioVideoConfiguration (audioRecordingPresetOverride = AudioRecordingPresetOverride . Generic )
// Start Audio Video
audioVideo.start(audioVideoConfig)
يخضع استخدام استبدال الخلفية لإشعار إضافي. أنت ومستخدميك النهائيون مسؤولون عن جميع المحتوى (بما في ذلك أي صور) تم تحميله للاستخدام مع استبدال الخلفية ، ويجب أن تتأكد من اتفاقك مع Amazon (بما في ذلك الوثائق أو شروط خدمة AWS أو سياسة الاستخدام المقبولة).
حقوق الطبع والنشر Amazon.com ، Inc. أو الشركات التابعة لها. جميع الحقوق محفوظة.