Dewan Proyek Amazon Chime SDK
CATATAN: Jika membangun dengan kode sumber SDK, cabang
development
berisi perubahan pendarahan yang mungkin tidak dibangun dengan perpustakaan media chime yang tersedia secara publik atau mungkin tidak stabil seperti rilis publik.
Amazon Chime SDK untuk Android memudahkan untuk menambahkan panggilan audio kolaboratif, panggilan video, dan layar berbagi fitur tampilan ke aplikasi Android dengan menggunakan layanan infrastruktur yang sama yang menyalakan pertemuan di layanan Amazon Chime.
Amazon Chime SDK untuk Android ini berfungsi dengan menghubungkan ke sumber daya sesi pertemuan yang telah Anda buat di akun AWS Anda. SDK memiliki semua yang Anda butuhkan untuk membangun pengalaman panggilan dan kolaborasi khusus dalam aplikasi Android Anda, termasuk metode untuk: Mengkonfigurasi sesi pertemuan, daftar dan pilih perangkat audio, beralih perangkat video, mulai dan berhenti berbagi layar, menerima panggilan balik ketika peristiwa media terjadi seperti itu seperti halnya seperti itu Saat volume berubah, dan mengelola fitur pertemuan seperti binding ubin audio dan ubin video.
Kami juga memiliki Dewan Proyek Amazon Chime SDK di mana Anda dapat menemukan permintaan komunitas dan status mereka.
Untuk memulai, lihat sumber daya berikut:
Dan tinjau pemandu berikut:
Catatan: Jika Anda hanya ingin menjalankan aplikasi demo, lewati menjalankan aplikasi demo
SDK seluler untuk Android dapat diunduh dari repositori Maven Central, dengan terintegrasi ke dalam file gradle proyek Android Anda, atau Anda dapat langsung tertanam melalui file .aar.
Untuk tujuan pengaturan, folder root proyek Anda akan disebut sebagai root
.
Untuk mendapatkan dependensi dari Maven, tambahkan dependensi ke build.gradle
aplikasi (tingkat modul) Anda.
Perbarui build.gradle
di root/app
dan tambahkan yang berikut di bawah dependencies
:
dependencies {
implementation 'software.aws.chimesdk:amazon-chime-sdk-media:$MEDIA_VERSION'
implementation 'software.aws.chimesdk:amazon-chime-sdk:$SDK_VERSION'
}
Nomor versi dapat diperoleh dari rilis terbaru.
Jika Anda tidak memerlukan fungsionalitas berbagi video dan konten, atau dukungan codec video perangkat lunak, Anda dapat menggunakan amazon-chime-sdk-media-no-video-codecs
sebagai gantinya untuk mengurangi ukuran. Kecualikan penggunaan modul amazon-chime-sdk-media
dan/atau modul amazon-chime-sdk-machine-learning
dari ketergantungan transitif 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'
}
}
Proyek sekarang dapat membangun target ARM dan X86, yang mungkin berguna jika menggabungkan aplikasi. Target x86 tidak akan berfungsi dan tidak dimaksudkan untuk diinstal atau dijalankan pada perangkat atau emulator x86 apa pun. Penting: Hanya perangkat lengan yang didukung.
Jika Anda memerlukan stub x86 non-fungsional di biner media untuk menggabungkan aplikasi Anda, Anda dapat menambahkan -x86-stub
ke ketergantungan media yang Anda pilih. Misalnya:
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'
}
}
Untuk memasukkan binari SDK dalam proyek Anda sendiri, ikuti langkah -langkah ini.
Unduh binari amazon-chime-sdk
dan amazon-chime-sdk-media
dari rilis terbaru.
Jika Anda suka menggunakan lebih banyak fitur pembelajaran mesin, misalnya latar belakang/penggantian latar belakang, unduh juga biner amazon-chime-sdk-machine-learning
dari rilis terbaru. Kalau tidak, Anda dapat mengabaikan semua referensi ke amazon-chime-sdk-machine-learning
dalam instruksi di bawah ini.
Jika Anda tidak memerlukan fungsionalitas berbagi video dan konten, atau dukungan codec video perangkat lunak, Anda dapat menggunakan amazon-chime-sdk-media-no-video-codecs
alih-alih amazon-chime-sdk-media
untuk mengecualikan dukungan codec video perangkat lunak dan mengurangi ukuran. Jika Anda melakukannya, Anda dapat memperlakukan semua referensi ke amazon-chime-sdk-media
sebagai amazon-chime-sdk-media-no-video-codecs
dalam instruksi di bawah ini.
Proyek sekarang dapat membangun target ARM dan X86, yang mungkin berguna jika menggabungkan aplikasi. Target x86 tidak akan berfungsi dan tidak dimaksudkan untuk diinstal atau dijalankan pada perangkat atau emulator x86 apa pun. Penting: Hanya perangkat lengan yang didukung.
Jika Anda memerlukan stub x86 non-fungsional yang dikombinasikan dengan arsitektur lengan yang berfungsi penuh untuk menggabungkan aplikasi Anda, Anda dapat menggunakan amazon-chime-sdk-media-x86-stub
atau amazon-chime-sdk-media-no-video-codecs-x86-stub
Binari media amazon-chime-sdk-media-no-video-codecs-x86-stub
dan ganti mereka dengan referensi amazon-chime-sdk-media
dalam instruksi di bawah ini.
Catatan: Kami tidak mendukung pencampuran dan pencocokan binari dari rilis yang berbeda.
Unzip mereka dan salin file AAR ke root/app/libs
Perbarui build.gradle
di root
dengan menambahkan yang berikut di bawah repositories
di allprojects
:
allprojects {
repositories {
jcenter()
flatDir {
dirs 'libs'
}
}
}
Perbarui build.gradle
di root/app
dan tambahkan yang berikut di bawah dependencies
:
implementation(name: 'amazon-chime-sdk', ext: 'aar')
implementation(name: 'amazon-chime-sdk-media', ext: 'aar')
Jika Anda menggunakan pustaka amazon-chime-sdk-machine-learning
, maka tambahkan pernyataan di bawah ini juga di bawah dependencies
:
implementation(name: 'amazon-chime-sdk-machine-learning', ext: 'aar')
Perbarui build.gradle
di root/app
di bawah compileOptions
:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
Catatan: Ini hanya untuk menjalankan aplikasi demo dan menggunakan SDK sebagai kode alih -alih AAR Library.
Untuk menjalankan aplikasi demo, ikuti langkah -langkah ini.
Catatan: Pastikan Anda menjalankan perangkat yang didukung lengan (perangkat nyata) atau simulator dengan ARM didukung. Kami tidak mendukung x86 saat ini, jadi simulator dengan x86 tidak akan berfungsi.
Menyebarkan demo tanpa server dari Amazon-chime-sdk-js, yang mengembalikan https://xxxxx.xxxxx.xxx.com/Prod/
Menyediakan https://xxxxx.xxxxx.xxx.com/Prod/
untuk aplikasi demo seluler.
Unduh biner amazon-chime-sdk-media
dari rilis terbaru.
Unduh Biner amazon-chime-sdk-machine-learning
for Machine Learning.
Unzip dan salin file AAR ke amazon-chime-sdk-android/amazon-chime-sdk/libs
Perbarui test_url
di strings.xml
di jalur amazon-chime-sdk-android/app/src/main/res/values
dengan url demo tanpa server yang digunakan pada langkah 1.
Catatan: Gunakan
https://xxxxx.xxxxx.xxx.com/Prod/
Jika Anda menemukan masalah keamanan potensial dalam proyek ini, kami meminta Anda memberi tahu AWS/Amazon Security melalui halaman pelaporan kerentanan kami. Tolong jangan buat masalah gitub publik.
Anda harus memulai sesi pertemuan untuk mulai mengirim dan menerima audio.
Mulai sesi dengan konfigurasi default:
meetingSession.audioVideo.start()
Mulai sesi dengan konfigurasi khusus:
meetingSession.audioVideo.start(audioVideoConfiguration)
Konfigurasi ini tersedia di audioVideoConfiguration
:
audioMode
audioDeviceCapabilities
audioStreamType
audioRecordingPresetOverride
enableAudioRedundancy
reconnectTimeoutMs
Audiomode: Format audio default adalah stereo/48kHz yaitu audio stereo dengan laju pengambilan sampel 48kHz (Stereo48K). Format audio yang didukung lainnya termasuk mono/48kHz (mono48k) atau mono/16kHz (mono16k). Anda dapat menentukan mode audio non-default di AudioVideoConfiguration
, dan kemudian memulai sesi pertemuan.
AudioDeviceCapability: Kemampuan perangkat audio default harus memiliki input audio dan perangkat output yang diaktifkan ( InputAndOutput
), yaitu mikrofon dan speaker diaktifkan. InputAndOutput
akan memerlukan izin MODIFY_AUDIO_SETTINGS
dan RECORD_AUDIO
. Opsi lain adalah OutputOnly
(mikrofon dinonaktifkan dan speaker diaktifkan; memerlukan izin MODIFY_AUDIO_SETTINGS
) dan None
(baik mikrofon dan speaker dinonaktifkan; tidak memerlukan izin audio).
AudiostreamType: Nilai default adalah VoiceCall
. Opsi yang tersedia adalah VoiceCall
dan Music
, mereka setara dengan STREAM_VOICE_CALL
dan STREAM_MUSIC
masing -masing di AudioMerAnager. Konfigurasi ini adalah untuk mengatasi masalah volume audio di Oculus Quest 2. Jika Anda tidak tahu apa itu, Anda mungkin tidak perlu khawatir tentang hal itu. Untuk informasi lebih lanjut, silakan merujuk ke Dokumentasi Android: Stream_voice_call, Stream_Music.
Catatan: Meskipun ada lebih banyak opsi aliran yang tersedia di Android, saat ini hanya Stream_Voice_Call dan Stream_Music yang didukung di Amazon Chime SDK untuk Android.
AudiorecordingPresetOverride: Nilai default None
. Opsi yang tersedia adalah None
, Generic
, Camcorder
, VoiceRecognition
dan VoiceCommunication
. Ini setara dengan opsi yang disebutkan di sini di bawah konfigurasi Android Audiorecorder .
Enableaudioredundancy: Nilai default benar. Saat diaktifkan, SDK akan mengirim data audio yang berlebihan tentang mendeteksi kehilangan paket untuk membantu mengurangi efeknya pada kualitas audio. Rincian lebih lanjut dapat ditemukan di bagian audio yang berlebihan .
ReconnectTimeOutms: Nilai default adalah 180.000 ms. Gunakan konfigurasi ini untuk mengontrol waktu penghubung kembali sesi karena kondisi jaringan yang buruk.
Catatan: Untuk menghindari kehilangan peristiwa apa pun, tambahkan pengamat sebelum sesi dimulai. Anda dapat menghapus pengamat dengan menelepon rapat -rapat. Audiovideo.removeaudiovideoBserver (pengamat).
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)
Daftar perangkat audio yang tersedia untuk rapat.
val audioDevices = meetingSession.audioVideo.listAudioDevices()
// A list of MediaDevice objects
audioDevices.forEach {
logger.info( TAG , " Device type: ${it.type} , label: ${it.label} " )
}
MediaDevice
.Catatan: Anda harus menelepon ChooseAudiodevice setelah sesi dimulai, atau itu akan menjadi no-op. Anda juga harus menghubungi ChooseAudiodevice dengan salah satu perangkat yang dikembalikan dari 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)
Catatan: SwitchCamera () adalah no-op jika Anda menggunakan sumber penangkapan kamera khusus. Silakan merujuk ke video khusus untuk lebih jelasnya.
Beralih di antara kamera depan atau belakang pada perangkat, jika tersedia.
meetingSession.audioVideo.switchCamera()
Tambahkan DeviceChangeObserver
untuk menerima panggilan balik ketika perangkat audio baru terhubung atau ketika perangkat audio terputus. onAudioDeviceChanged
mencakup daftar perangkat yang diperbarui.
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)
Catatan: API
getActiveAudioDevice
membutuhkan API level 24 atau lebih tinggi.
if ( Build . VERSION . SDK_INT >= Build . VERSION_CODES . N ) {
val activeAudioDevice = meetingSession.audioVideo.getActiveAudioDevice()
}
Untuk tingkat API yang lebih rendah, pembangun dapat mencapai hal yang sama dengan melacak perangkat yang dipilih dengan logika berikut:
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
}
Saat bergabung dengan pertemuan, setiap konfigurasi akan memiliki default jika tidak ditentukan secara eksplisit saat memulai sesi audio.
- Opsi Audiomode yang Didukung: Mono/16KHz , Mono/48KHz , dan Stereo/48KHz . Default adalah stereo/48kHz .
- Opsi AudioDeviceCapability yang didukung: input dan output , hanya output , dan tidak ada . Default adalah input dan output .
- Opsi AudiostreamType yang Didukung: VoiceCall dan Musik . Default adalah voiceCall
- Opsi AudiorecordingPreseToverride yang didukung: tidak ada , generik , camcorder , voicerecognition dan voicecommunication . Default tidak ada .
- Opsi EnableAudioredundancy yang Didukung: Benar dan Salah . Default itu benar .
- Nilai ReconnectTimeOutms yang didukung: Bilangan bulat lebih besar dari atau sama dengan 0. Default adalah 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]
Catatan: Sejauh ini, Anda telah menambahkan pengamat untuk menerima acara siklus hidup perangkat dan sesi. Dalam kasus penggunaan berikut, Anda akan menggunakan metode API real-time untuk mengirim dan menerima indikator volume dan mengontrol keadaan bisu.
val muted = meetingSession.audioVideo.realtimeLocalMute() // returns true if muted, false if failed
val unmuted = meetingSession.audioVideo.realtimeLocalUnmute() // returns true if unmuted, false if failed
Anda dapat menggunakan ini untuk membangun indikator waktu nyata UI dan memperbarui mereka untuk perubahan yang dikirimkan oleh array.
Catatan: Panggilan balik ini hanya akan menyertakan delta dari panggilan balik sebelumnya.
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)
Anda dapat menggunakan acara onActiveSpeakerDetected
untuk memperbesar atau menekankan ubin video speaker paling aktif jika tersedia. Dengan menetapkan scoreCallbackIntervalMs
dan menerapkan onActiveSpeakerScoreChanged
, Anda dapat menerima skor speaker aktif secara berkala.
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)
Catatan: Anda harus mengikat video ke
VideoRenderView
untuk membuatnya.Ubin video lokal dapat diidentifikasi menggunakan properti
isLocalTile
.Ubin video konten dapat diidentifikasi menggunakan properti
isContent
. Lihat Layar dan Bagikan Konten.Sebuah ubin dibuat dengan ID ubin baru ketika peserta jarak jauh yang sama restart video.
Anda dapat menemukan detail lebih lanjut tentang menambahkan/menghapus/menonton video dari membangun aplikasi pertemuan di Android menggunakan Amazon Chime SDK.
Anda dapat menghubungi startRemoteVideo
untuk mulai menerima video jarak jauh, karena ini tidak terjadi secara default.
meetingSession.audioVideo.startRemoteVideo()
stopRemoteVideo
berhenti menerima video jarak jauh dan memicu onVideoTileRemoved
untuk video jarak jauh yang ada.
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)
Untuk manajemen ubin video yang lebih canggih, lihat pagination video.
// 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)
Catatan: Ketika Anda atau peserta lain berbagi konten (misalnya, pengambilan layar atau objek sumber video lainnya), peserta konten (konten peserta-id) bergabung dengan sesi dan membagikan konten seolah-olah peserta reguler membagikan video.
Misalnya, ID peserta Anda adalah "My-ID". Saat Anda menelepon
meetingSession.audioVideo.startContentShare
, peserta konten "My-ID#Content" akan bergabung dengan sesi dan membagikan konten Anda.
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)
Anda dapat mengatur konfigurasi untuk berbagi konten, misalnya maxbitratekbps. Kualitas aktual yang dicapai dapat bervariasi di seluruh panggilan tergantung pada sistem dan jaringan apa yang dapat disediakan.
val contentShareConfig = LocalVideoConfiguration ( 200 )
meetingSession.audioVideo.startContentShare(contentShareSource, contentShareConfig)
Lihat Bagikan Konten untuk detail lebih lanjut.
meetingSession.audioVideo.stopContentShare()
Chime SDK memungkinkan dua saham konten simultan per pertemuan. Saham konten jarak jauh akan memicu onVideoTileAdded
, sedangkan saham lokal tidak akan. Untuk membuat video untuk pratinjau, tambahkan VideoSink
ke VideoSource
di 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)
Lihat ObservableMetric
untuk lebih banyak metrik yang tersedia dan untuk memantau kualitas audio, video, dan konten berbagi.
val observer = object : MetricsObserver {
override fun onMetricsReceived ( metrics : Map < ObservableMetric , Any >) {
metrics.forEach { (metricsName, metricsValue) ->
logger.info( TAG , " $metricsName : $metricsValue " )
}
}
}
meetingSession.audioVideo.addMetricsObserver(observer)
Anda dapat menerima pesan real-time dari beberapa topik setelah memulai sesi pertemuan.
CATATAN: Pesan data yang dikirim dari peserta lokal tidak akan memicu panggilan balik ini kecuali jika dibatasi.
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)
Anda dapat mengirim pesan waktu nyata ke topik apa pun, di mana pengamat yang telah berlangganan akan diberitahu.
CATATAN: Topik perlu alfa-numerik dan dapat mencakup tanda hubung dan garis bawah. Data tidak dapat melebihi 2KB dan seumur hidup adalah opsional tetapi bilangan bulat positif.
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
)
Catatan: Pastikan untuk menghapus semua pengamat dan melepaskan sumber daya yang telah Anda tambahkan untuk menghindari kebocoran memori.
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 mengurangi kebisingan latar belakang dalam pertemuan untuk pengalaman pertemuan yang lebih baik. Untuk detail lebih lanjut, lihat 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
Sumber video khusus memungkinkan Anda untuk mengontrol video, seperti menerapkan filter video. Untuk detail lebih lanjut, lihat video khusus.
Latar Belakang Kabur/Penggantian memungkinkan Anda untuk menerapkan blur pada atau mengganti latar belakang video Anda dengan gambar. Untuk detail lebih lanjut, lihat BackgroundFilter.
Mulai dari versi 0.18.3, SDK mulai mengirim data audio yang berlebihan ke server kami tentang mendeteksi kehilangan paket untuk membantu mengurangi efeknya pada kualitas audio. Paket audio yang berlebihan hanya dikirim untuk paket yang berisi audio aktif, IE pidato atau musik. Ini dapat meningkatkan bandwidth yang dikonsumsi oleh audio hingga 3 kali jumlah normal tergantung pada jumlah kerugian paket yang terdeteksi. SDK akan secara otomatis berhenti mengirim data yang berlebihan jika belum mendeteksi kerugian paket selama 5 menit.
Jika Anda perlu menonaktifkan fitur ini, Anda dapat melakukannya melalui audiovideoconfiguration sebelum memulai sesi.
meetingSession.audioVideo.start( AudioVideoConfiguration (enableAudioRedundancy = false ))
Meskipun ada opsi untuk menonaktifkan fitur, kami sarankan agar tetap diaktifkan untuk kualitas audio yang lebih baik. Salah satu alasan yang mungkin untuk menonaktifkannya mungkin jika pelanggan Anda memiliki batasan bandwidth yang sangat ketat.
Lihat FAQ Umum untuk Amazon Chime SDK.
Aplikasi bisa mendapatkan log dari Chime SDK dengan memberikan contoh Logger saat membuat pertemuan. Amazon Chime SDK memiliki beberapa implementasi default dari Logger yang dapat digunakan aplikasi Anda, seperti Consolelogger yang masuk ke konsol. ConsoleLogger
diatur ke tingkat INFO
sebagai default. Oleh karena itu, untuk mendapatkan semua log, termasuk log media, membuat logger dengan mengikuti:
val logger = ConsoleLogger ( LogLevel . VERBOSE )
SDK menggunakan opensl di bawahnya yang membutuhkan pengaturan perekaman preset sambil membuka koneksi ke perangkat mikrofon. Kami telah menemukan bahwa tidak ada nilai preset khusus yang bekerja dengan baik pada semua perangkat Android yang mungkin. SDK menggunakan preset VoiceCommunication
default yang telah kami sampai setelah menjalankan beberapa tes pada perangkat yang kami miliki. Jika preset default ini tidak berfungsi dan mengarah ke partai jarak jauh yang tidak dapat mendengar Anda, silakan coba memulai sesi dengan preset rekaman yang berbeda dengan menentukan audioRecordingPresetOverride
dalam konfigurasi AudioVideoConfiguration
yang diteruskan ke API start.
// Creating a config where the preset is overriden with Generic (for example)
val audioVideoConfig = AudioVideoConfiguration (audioRecordingPresetOverride = AudioRecordingPresetOverride . Generic )
// Start Audio Video
audioVideo.start(audioVideoConfig)
Penggunaan penggantian latar belakang tunduk pada pemberitahuan tambahan. Anda dan pengguna akhir Anda bertanggung jawab atas semua konten (termasuk gambar apa pun) yang diunggah untuk digunakan dengan penggantian latar belakang, dan harus memastikan bahwa konten tersebut tidak melanggar hukum, melanggar atau menyalahgunakan hak -hak pihak ketiga mana pun, atau dengan sebaliknya melanggar istilah material suatu materi perjanjian Anda dengan Amazon (termasuk dokumentasi, persyaratan layanan AWS, atau kebijakan penggunaan yang dapat diterima).
Copyright Amazon.com, Inc. atau afiliasinya. Semua hak dilindungi undang -undang.