Amazon Cank SDK Project Board
ПРИМЕЧАНИЕ. Если построение с исходным кодом SDK, филиал
development
содержит изменения на крахах, которые могут не построить с общедоступной библиотекой CHIME Media или не могут быть такими стабильными, как публичные выпуски.
Amazon Chime SDK для Android позволяет легко добавлять совместные аудиозвуки, видеозвонки и функции просмотра общего экрана в приложения Android, используя те же инфраструктурные услуги, что и питающие встречи на службе Amazon Chime.
Этот Amazon Chime SDK для Android работает, подключившись к ресурсам сессий, которые вы создали в своей учетной записи AWS. У SDK есть все, что вам нужно для создания пользовательского опыта вызова и сотрудничества в вашем приложении Android, включая методы для: настройки сеансов встреч, списка и выбора аудиоустройств, переключение видеоустройств, просмотр экрана запуска и остановки, получение обратных вызовов, когда возникают события мультимедиа, такие в качестве изменения объема и управление функциями собрания, такие как Audio Mute и видео -привязки.
У нас также есть проектный совет по проекту Amazon Chime SDK, где вы можете найти запросы сообщества и их статусы.
Чтобы начать работу, см. Следующие ресурсы:
И просмотрите следующие гиды:
Примечание. Если вы просто хотите запустить демонстрационное приложение, пропустите запуск демонстрационного приложения
Мобильные SDK для Android могут быть загружены из центрального репозитория Maven, интегрированными в файлы 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. Важно: поддерживаются только устройства ARM.
Если вам нужны нефункциональные заглушки 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. Важно: поддерживаются только устройства ARM.
Если вам нужны нефункциональные заглушки x86 в сочетании с полностью функциональными архитектурами ARM, чтобы объединить ваше приложение, вы можете использовать amazon-chime-sdk-media-x86-stub
или amazon-chime-sdk-media-no-video-codecs-x86-stub
Media Binary и замените их на ссылки 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 (реальные устройства) или симулятор с поддерживаемым ARM. В настоящее время мы не поддерживаем 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
Обновление test_url
в strings.xml
на пути amazon-chime-sdk-android/app/src/main/res/values
с URL-адресом без сервера демонстрации, развернутой на шаге 1.
Примечание: используйте
https://xxxxx.xxxxx.xxx.com/Prod/
Если вы обнаружите потенциальную проблему безопасности в этом проекте, мы просим вас уведомить безопасность AWS/Amazon через нашу страницу отчетности по уязвимости. Пожалуйста, не создавайте публичную проблему GitHub.
Вам необходимо начать сессию встречи, чтобы начать отправку и получение звука.
Запустите сеанс с конфигурациями по умолчанию:
meetingSession.audioVideo.start()
Запустите сеанс с пользовательских конфигураций:
meetingSession.audioVideo.start(audioVideoConfiguration)
Эти конфигурации доступны в audioVideoConfiguration
:
audioMode
audioDeviceCapabilities
audioStreamType
audioRecordingPresetOverride
enableAudioRedundancy
reconnectTimeoutMs
Audiomode: Аудио -формат по умолчанию - стерео/48 кГц, т.е. стерео -звук со скоростью отбора проб 48 кГц (Stereo48k). Другие поддерживаемые аудиоформаты включают моно/48 кГц (моно48K) или моно/16 кГц (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 есть больше доступных параметров потока, в настоящее время только Stream_voice_call и Stream_music поддерживаются в Amazon Chime SDK для Android.
AudioreCordingPresetoverRide: значение по умолчанию None
является. Доступные варианты - это None
, Generic
, Camcorder
, VoiceRecognition
и VoiceCommunication
. Они эквивалентны вариантам, упомянутым здесь, под конфигурацией Android AudioRoder .
ENableAudioredundance: значение по умолчанию верно. При включении SDK отправит избыточные аудиоданные при обнаружении потери пакетов, чтобы помочь уменьшить его влияние на качество звука. Более подробную информацию можно найти в избыточном аудио -разделе.
ReconnectTimeOutms: значение по умолчанию составляет 180 000 мс. Используйте эту конфигурацию, чтобы управлять сеансом переподключения, из -за плохого состояния сети.
ПРИМЕЧАНИЕ. Чтобы не пропустить какие -либо события, добавьте наблюдатель перед началом сеанса. Вы можете удалить наблюдателя, позвонив в Abtercessession.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 после начала сеанса, или это будет неоперация. Вы также должны позвонить в CooseAudioDevice с одним из устройств, возвращенных из 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 ()-это NO-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
}
При присоединении к встрече каждая конфигурация будет иметь по умолчанию, если не указано явно при запуске аудиосессии.
- Поддерживаемые параметры аудиомодов: моно/16 кГц , моно/48 кГц и стерео/48 кГц . По умолчанию стерео/48 кГц .
- Поддерживаемые параметры AudioDeviceCapabilities: ввод и вывод , только вывод и нет . По умолчанию ввод и вывод .
- Поддерживаемые параметры AudioStreamtype: VoiceCall и Music . По умолчанию голосовой
- Поддерживаемые параметры AudioreCordingPresetoverRide: нет , общая , видеокамера , голосование и голосовое сообщество . По умолчанию нет .
- Поддерживаемые варианты eNableDiorEndundance: true и false . По умолчанию верно .
- Поддерживаемые значения 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
Property.Контент -видео -плитка может быть идентифицирована с использованием свойства
isContent
. См. Screen и Content Share.Плитка создается с новым идентификатором плитки, когда тот же отдаленный посетитель перезапускает видео.
Вы можете найти более подробную информацию о добавлении/удалении/просмотре видео из создания приложения для встреч на 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)
ПРИМЕЧАНИЕ. Когда вы или другие участники делитесь контентом (например, захватом экрана или любым другим объектом VideoSource), посетитель Content (Cetteeee-ID#Content) присоединяется к сеансу и делится контентом, как если бы постоянный участник делится видео.
Например, ваш идентификатор посетителя-«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)
Смотрите Content Share для получения более подробной информации.
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
Пользовательский видео -источник позволяет управлять видео, например, применение видеофильтра. Для получения более подробной информации см. Пользовательское видео.
Фоновое размытие/замена позволяет применять размытие или заменить фон вашего видео изображением. Для получения более подробной информации см. Founalfilter.
Начиная с версии 0.18.3, SDK начинает отправлять избыточные аудиоданные на наши серверы на обнаружение потери пакетов, чтобы помочь уменьшить его влияние на качество звука. Избыточные аудиопакеты отправляются только для пакетов, содержащих активное аудио, т.е. речь или музыка. Это может увеличить пропускную способность, потребляемую аудио, до 3 раза превышает нормальную сумму в зависимости от количества обнаруженных потерь пакета. SDK автоматически перестанет отправлять избыточные данные, если он не обнаружит потери пакетов в течение 5 минут.
Если вам нужно отключить эту функцию, вы можете сделать это через аудиовидеоконфигурацию перед началом сеанса.
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
, с которой мы прибыли после проведения некоторых тестов на устройствах, находящихся в нашем распоряжении. Если эта предустановка по умолчанию не работает и приводит к тому, что удаленная сторона не сможет вас услышать, попробуйте начать сеанс с другой задачей записи, указав audioRecordingPresetOverride
в AudioVideoConfiguration
, который передается в 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)
Использование замены фоновых условий подлежит дополнительному уведомлению. Вы и ваши конечные пользователи несете ответственность за все контент (включая любые изображения), загруженные для использования с заменой фоновой замены, и должны убедиться, что такой контент не нарушает закон, нарушает или не присводит права любой третьей стороны или иным образом нарушает существенный термин вашего соглашения с Amazon (включая документацию, условия службы AWS или политику приемлемого использования).
Copyright Amazon.com, Inc. или ее филиалы. Все права защищены.