Placa de projeto sdk sdk da Amazon
NOTA: Se a construção do código-fonte do SDK, a filial
development
contém alterações de borda de sangramento que podem não ser construídas com a biblioteca de mídia de chime publicamente disponíveis ou pode não ser tão estável quanto os lançamentos públicos.
O Amazon Chime SDK para Android facilita a adição de recursos colaborativos de chamadas de áudio, videochamadas e compartilhamento de tela aos aplicativos Android usando os mesmos serviços de infraestrutura que as reuniões de alimentação do Amazon Chime Service.
Este sdk do Amazon Chime para o Android funciona conectando -se à reunião de recursos de sessão que você criou em sua conta da AWS. O SDK tem tudo o que você precisa para criar experiências personalizadas de chamadas e colaboração em seu aplicativo Android, incluindo métodos para: Configurar sessões de reunião, listar e selecionar dispositivos de áudio, alternar dispositivos de vídeo, iniciar e interromper a exibição da tela, receber retornos de chamada quando eventos de mídia ocorrem tais tais como mudanças de volume e gerenciar recursos de reunião, como mudo de áudio e encadernações de ladrilhos de vídeo.
Também temos um quadro de projetos do Amazon Chime SDK, onde você pode encontrar solicitações da comunidade e seus status.
Para começar, consulte os seguintes recursos:
E revise os seguintes guias:
Nota: Se você deseja apenas executar o aplicativo de demonstração, pule para a execução do aplicativo de demonstração
Os SDKs móveis para Android podem ser baixados do repositório central do MAVEN, integrados aos arquivos gradle do seu projeto Android, ou você pode ser incorporado diretamente por meio de arquivos .aar.
Para fins de configuração, a pasta raiz do seu projeto será chamada de root
.
Para obter as dependências do Maven, adicione as dependências ao seu aplicativo (nível de módulo) build.gradle
.
Update build.gradle
no root/app
e adicione o seguinte em dependencies
:
dependencies {
implementation 'software.aws.chimesdk:amazon-chime-sdk-media:$MEDIA_VERSION'
implementation 'software.aws.chimesdk:amazon-chime-sdk:$SDK_VERSION'
}
Os números da versão podem ser obtidos da versão mais recente.
Se você não precisar de funcionalidade de compartilhamento de vídeo e conteúdo ou suporte ao codec de vídeo de software, poderá usar amazon-chime-sdk-media-no-video-codecs
para reduzir o tamanho. Exclua o uso do módulo amazon-chime-sdk-media
e/ou Módulo amazon-chime-sdk-machine-learning
da dependência transitiva do 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'
}
}
Agora, os projetos podem criar alvos ARM e X86, o que pode ser útil se agrupar um aplicativo. Os alvos x86 não funcionarão e não devem ser instalados ou executados em nenhum dispositivo ou emulador X86. IMPORTANTE: Somente dispositivos ARM são suportados.
Se você precisar de stubs x86 não funcionais no binário da mídia para agrupar seu aplicativo, poderá anexar -x86-stub
à dependência de mídia escolhida. Por exemplo:
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 os binários do SDK em seu próprio projeto, siga estas etapas.
Faça o download dos binários amazon-chime-sdk
e amazon-chime-sdk-media
a partir do último lançamento.
Se você gosta de usar mais recursos de aprendizado de máquina, por exemplo, Blurb/Substacting, faça o download do Binário amazon-chime-sdk-machine-learning
a partir da versão mais recente. Caso contrário, você pode ignorar todas as referências ao amazon-chime-sdk-machine-learning
nas instruções abaixo.
Se você não precisar de funcionalidade de compartilhamento de vídeo e conteúdo ou suporte ao codec de vídeo de software, poderá usar amazon-chime-sdk-media-no-video-codecs
em vez de amazon-chime-sdk-media
para excluir o suporte ao codecs de videogame de software e reduzir o tamanho. Se o fizer, você pode tratar todas as referências ao amazon-chime-sdk-media
como amazon-chime-sdk-media-no-video-codecs
nas instruções abaixo.
Agora, os projetos podem criar alvos ARM e X86, o que pode ser útil se agrupar um aplicativo. Os alvos x86 não funcionarão e não devem ser instalados ou executados em nenhum dispositivo ou emulador X86. IMPORTANTE: Somente dispositivos ARM são suportados.
Se você precisar de stubs x86 não funcionais combinados com arquiteturas de braço totalmente funcionais para agrupar seu aplicativo, você pode usar amazon-chime-sdk-media-x86-stub
ou amazon-chime-sdk-media-no-video-codecs-x86-stub
Binários de mídia amazon-chime-sdk-media-no-video-codecs-x86-stub
e substituem-os por referências amazon-chime-sdk-media
nas instruções abaixo.
Nota: Não suportamos binários de mistura e correspondência de diferentes lançamentos.
Descompacione -os e copie os arquivos AAR para root/app/libs
Update build.gradle
no root
, adicionando o seguinte nos repositories
em allprojects
:
allprojects {
repositories {
jcenter()
flatDir {
dirs 'libs'
}
}
}
Update build.gradle
no root/app
e adicione o seguinte em dependencies
:
implementation(name: 'amazon-chime-sdk', ext: 'aar')
implementation(name: 'amazon-chime-sdk-media', ext: 'aar')
Se você estiver usando a Biblioteca amazon-chime-sdk-machine-learning
, adicione a instrução abaixo também em dependencies
:
implementation(name: 'amazon-chime-sdk-machine-learning', ext: 'aar')
Update build.gradle
em root/app
em compileOptions
:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
Nota: Isso é apenas para executar o aplicativo de demonstração e usar o SDK como código em vez da biblioteca AAR.
Para executar o aplicativo de demonstração, siga estas etapas.
NOTA: Certifique -se de que você esteja executando em dispositivos suportados pelo ARM (dispositivos reais) ou simulador com o ARM suportado. Atualmente, não apoiamos o X86, os simuladores com X86 não funcionarão.
Implante a demonstração sem servidor da Amazon-Chime-sdk-js, que retorna https://xxxxx.xxxxx.xxx.com/Prod/
Forneça https://xxxxx.xxxxx.xxx.com/Prod/
para aplicativo de demonstração móvel.
Faça o download do binário amazon-chime-sdk-media
do último lançamento.
Faça o download do Binário amazon-chime-sdk-machine-learning
para recursos de aprendizado de máquina.
Descompacte e copie os arquivos AAR para amazon-chime-sdk-android/amazon-chime-sdk/libs
Atualize test_url
em strings.xml
no caminho amazon-chime-sdk-android/app/src/main/res/values
com o URL da demonstração sem servidor implantada na etapa 1.
Nota: Use
https://xxxxx.xxxxx.xxx.com/Prod/
Se você descobrir um problema de segurança em potencial neste projeto, solicitamos que você notifique a segurança da AWS/Amazon por meio de nossa página de relatório de vulnerabilidades. Por favor, não crie um problema público do github.
Você precisa iniciar a sessão de reuniões para começar a enviar e receber áudio.
Inicie uma sessão com configurações padrão:
meetingSession.audioVideo.start()
Inicie uma sessão com configurações personalizadas:
meetingSession.audioVideo.start(audioVideoConfiguration)
Essas configurações estão disponíveis no audioVideoConfiguration
:
audioMode
audioDeviceCapabilities
audioStreamType
audioRecordingPresetOverride
enableAudioRedundancy
reconnectTimeoutMs
Audiomode: o formato de áudio padrão é estéreo/48kHz IE Audio estéreo com taxa de amostragem de 48kHz (estéreo48k). Outros formatos de áudio suportados incluem mono/48kHz (mono48k) ou mono/16kHz (mono16k). Você pode especificar um modo de áudio não padrão na AudioVideoConfiguration
e iniciar a sessão de reunião.
AudiODeviceCapabilities: Os recursos de dispositivo de áudio padrão devem ter os dispositivos de entrada e saída de áudio ativados ( InputAndOutput
), ou seja, o microfone e o alto -falante estão ativados. InputAndOutput
exigirá MODIFY_AUDIO_SETTINGS
e RECORD_AUDIO
Permissions. Outras opções são OutputOnly
(microfone desativadas e alto -falante ativado; requer MODIFY_AUDIO_SETTINGS
permissão) e None
(tanto o microfone quanto o alto -falante desativado; não requer permissões de áudio).
AudiosTreamType: o valor padrão é VoiceCall
. As opções disponíveis são VoiceCall
e Music
, elas são equivalentes a STREAM_VOICE_CALL
e STREAM_MUSIC
respectivamente, no Audiomanager. Essa configuração é para abordar o problema de volume de áudio no Oculus Quest 2. Se você não sabe o que é, provavelmente não precisa se preocupar com isso. Para obter mais informações, consulte a documentação do Android: stream_voice_call, stream_music.
NOTA: Embora existam mais opções de fluxo disponíveis no Android, atualmente apenas Stream_voice_Call e Stream_Music são suportados no Amazon Chime SDK para Android.
AudiorEcordingPreseToToSoRride: o valor padrão é None
. As opções disponíveis None
são, Generic
, Camcorder
, VoiceRecognition
e VoiceCommunication
. Eles são equivalentes às opções mencionadas aqui na configuração do Android AudiorEcorder .
EnableaudiorDundância: o valor padrão é verdadeiro. Quando ativado, o SDK enviará dados redundantes de áudio sobre a detecção de perda de pacotes para ajudar a reduzir seus efeitos na qualidade do áudio. Mais detalhes podem ser encontrados na seção de áudio redundante .
ReconectTimeoutMs: O valor padrão é de 180.000 mm. Use essa configuração para controlar o tempo limite da sessão devido à baixa condição da rede.
NOTA: Para evitar a falta de eventos, adicione um observador antes do início da sessão. Você pode remover o observador ligando para a reunião.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)
Liste os dispositivos de áudio disponíveis para a reunião.
val audioDevices = meetingSession.audioVideo.listAudioDevices()
// A list of MediaDevice objects
audioDevices.forEach {
logger.info( TAG , " Device type: ${it.type} , label: ${it.label} " )
}
MediaDevice
.NOTA: Você deve ligar para o ChoosEaudiodEvice após o início da sessão, ou será um não-operatório. Você também deve chamar ChooseAudiodEvice com um dos dispositivos retornados do 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)
Nota: SwitchCamera () é um não-OP se você estiver usando uma fonte de captura de câmera personalizada. Consulte o vídeo personalizado para obter mais detalhes.
Alterne entre a câmera frontal ou traseira no dispositivo, se disponível.
meetingSession.audioVideo.switchCamera()
Adicione um DeviceChangeObserver
para receber um retorno de chamada quando um novo dispositivo de áudio se conectar ou quando um dispositivo de áudio se desconectar. onAudioDeviceChanged
inclui uma lista de dispositivos atualizados.
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: A API
getActiveAudioDevice
requer nível de API 24 ou superior.
if ( Build . VERSION . SDK_INT >= Build . VERSION_CODES . N ) {
val activeAudioDevice = meetingSession.audioVideo.getActiveAudioDevice()
}
Para níveis mais baixos de API, os construtores podem alcançar o mesmo rastreando o dispositivo selecionado com a seguinte 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
}
Ao ingressar em uma reunião, cada configuração terá um padrão se não for especificado explicitamente ao iniciar a sessão de áudio.
- Opções de audiomode suportadas: mono/16kHz , mono/48khz e estéreo/48khz . O padrão é estéreo/48kHz .
- Opções de AudiODeviceCababilities suportadas: entrada e saída , somente saída e nenhuma . O padrão é entrada e saída .
- Opções do AudiosTreamType suportadas: VoiceCall e Music . O padrão é VoiceCall
- Opções AudiorRecordingPetoverride suportadas: Nenhum , genérico , câmera de câmera de vídeo , VoiceRecognition e Voic -Communication . Padrão não é.
- Opções de Suporte de Suporte de Suporte: Verdadeiro e Falso . O padrão é verdadeiro .
- ReconnectTimeoutMs suportados Valores: números inteiros maiores ou iguais a 0. O padrão é 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: Até agora, você adicionou observadores para receber eventos do ciclo de vida do dispositivo e da sessão. Nos casos de uso a seguir, você usará os métodos da API em tempo real para enviar e receber indicadores de volume e controlar o estado mudo.
val muted = meetingSession.audioVideo.realtimeLocalMute() // returns true if muted, false if failed
val unmuted = meetingSession.audioVideo.realtimeLocalUnmute() // returns true if unmuted, false if failed
Você pode usar isso para criar indicadores de interface do tempo em tempo real e atualizá-los para alterações entregues pela matriz.
Nota: esses retornos de chamada incluirão apenas o delta do retorno de chamada 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)
Você pode usar o evento onActiveSpeakerDetected
para ampliar ou enfatizar o ladrilho de vídeo do alto -falante mais ativo, se disponível. Ao definir o scoreCallbackIntervalMs
e implementar onActiveSpeakerScoreChanged
, você pode receber pontuações dos alto -falantes ativos periodicamente.
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: Você precisará vincular o vídeo a uma
VideoRenderView
para renderizá -lo.Um ladrilho de vídeo local pode ser identificado usando a propriedade
isLocalTile
.Um ladrilho de vídeo de conteúdo pode ser identificado usando a propriedade
isContent
. Consulte a tela e o compartilhamento de conteúdo.Um ladrilho é criado com um novo ID de ladrilhos quando o mesmo participante remoto reinicia o vídeo.
Você pode encontrar mais detalhes sobre como adicionar/remover/visualizar o vídeo da criação de um pedido de reunião no Android usando o Amazon Chime SDK.
Você pode ligar para startRemoteVideo
para começar a receber vídeos remotos, pois isso não acontece por padrão.
meetingSession.audioVideo.startRemoteVideo()
stopRemoteVideo
para de receber vídeos remotos e gatilhos onVideoTileRemoved
para vídeos 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 um gerenciamento de ladrilhos de vídeo mais avançado, dê uma olhada na paginação em vídeo.
// 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: Quando você ou outros participantes compartilham conteúdo (por exemplo, captura de tela ou qualquer outro objeto de vídeo e o conteúdo (conteúdo do participante-id) se junta à sessão e compartilha o conteúdo como se um participante regular compartilhasse um vídeo.
Por exemplo, seu ID do participante é "meu id". Quando você liga para
meetingSession.audioVideo.startContentShare
, o participante do conteúdo "My-Id#Content" participará da sessão e compartilhará seu conteúdo.
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)
Você pode definir a configuração para compartilhar conteúdo, por exemplo, maxbitratekbps. A qualidade real alcançada pode variar ao longo da chamada, dependendo de qual sistema e rede podem fornecer.
val contentShareConfig = LocalVideoConfiguration ( 200 )
meetingSession.audioVideo.startContentShare(contentShareSource, contentShareConfig)
Consulte Compartilhe de conteúdo para obter mais detalhes.
meetingSession.audioVideo.stopContentShare()
O Chime SDK permite duas ações simultâneas de conteúdo por reunião. As ações de conteúdo remoto desencadearão onVideoTileAdded
, enquanto o compartilhamento local não. Para renderizar o vídeo para visualização, adicione um VideoSink
ao VideoSource
no 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 obter mais métricas disponíveis e para monitorar a qualidade de compartilhamento de áudio, vídeo e conteúdo.
val observer = object : MetricsObserver {
override fun onMetricsReceived ( metrics : Map < ObservableMetric , Any >) {
metrics.forEach { (metricsName, metricsValue) ->
logger.info( TAG , " $metricsName : $metricsValue " )
}
}
}
meetingSession.audioVideo.addMetricsObserver(observer)
Você pode receber mensagens em tempo real de vários tópicos após iniciar a sessão de reunião.
NOTA: As mensagens de dados enviadas do participante local não acionarão esse retorno de chamada, a menos que seja acelerado.
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)
Você pode enviar uma mensagem em tempo real para qualquer tópico, ao qual os observadores que se inscreveram serão notificados.
Nota: O tópico precisa ser alfa-numérico e pode incluir hífen e sublinhado. Os dados não podem exceder 2KB e a vida útil é opcional, mas inteiro positivo.
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: Certifique -se de remover todos os observadores e liberar recursos que você adicionou para evitar vazamentos de memória.
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()
O foco da voz da Amazon reduz o ruído de fundo na reunião para uma melhor experiência em reuniões. Para mais detalhes, consulte a 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
A fonte de vídeo personalizada permite controlar o vídeo, como aplicar um filtro de vídeo. Para mais detalhes, consulte o vídeo personalizado.
Blurs/substituição de fundo permite aplicar o Blur ou substituir o plano de fundo do seu vídeo por uma imagem. Para mais detalhes, consulte o BackgroundFilter.
A partir da versão 0.18.3, o SDK começa a enviar dados de áudio redundantes para nossos servidores na detecção de perda de pacotes para ajudar a reduzir seu efeito na qualidade do áudio. Pacotes de áudio redundantes são enviados apenas para pacotes que contêm áudio ativo, discurso ou música. Isso pode aumentar a largura de banda consumida por áudio para até 3 vezes a quantidade normal, dependendo da quantidade de perda de pacotes detectada. O SDK parará automaticamente de enviar dados redundantes se não tiver detectado nenhuma perda de pacotes por 5 minutos.
Se você precisar desativar esse recurso, poderá fazê -lo através do AudioVideoconfiguration antes de iniciar a sessão.
meetingSession.audioVideo.start( AudioVideoConfiguration (enableAudioRedundancy = false ))
Embora exista uma opção para desativar o recurso, recomendamos mantê -lo ativado para melhorar a qualidade do áudio. Uma razão possível para desativar pode ser se seus clientes tiverem limitações muito rígidas de largura de banda.
Consulte as Perguntas frequentes em geral para o Amazon Chime SDK.
Os aplicativos podem obter logs do Chime SDK, passando instâncias de Logger ao criar a entrega. O Amazon Chime SDK possui algumas implementações padrão do Logger que seu aplicativo pode usar, como o consolelogger que faz login no console. ConsoleLogger
está definido como o nível INFO
como padrão. Portanto, para obter todos os logs, incluindo logs de mídia, crie o Logger seguindo:
val logger = ConsoleLogger ( LogLevel . VERBOSE )
O SDK usa o OpenSl es, que requer a configuração de predefinições de gravação ao abrir a conexão com o dispositivo microfone. Descobrimos que não há um valor predefinido específico que funcione bem em todos os dispositivos Android possíveis. O SDK usa uma predefinição padrão de VoiceCommunication
, que chegamos depois de executar alguns testes nos dispositivos em nossa posse. Se essa predefinição padrão não funcionar e estiver levando a parte remota não poder ouvi -lo, tente iniciar a sessão com uma predefinição de gravação diferente, especificando audioRecordingPresetOverride
na AudioVideoConfiguration
que é passado para a API inicial.
// Creating a config where the preset is overriden with Generic (for example)
val audioVideoConfig = AudioVideoConfiguration (audioRecordingPresetOverride = AudioRecordingPresetOverride . Generic )
// Start Audio Video
audioVideo.start(audioVideoConfig)
O uso da substituição de fundo está sujeito a um aviso adicional. Você e seus usuários finais são responsáveis por todo o conteúdo (incluindo quaisquer imagens) carregados para uso com substituição de fundo e devem garantir que esse conteúdo não viole a lei, infrinja ou apropriou indefinir os direitos de terceiros ou violar um termo material do seu contrato com a Amazon (incluindo a documentação, os termos de serviço da AWS ou a política de uso aceitável).
Copyright Amazon.com, Inc. ou suas afiliadas. Todos os direitos reservados.