Amazon Chime SDK項目委員會
注意:如果使用SDK源代碼進行構建,則
development
分支包含可能無法使用公開可用的Chime Media庫構建的出血邊緣更改,或者可能不像公共發行版那樣穩定。
Amazon Chime SDK適用於Android,通過使用相同的基礎架構服務,可以輕鬆地添加協作音頻通話,視頻呼叫和屏幕屏幕共享查看功能,以在Amazon Chime服務上供電。
這款Amazon Chime SDK適用於Android,通過連接到您在AWS帳戶中創建的會話資源。 SDK擁有在您的Android應用程序中構建自定義呼叫和協作體驗所需的一切隨著音量的變化並管理會議功能,例如音頻靜音和視頻瓷磚綁定。
我們還擁有一個Amazon Chime SDK項目委員會,您可以在其中找到社區請求及其狀態。
首先,請參閱以下資源:
並查看以下指南:
注意:如果您只想運行演示應用程序,請跳過運行演示應用程序
可以通過集成到Android Project的Gradle文件中從Maven Central存儲庫中下載Android的移動SDK,也可以通過.AAR文件直接嵌入。
為了設置,您的項目的根文件夾將被稱為root
。
要從Maven獲取依賴項,請將依賴項添加到您的應用程序(模塊級) build.gradle
。
在root/app
中更新build.gradle
,並添加以下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- amazon-chime-sdk
amazon-chime-sdk-machine-learning
模塊的使用情況:
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
codecs而不是amazon-chime-sdk-media
來排除軟件視頻編解碼器支持和減小尺寸。如果這樣做,您可以將所有對amazon-chime-sdk-media
的參考視為amazon-chime-sdk-media-no-video-codecs
在下面的說明中。
現在,項目可以構建ARM和X86目標,如果將應用程序捆綁可能很有用。 X86目標將不起作用,並且不打算在任何X86設備或模擬器上安裝或運行。重要的是:僅支持手臂設備。
如果您需要非功能X86存根與功能齊全的ARM架構相結合以捆綁應用程序,則可以使用amazon-chime-sdk-media-x86-stub
或amazon-chime-sdk-media-no-video-codecs-x86-stub
媒體二進製文件並在下面的說明中代替它們代替amazon-chime-sdk-media
參考。
注意:我們不支持來自不同版本的混合和匹配二進製文件。
解開它們並將AAR文件複製到root/app/libs
通過在allprojects
中添加以下repositories
來更新在root
中的build.gradle
:GRADLE:
allprojects {
repositories {
jcenter()
flatDir {
dirs 'libs'
}
}
}
在root/app
中更新build.gradle
,並添加以下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')
在compileOptions
下的root/app
中更新build.gradle
:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
注意:這只是運行演示應用程序並將SDK用作代碼而不是AAR庫。
要運行演示應用程序,請按照以下步驟操作。
注意:請確保您正在用支撐臂支撐的設備(真實設備)或模擬器運行。我們目前不支持X86,因此具有X86的模擬器將無法使用。
從Amazon-Chime-SDK-JS部署無服務器的演示,該演示返回https://xxxxx.xxxxx.xxx.com/Prod/
向移動演示應用程序提供https://xxxxx.xxxxx.xxx.com/Prod/
。
從最新版本中下載amazon-chime-sdk-media
二進製文件。
下載用於機器學習功能的amazon-chime-sdk-machine-learning
二進制二進製文件。
解壓縮並將AAR文件複製到amazon-chime-sdk-android/amazon-chime-sdk/libs
在strings.xml
中更新test_url
在路徑amazon-chime-sdk-android/app/src/main/res/values
並在步驟1中部署的無服務器演示的URL。
注意:使用
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:默認音頻格式為立體聲/48kHz,即立體聲音頻,帶有48kHz採樣率(Stereo48k)。其他支持的音頻格式包括單聲道/48kHz(Mono48k)或Mono/16KHz(Mono16k)。您可以在AudioVideoConfiguration
中指定非默認音頻模式,然後開始會議會議。
AudieViceCapabilities:默認音頻設備功能將同時啟用音頻輸入和輸出設備( InputAndOutput
),即啟用麥克風和揚聲器。 InputAndOutput
將需要MODIFY_AUDIO_SETTINGS
和RECORD_AUDIO
權限。其他選項是OutputOnly
(啟用了麥克風和揚聲器;需要MODIFY_AUDIO_SETTINGS
許可), None
(麥克風和揚聲器都禁用;不需要任何音頻權限)。
AudioStreamType:默認值是VoiceCall
。可用的選項是VoiceCall
和Music
,它們在AudioManager中分別相當於STREAM_VOICE_CALL
和STREAM_MUSIC
。這種配置是為了解決Oculus Quest 2上的音量卷問題。如果您不知道它是什麼,則可能不必擔心它。有關更多信息,請參閱Android文檔:stream_voice_call,stream_music。
注意:即使Android中還有更多可用的流選項,目前僅在Amazon Chime SDK中支持Android的stream_voice_call和stream_music 。
AudioreCordingPreeseToverride:默認值None
。可用的選項None
, Generic
, Camcorder
, VoiceRecognition
和VoiceCommunication
。這些等同於此處在Android Audiorecorder配置下提到的選項。
enableAudioredendency:默認值是正確的。啟用後,SDK將向檢測數據包丟失發送冗餘音頻數據,以幫助降低其對音頻質量的影響。更多詳細信息可以在“冗餘音頻”部分中找到。
reconnectTimeOutms:默認值為180,000ms。由於網絡條件差,請使用此配置來控制會話重新連接超時。
注意:要避免丟失任何事件,請在會話開始之前添加觀察者。您可以通過致電會議來刪除觀察者。audiovideo.removeaudiovideoobserver(觀察者)。
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,否則將是一個no-op。您還應使用從ListAudiodevices返回的設備之一調用ChooseAudiodevice。
// 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()是一個無操作。請參閱自定義視頻以獲取更多詳細信息。
如果有的話,請在設備上的正面或後置攝像頭之間切換。
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
}
加入會議時,如果在啟動音頻會話時未明確指定,每種配置將有默認設置。
- 支持的聽力群選項:單聲道/16kHz ,單聲道/48kHz和立體聲/48kHz 。默認值為立體聲/48kHz 。
- 支持的AudieviceCapabilities選項:輸入和輸出,僅輸出,無。默認值是輸入和輸出。
- 支持的AudioStreamType選項: VoiceCall和Music 。默認值為voiceCall
- 支持的AudioreCordingPreseToverride選項:無,通用,攝像機,語音認知和語音通信。默認值無。
- 支持的啟示性延期性選項: True and valse 。默認是正確的。
- 支持的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
您可以使用它來構建實時指標UI並將其更新以進行數組提供的更改。
注意:這些回調僅包括上一個回調中的三角洲。
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
屬性識別內容視頻瓷磚。請參閱屏幕和內容共享。當相同的遠程與會者重新啟動視頻時,創建具有新瓷磚ID的瓷磚。
您可以通過使用Amazon Chime SDK在Android上構建會議應用程序來找到有關添加/刪除/查看視頻的更多詳細信息。
您可以致電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)
注意:當您或其他參與者共享內容(例如,屏幕截圖或任何其他視頻程序對象)時,內容參與者(與會者ID#內容)會加入會話並共享內容,就像常規與會者共享視頻一樣。
例如,您的與會者ID是“ 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
,而本地股份不會。要渲染視頻進行預覽,請在ContentShareSource
中的VideoSource
中添加一個VideoSink
。
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)
您可以將實時消息發送到任何主題,將通知已訂閱的觀察者。
注意:主題必須是alpha-numeric,它可以包括連字符和下劃線。數據不能超過2KB,壽命是可選的,但整數為正。
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語音焦點。
val enbabled = meetingSession.audioVideo.realtimeSetVoiceFocusEnabled( true ) // enabling Amazon Voice Focus successful
val disabled = meetingSession.audioVideo.realtimeSetVoiceFocusEnabled( false ) // disabling Amazon Voice Focus successful
自定義視頻源允許您控制視頻,例如應用視頻過濾器。有關更多詳細信息,請參見自定義視頻。
背景模糊/替換使您可以用圖像在視頻的背景上應用模糊或替換。有關更多詳細信息,請參見背景窗。
從0.18.3版本開始,SDK開始向我們的服務器發送冗餘音頻數據,以檢測數據包丟失,以幫助降低其對音頻質量的影響。冗餘音頻數據包僅用於包含活動音頻,IE語音或音樂的數據包。根據檢測到的數據包損耗的數量,這可能會增加音頻消耗的帶寬最高正常量的3倍。如果SDK在5分鐘內未檢測到任何數據包丟失,則將自動停止發送冗餘數據。
如果需要禁用此功能,則可以在開始會話之前通過AudiovideOconfiguration進行。
meetingSession.audioVideo.start( AudioVideoConfiguration (enableAudioRedundancy = false ))
雖然可以選擇禁用該功能,但我們建議將其啟用以提高音頻質量。禁用您的客戶有非常嚴格的帶寬限制的可能原因。
請參閱Amazon Chime SDK將軍。
應用程序在創建會議時可以通過記錄器實例從chime SDK獲取日誌。 Amazon Chime SDK具有您的應用程序可以使用的Logger的一些默認實現,例如將登錄到控制台的ConsoleLogger。默認情況下, ConsoleLogger
設置為INFO
級別。因此,為了獲取所有日誌,包括媒體日誌,請通過以下方式創建記錄器:
val logger = ConsoleLogger ( LogLevel . VERBOSE )
SDK使用下面的OpenSL ES,這需要在打開與麥克風設備的連接時進行記錄預設。我們發現,沒有特定的預設價值在所有可能的Android設備上都效果很好。 SDK使用默認的VoiceCommunication
預設,在我們擁有的設備上進行了一些測試後,我們到達了。如果此默認的預設不起作用,並且導致遠程聚會無法聽到您的聲音,請嘗試通過在AudioVideoConfiguration
中指定audioRecordingPresetOverride
,以將其傳遞到Start API中。
// Creating a config where the preset is overriden with Generic (for example)
val audioVideoConfig = AudioVideoConfiguration (audioRecordingPresetOverride = AudioRecordingPresetOverride . Generic )
// Start Audio Video
audioVideo.start(audioVideoConfig)
背景更換的使用需要額外通知。您和您的最終用戶負責上傳的所有內容(包括任何圖像),並必須確保該內容不會違反法律,侵犯或濫用任何第三方的權利,或者以其他方式違反了物質術語您與亞馬遜的協議(包括文檔,AWS服務條款或可接受的使用政策)。
版權所有Amazon.com,Inc。或其分支機構。版權所有。