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
而不是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。或其分支机构。版权所有。