Junta del proyecto de Amazon Chime SDK
Nota: Si se construye con el código fuente SDK, la rama
development
contiene cambios de borde de sangrado que pueden no construir con la biblioteca de medios Chime disponible públicamente o no ser tan estable como las versiones públicas.
El SDK de Amazon Chime para Android facilita agregar llamadas de audio colaborativas, videollamadas y las características de visualización de pantalla de pantalla a las aplicaciones de Android utilizando los mismos servicios de infraestructura que alimentan reuniones en el servicio de Chime de Amazon.
Este SDK de Amazon Chime para Android funciona conectando a reuniones de recursos de sesión que ha creado en su cuenta AWS. El SDK tiene todo lo que necesita para crear experiencias personalizadas de llamadas y colaboración en su aplicación de Android, incluidos los métodos para: configurar sesiones de reunión, listar y seleccionar dispositivos de audio, cambiar de dispositivos de video, inicio y detener la visualización de la pantalla, recibir devoluciones de llamada cuando ocurren eventos multimedia como tales. A medida que cambia el volumen y administra funciones de reuniones como enlaces de baldosas de audio y muda de video.
También tenemos una Junta del Proyecto SDK de Amazon Chime donde puede encontrar solicitudes de la comunidad y sus estados.
Para comenzar, vea los siguientes recursos:
Y revise las siguientes guías:
Nota: Si solo desea ejecutar la aplicación de demostración, omita a ejecutar la aplicación de demostración
Los SDK móviles para Android podrían descargarse del repositorio central Maven, integrado en los archivos de Gradle de su proyecto Android, o puede integrarse directamente a través de archivos .aar.
A los fines de la configuración, la carpeta raíz de su proyecto se denominará root
.
Para obtener las dependencias de Maven, agregue las dependencias a build.gradle
de su aplicación (a nivel de módulo).
Actualizar build.gradle
en root/app
y agregar lo siguiente en dependencies
:
dependencies {
implementation 'software.aws.chimesdk:amazon-chime-sdk-media:$MEDIA_VERSION'
implementation 'software.aws.chimesdk:amazon-chime-sdk:$SDK_VERSION'
}
Los números de versión podrían obtenerse de la última versión.
Si no necesita una funcionalidad de compartir videos y contenido, o soporte de códec de video de software, puede usar amazon-chime-sdk-media-no-video-codecs
en su lugar para reducir el tamaño. Excluya el uso del módulo amazon-chime-sdk-media
y/o el módulo amazon-chime-sdk-machine-learning
de la dependencia transitiva de 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'
}
}
Los proyectos ahora pueden construir objetivos ARM y X86, que pueden ser útiles si agrupan una aplicación. Los objetivos X86 no funcionarán y no están destinados a ser instalados o ejecutarse en ningún dispositivo o emulador X86. IMPORTANTE: Solo se admiten dispositivos ARM.
Si necesita talones X86 no funcionales en el binario de medios para agrupar su aplicación, puede agregar -x86-stub
a la dependencia de los medios elegidos. Por ejemplo:
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'
}
}
Para incluir los binarios SDK en su propio proyecto, siga estos pasos.
Descargue los binarios de amazon-chime-sdk
y amazon-chime-sdk-media
desde el último lanzamiento.
Si desea utilizar más funciones de aprendizaje automático, por ejemplo, un desenfoque/reemplazo de fondo, también descargue el binario amazon-chime-sdk-machine-learning
de la última versión. De lo contrario, puede ignorar todas las referencias al amazon-chime-sdk-machine-learning
en las instrucciones a continuación.
Si no necesita una funcionalidad de compartir videos y contenido, o soporte de códec de video de software, puede usar amazon-chime-sdk-media-no-video-codecs
en lugar de amazon-chime-sdk-media
para excluir el soporte de códecs de video de software y reducir el tamaño. Si lo hace, puede tratar todas las referencias a amazon-chime-sdk-media
como amazon-chime-sdk-media-no-video-codecs
en las instrucciones a continuación.
Los proyectos ahora pueden construir objetivos ARM y X86, que pueden ser útiles si agrupan una aplicación. Los objetivos X86 no funcionarán y no están destinados a ser instalados o ejecutarse en ningún dispositivo o emulador X86. IMPORTANTE: Solo se admiten dispositivos ARM.
Si necesita trozos X86 no funcionales combinados con arquitecturas de brazo completamente funcionales para agrupar su aplicación, puede usar amazon-chime-sdk-media-x86-stub
o amazon-chime-sdk-media-no-video-codecs-x86-stub
Binarios de medios amazon-chime-sdk-media-no-video-codecs-x86-stub
y sustituyslos por las referencias de amazon-chime-sdk-media
en las instrucciones a continuación.
Nota: No admitimos binarios de mezcla y coincidencia de diferentes lanzamientos.
Descriptalos y copie los archivos AAR a root/app/libs
Actualizar build.gradle
en root
agregando lo siguiente en repositories
en allprojects
:
allprojects {
repositories {
jcenter()
flatDir {
dirs 'libs'
}
}
}
Actualizar build.gradle
en root/app
y agregar lo siguiente en dependencies
:
implementation(name: 'amazon-chime-sdk', ext: 'aar')
implementation(name: 'amazon-chime-sdk-media', ext: 'aar')
Si está utilizando la biblioteca amazon-chime-sdk-machine-learning
, agregue la declaración a continuación también en dependencies
:
implementation(name: 'amazon-chime-sdk-machine-learning', ext: 'aar')
Actualizar build.gradle
en root/app
en compileOptions
:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
Nota: Esto es solo para ejecutar la aplicación de demostración y usar SDK como código en lugar de la biblioteca AAR.
Para ejecutar la aplicación de demostración, siga estos pasos.
Nota: Asegúrese de que se ejecute en dispositivos compatibles con el brazo (dispositivos reales) o simulador con el brazo compatible. No admitimos X86 actualmente, por lo que los simuladores con X86 no funcionarán.
Implemente la demostración sin servidor de Amazon-Chime-Sdk-JS, que devuelve https://xxxxx.xxxxx.xxx.com/Prod/
Proporcione https://xxxxx.xxxxx.xxx.com/Prod/
para la aplicación de demostración móvil.
Descargue el binario amazon-chime-sdk-media
del último lanzamiento.
Descargue el binario amazon-chime-sdk-machine-learning
para las funciones de aprendizaje automático.
Descomprima y copie los archivos AAR a amazon-chime-sdk-android/amazon-chime-sdk/libs
Actualice test_url
en strings.xml
en la ruta amazon-chime-sdk-android/app/src/main/res/values
con la URL de la demostración sin servidor implementada en el Paso 1.
Nota: Use
https://xxxxx.xxxxx.xxx.com/Prod/
Si descubre un problema de seguridad potencial en este proyecto, le pedimos que notifique a AWS/Amazon Security a través de nuestra página de informes de vulnerabilidad. No cree un problema público de GitHub.
Debe comenzar la sesión de reunión para comenzar a enviar y recibir audio.
Inicie una sesión con configuraciones predeterminadas:
meetingSession.audioVideo.start()
Inicie una sesión con configuraciones personalizadas:
meetingSession.audioVideo.start(audioVideoConfiguration)
Estas configuraciones están disponibles en audioVideoConfiguration
:
audioMode
audioDeviceCapabilities
audioStreamType
audioRecordingPresetOverride
enableAudioRedundancy
reconnectTimeoutMs
Audiomode: el formato de audio predeterminado es estéreo/48 kHz, es decir, audio estéreo con velocidad de muestreo de 48 kHz (estéreo48k). Otros formatos de audio compatibles incluyen mono/48kHz (mono48k) o mono/16kHz (mono16k). Puede especificar un modo de audio no deformento en AudioVideoConfiguration
y luego comenzar la sesión de reunión.
AudioDeviceCapabilities: las capacidades predeterminadas del dispositivo de audio son tener habilitados los dispositivos de entrada y salida de audio ( InputAndOutput
), es decir, tanto el micrófono como el altavoz están habilitados. InputAndOutput
requerirá MODIFY_AUDIO_SETTINGS
y permisos RECORD_AUDIO
. Otras opciones son OutputOnly
(el micrófono deshabilitado y habilitado el altavoz; requiere el permiso MODIFY_AUDIO_SETTINGS
) y None
(tanto el micrófono como el altavoz deshabilitado; no requiere ningún permiso de audio).
AudiostreamType: el valor predeterminado es VoiceCall
. Las opciones disponibles son VoiceCall
y Music
, son equivalentes a STREAM_VOICE_CALL
y STREAM_MUSIC
respectivamente en audiomanager. Esta configuración es para abordar el problema de volumen de audio en Oculus Quest 2. Si no sabe qué es, probablemente no necesite preocuparse por ello. Para obtener más información, consulte la documentación de Android: stream_voice_call, stream_music.
Nota: Aunque hay más opciones de transmisión disponibles en Android, actualmente solo se admiten stream_voice_call y stream_music en Amazon Chime SDK para Android.
AudiorCordingPreseToverRide: el valor predeterminado es None
. Las opciones disponibles son None
, Generic
, Camcorder
, VoiceRecognition
y VoiceCommunication
. Estas son equivalentes a las opciones mencionadas aquí en la configuración de Android AudiorCorder .
EnableAudiorEdundancy: el valor predeterminado es verdadero. Cuando está habilitado, el SDK enviará datos de audio redundantes sobre la detección de la pérdida de paquetes para ayudar a reducir sus efectos en la calidad de audio. Se pueden encontrar más detalles en la sección de audio redundante .
ReconnecttimeOutms: el valor predeterminado es de 180,000 ms. Use esta configuración para controlar el tiempo de espera de reconectación de la sesión debido a una condición de red deficiente.
Nota: Para evitar perderse cualquier evento, agregue un observador antes de que comience la sesión. Puede eliminar el observador llamando a Meetingsession.audiovideo.removeaudiovideoBserver (observador).
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)
Lista de dispositivos de audio disponibles para la reunión.
val audioDevices = meetingSession.audioVideo.listAudioDevices()
// A list of MediaDevice objects
audioDevices.forEach {
logger.info( TAG , " Device type: ${it.type} , label: ${it.label} " )
}
MediaDevice
.Nota: Debe llamar a ChooseAudiodeVice después de que comenzó la sesión, o será una OP no-op. También debe llamar a ChooseAdiodeVice con uno de los dispositivos devueltos de LataudioDevices.
// 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)
Nota: SwitchCamera () es un NO-OP si está utilizando una fuente de captura de cámara personalizada. Consulte el video personalizado para obtener más detalles.
Cambie entre la cámara delantera o trasera en el dispositivo, si está disponible.
meetingSession.audioVideo.switchCamera()
Agregue un DeviceChangeObserver
para recibir una devolución de llamada cuando se conecta un nuevo dispositivo de audio o cuando se desconecte un dispositivo de audio. onAudioDeviceChanged
incluye una lista de dispositivos actualizado.
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)
NOTA: La API
getActiveAudioDevice
requiere el nivel de API 24 o superior.
if ( Build . VERSION . SDK_INT >= Build . VERSION_CODES . N ) {
val activeAudioDevice = meetingSession.audioVideo.getActiveAudioDevice()
}
Para niveles de API más bajos, los constructores pueden lograr lo mismo rastreando el dispositivo seleccionado con la siguiente lógica:
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
}
Al unirse a una reunión, cada configuración tendrá un valor predeterminado, si no se especifica explícitamente, al comenzar la sesión de audio.
- Opciones de audiomodo compatible: mono/16kHz , mono/48kHz y estéreo/48kHz . El valor predeterminado es estéreo/48 kHz .
- Opciones compatibles de AudioDeviceCapabilities: Entrada y salida , solo salida y ninguna . El valor predeterminado es la entrada y la salida .
- Opciones de AudiostreamType compatibles: VoiceCall y Music . El valor predeterminado es vocecall
- Opciones compatibles de AudiorCordingPreseToverride: Ninguna , genérica , videocámara , Voicerecognition y VoiceComunicación . El valor predeterminado es ninguno .
- Opciones compatibles de EnleaudiONEdundancy: Verdadero y falso . El valor predeterminado es verdadero .
- Valores compatibles de ReconnectTimeOutms: enteros mayores o iguales a 0. El valor predeterminado es 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]
Nota: Hasta ahora, ha agregado observadores para recibir eventos de ciclo de vida del dispositivo y sesión. En los siguientes casos de uso, utilizará los métodos API en tiempo real para enviar y recibir indicadores de volumen y controlar el estado de silencio.
val muted = meetingSession.audioVideo.realtimeLocalMute() // returns true if muted, false if failed
val unmuted = meetingSession.audioVideo.realtimeLocalUnmute() // returns true if unmuted, false if failed
Puede usar esto para crear indicadores en tiempo real de la interfaz de usuario y actualizarlos para los cambios entregados por la matriz.
Nota: Estas devoluciones de llamada solo incluirán el Delta de la devolución de llamada anterior.
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)
Puede usar el evento onActiveSpeakerDetected
para ampliar o enfatizar el mosaico de video más activo si está disponible. Al establecer el scoreCallbackIntervalMs
e implementar onActiveSpeakerScoreChanged
, puede recibir puntajes de los altavoces activos periódicamente.
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)
Nota: Deberá vincular el video a un
VideoRenderView
para representarlo.Se puede identificar un mosaico de video local utilizando la propiedad
isLocalTile
.Se puede identificar un mosaico de video de contenido utilizando la propiedad
isContent
. Vea la pantalla y el contenido compartido.Se crea un mosaico con una nueva ID de mosaico cuando el mismo asistente remoto reinicia el video.
Puede encontrar más detalles sobre cómo agregar/eliminar/ver el video de la construcción de una aplicación de reunión en Android utilizando el SDK de Amazon Chime.
Puede llamar startRemoteVideo
para comenzar a recibir videos remotos, ya que esto no sucede de forma predeterminada.
meetingSession.audioVideo.startRemoteVideo()
stopRemoteVideo
deja de recibir videos remotos y desencadenantes onVideoTileRemoved
para los videos remotos existentes.
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)
Para una gestión de baldosas de video más avanzada, eche un vistazo a la paginación de 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)
Nota: Cuando usted u otros asistentes comparten contenido (por ejemplo, captura de pantalla o cualquier otro objeto de videoseurce), el asistente de contenido (Contenido de#ID#de asistente) se une a la sesión y comparte contenido como si un asistente regular comparta un video.
Por ejemplo, su identificación de asistente es "my-id". Cuando llamas
meetingSession.audioVideo.startContentShare
, el asistente de contenido "My-ID#Content" se unirá a la sesión y compartirá tu contenido.
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)
Puede establecer la configuración para el contenido compartido, por ejemplo, maxbitratekbps. La calidad real lograda puede variar a lo largo de la llamada dependiendo de qué sistema y red puedan proporcionar.
val contentShareConfig = LocalVideoConfiguration ( 200 )
meetingSession.audioVideo.startContentShare(contentShareSource, contentShareConfig)
Vea el contenido compartido para más detalles.
meetingSession.audioVideo.stopContentShare()
Chime SDK permite dos acciones de contenido simultáneo por reunión. Las acciones de contenido remoto activarán onVideoTileAdded
, mientras que la acción local no lo hará. Para representar el video para la vista previa, agregue un VideoSink
el videos en el VideoSource
en el 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)
Consulte ObservableMetric
para obtener más métricas disponibles y para monitorear la calidad del audio, el video y el contenido compartido.
val observer = object : MetricsObserver {
override fun onMetricsReceived ( metrics : Map < ObservableMetric , Any >) {
metrics.forEach { (metricsName, metricsValue) ->
logger.info( TAG , " $metricsName : $metricsValue " )
}
}
}
meetingSession.audioVideo.addMetricsObserver(observer)
Puede recibir mensajes en tiempo real de múltiples temas después de comenzar la sesión de reunión.
Nota: Los mensajes de datos enviados desde el participante local no activarán esta devolución de llamada a menos que esté estruendida.
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)
Puede enviar un mensaje en tiempo real a cualquier tema, al que se notificará a los observadores que se han suscrito.
Nota: El tema debe ser alfa-numérico y puede incluir guiones y subrayos. Los datos no pueden exceder 2KB y la vida útil es opcional pero positiva entera.
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
)
Nota: asegúrese de eliminar todos los observadores y liberar los recursos que ha agregado para evitar cualquier filtración de memoria.
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 reduce el ruido de fondo en la reunión para una mejor experiencia en la reunión. Para más detalles, consulte 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
La fuente de video personalizada le permite controlar el video, como aplicar un filtro de video. Para más detalles, consulte Video personalizado.
El desenfoque/reemplazo de fondo le permite aplicar desenfoque o reemplazar el fondo de su video con una imagen. Para más detalles, consulte BackgroundFilter.
A partir de la versión 0.18.3, el SDK comienza a enviar datos de audio redundantes a nuestros servidores para detectar la pérdida de paquetes para ayudar a reducir su efecto en la calidad de audio. Los paquetes de audio redundantes solo se envían para paquetes que contienen audio activo, es decir, discurso o música. Esto puede aumentar el ancho de banda consumido por audio a hasta 3 veces la cantidad normal dependiendo de la cantidad de pérdida de paquetes detectada. El SDK dejará de enviar automáticamente datos redundantes si no ha detectado ninguna pérdida de paquete durante 5 minutos.
Si necesita deshabilitar esta función, puede hacerlo a través de AudiovideOconfiguration antes de comenzar la sesión.
meetingSession.audioVideo.start( AudioVideoConfiguration (enableAudioRedundancy = false ))
Si bien hay una opción para deshabilitar la función, recomendamos mantenerla habilitada para mejorar la calidad de audio. Una posible razón para deshabilitarlo podría ser si sus clientes tienen limitaciones de ancho de banda muy estrictas.
Consulte las preguntas frecuentes generales para Amazon Chime SDK.
Las aplicaciones pueden obtener registros de Chime SDK pasando instancias de Logger al crear reuniones. Amazon Chime SDK tiene algunas implementaciones predeterminadas de Logger que su aplicación puede usar, como Consolelogger que inicia sesión en la consola. ConsoleLogger
se establece en el nivel INFO
como predeterminado. Por lo tanto, para obtener todos los registros, incluidos los registros de medios, cree registrador siguiendo:
val logger = ConsoleLogger ( LogLevel . VERBOSE )
El SDK usa OpenSl ES debajo, lo que requiere la configuración de la grabación de preajustes mientras se abre la conexión al dispositivo de micrófono. Hemos descubierto que no hay un valor preestablecido específico que funcione bien en todos los dispositivos Android posibles. El SDK utiliza un preajuste predeterminado de VoiceCommunication
al que hemos llegado después de ejecutar algunas pruebas en los dispositivos en nuestra posesión. Si este preajuste predeterminado no funciona y está llevando a que la parte remota no pueda escucharlo, intente comenzar la sesión con un preajuste de grabación diferente especificando audioRecordingPresetOverride
en la AudioVideoConfiguration
que se pasa a la API de inicio.
// Creating a config where the preset is overriden with Generic (for example)
val audioVideoConfig = AudioVideoConfiguration (audioRecordingPresetOverride = AudioRecordingPresetOverride . Generic )
// Start Audio Video
audioVideo.start(audioVideoConfig)
El uso del reemplazo de fondo está sujeto a una notificación adicional. Usted y sus usuarios finales son responsables de todo el contenido (incluidas las imágenes) cargadas para su uso con reemplazo de fondo, y deben asegurarse de que dicho contenido no viole la ley, infringe o apropie mal los derechos de cualquier tercero, o de otra manera viole un término material. de su acuerdo con Amazon (incluida la documentación, los términos de servicio de AWS o la política de uso aceptable).
Copyright Amazon.com, Inc. o sus afiliados. Reservados todos los derechos.