Tableau de projet Amazon Chime SDK
Remarque: Si la construction avec le code source du SDK, la branche
development
contient des modifications de saignement qui peuvent ne pas construire avec la bibliothèque de médias de carillon accessible au public ou qui peuvent ne pas être aussi stables que les versions publiques.
Le SDK Amazon Chime pour Android facilite l'ajout d'appels audio collaboratifs, les appels vidéo et les fonctionnalités de visualisation de partage d'écran vers les applications Android en utilisant les mêmes services d'infrastructure que les réunions d'alimentation sur le service Amazon Chime.
Ce SDK Amazon Chime pour Android fonctionne en se connectant aux ressources de session de réunion que vous avez créées dans votre compte AWS. Le SDK propose tout ce dont vous avez besoin pour créer des expériences d'appels et de collaboration personnalisées dans votre application Android, y compris des méthodes pour: Configurer les séances de réunion, liste et sélectionner les appareils audio, changer les appareils vidéo, démarrer et arrêter la visualisation de l'écran, recevoir des rappels lorsque les événements médiatiques se produisent tels À mesure que le volume change et gérer les fonctionnalités de réunion telles que les liaisons audio muet et carreaux vidéo.
Nous avons également un conseil de projet Amazon Chime SDK où vous pouvez trouver des demandes de communauté et leurs statuts.
Pour commencer, voir les ressources suivantes:
Et passez en revue les guides suivants:
Remarque: si vous souhaitez simplement exécuter une application de démonstration, passez à l'exécution de l'application de démonstration
Les SDK mobiles pour Android pourraient être téléchargés à partir du référentiel Maven Central, par intégré dans les fichiers Gradle de votre projet Android, ou vous pouvez être directement intégré via des fichiers .aar.
Aux fins de la configuration, le dossier racine de votre projet sera appelé root
.
Pour obtenir les dépendances de Maven, ajoutez les dépendances à build.gradle
de votre application (niveau du module).
Mettre à jour build.gradle
dans root/app
et ajouter ce qui suit sous dependencies
:
dependencies {
implementation 'software.aws.chimesdk:amazon-chime-sdk-media:$MEDIA_VERSION'
implementation 'software.aws.chimesdk:amazon-chime-sdk:$SDK_VERSION'
}
Les numéros de version pourraient être obtenus à partir de la dernière version.
Si vous n'avez pas besoin de fonctionnalités de partage vidéo et de contenu ou de support de codec vidéo logiciel, vous pouvez utiliser amazon-chime-sdk-media-no-video-codecs
à la place pour réduire la taille. Exclure l'utilisation du module amazon-chime-sdk-media
et / ou du module amazon-chime-sdk-machine-learning
de la dépendance transitive d' 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'
}
}
Les projets peuvent désormais construire des objectifs ARM et x86, ce qui peut être utile si vous regroupant une application. Les cibles x86 ne fonctionneront pas et ne sont pas destinées à être installées ou à exécuter sur un appareil ou un émulateur x86. IMPORTANT: Seuls les appareils ARM sont pris en charge.
Si vous avez besoin de talons x86 non fonctionnels dans le binaire multimédia afin de regrouper votre application, vous pouvez ajouter -x86-stub
à la dépendance multimédia choisie. Par exemple:
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'
}
}
Pour inclure les binaires SDK dans votre propre projet, suivez ces étapes.
Téléchargez amazon-chime-sdk
et amazon-chime-sdk-media
Binaires de la dernière version.
Si vous aimez utiliser plus de fonctionnalités d'apprentissage automatique, par exemple, le flou / remplacement d'arrière-plan, téléchargez également le binaire amazon-chime-sdk-machine-learning
à partir de la dernière version. Sinon, vous pouvez ignorer toutes les références à amazon-chime-sdk-machine-learning
dans les instructions ci-dessous.
Si vous n'avez pas besoin de fonctionnalités de partage vidéo et de contenu ou de support de codec vidéo logiciel, vous pouvez utiliser amazon-chime-sdk-media-no-video-codecs
au lieu d' amazon-chime-sdk-media
pour exclure la prise en charge des codecs vidéo logiciels et réduire la taille. Si vous le faites, vous pouvez traiter toutes les références à amazon-chime-sdk-media
en tant qu'Amazon amazon-chime-sdk-media-no-video-codecs
dans les instructions ci-dessous.
Les projets peuvent désormais construire des objectifs ARM et x86, ce qui peut être utile si vous regroupant une application. Les cibles x86 ne fonctionneront pas et ne sont pas destinées à être installées ou à exécuter sur un appareil ou un émulateur x86. IMPORTANT: Seuls les appareils ARM sont pris en charge.
Si vous avez besoin de talons x86 non fonctionnels combinés avec des architectures de bras entièrement fonctionnelles afin de regrouper votre application, vous pouvez utiliser amazon-chime-sdk-media-x86-stub
ou amazon-chime-sdk-media-no-video-codecs-x86-stub
Les binaires de médias amazon-chime-sdk-media-no-video-codecs-x86-stub
et les remplacer par les références amazon-chime-sdk-media
dans les instructions ci-dessous.
Remarque: Nous ne prenons pas en charge le mélange et les binaires correspondants à partir de différentes versions.
Décompressez-les et copiez les fichiers AAR sur root/app/libs
Mettre à jour build.gradle
in root
en ajoutant ce qui suit sous repositories
dans allprojects
:
allprojects {
repositories {
jcenter()
flatDir {
dirs 'libs'
}
}
}
Mettre à jour build.gradle
dans root/app
et ajouter ce qui suit sous dependencies
:
implementation(name: 'amazon-chime-sdk', ext: 'aar')
implementation(name: 'amazon-chime-sdk-media', ext: 'aar')
Si vous utilisez la bibliothèque amazon-chime-sdk-machine-learning
, ajoutez également la déclaration ci-dessous sous dependencies
:
implementation(name: 'amazon-chime-sdk-machine-learning', ext: 'aar')
Mise à jour build.gradle
dans root/app
sous compileOptions
:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
Remarque: il s'agit simplement d'exécuter l'application de démonstration et d'utiliser le SDK comme code au lieu de la bibliothèque AAR.
Pour exécuter l'application de démonstration, suivez ces étapes.
Remarque: Veuillez vous assurer que vous utilisez des appareils pris en charge ARM (appareils réels) ou un simulateur avec le bras pris en charge. Nous ne prenons pas en charge x86 actuellement, donc les simulateurs avec x86 ne fonctionneront pas.
Déployez la démo sans serveur à partir d'Amazon-Chime-Sdk-js, qui renvoie https://xxxxx.xxxxx.xxx.com/Prod/
Fournissez https://xxxxx.xxxxx.xxx.com/Prod/
pour l'application de démonstration mobile.
Téléchargez le binaire amazon-chime-sdk-media
à partir de la dernière version.
Téléchargez le binaire amazon-chime-sdk-machine-learning
pour les fonctionnalités d'apprentissage automatique.
Décompressez et copiez les fichiers AAR sur amazon-chime-sdk-android/amazon-chime-sdk/libs
Mettez à jour test_url
dans strings.xml
sur le chemin amazon-chime-sdk-android/app/src/main/res/values
avec l'URL de la démonstration sans serveur déployée à l'étape 1.
Remarque: utilisez
https://xxxxx.xxxxx.xxx.com/Prod/
Si vous découvrez un problème de sécurité potentiel dans ce projet, nous vous demandons d'informer AWS / Amazon Security via notre page de rapport de vulnérabilité. Veuillez ne pas créer de problème de github public.
Vous devez démarrer la session de réunion pour commencer à envoyer et à recevoir du son.
Démarrez une session avec des configurations par défaut:
meetingSession.audioVideo.start()
Démarrez une session avec des configurations personnalisées:
meetingSession.audioVideo.start(audioVideoConfiguration)
Ces configurations sont disponibles dans audioVideoConfiguration
:
audioMode
audioDeviceCapabilities
audioStreamType
audioRecordingPresetOverride
enableAudioRedundancy
reconnectTimeoutMs
Audiomode: Le format audio par défaut est l'audio stéréo stéréo / 48KHz IE avec un taux d'échantillonnage de 48 kHz (stéréo48k). Les autres formats audio pris en charge incluent le mono / 48 kHz (mono48k) ou le mono / 16 kHz (mono16k). Vous pouvez spécifier un mode audio non défaut dans AudioVideoConfiguration
, puis démarrer la session de réunion.
AudiodEviceCapabilités: les capacités de périphérique audio par défaut sont que les périphériques d'entrée et de sortie audio sont activés ( InputAndOutput
), c'est-à-dire que le microphone et le haut-parleur sont activés. InputAndOutput
nécessitera les autorisations MODIFY_AUDIO_SETTINGS
et RECORD_AUDIO
. D'autres options sont OutputOnly
(microphone désactivées et le haut-parleur activées; nécessite la permission MODIFY_AUDIO_SETTINGS
) et None
(le microphone et le haut-parleur désactivés; ne nécessitent aucune autorisation audio).
AudiostreAmType: la valeur par défaut est VoiceCall
. Les options disponibles sont VoiceCall
et Music
, ils sont équivalents de STREAM_VOICE_CALL
et STREAM_MUSIC
respectivement dans Audiomanager. Cette configuration est pour résoudre le problème du volume audio sur Oculus Quest 2. Si vous ne savez pas ce que c'est, vous n'avez probablement pas à vous en soucier. Pour plus d'informations, veuillez consulter la documentation Android: Stream_Voice_Call, Stream_Music.
Remarque: Même s'il existe plus d'options de flux disponibles dans Android, actuellement Stream_Voice_Call et Stream_Music sont pris en charge dans Amazon Chime SDK pour Android.
AudioreCorDingPresetOverride: la valeur par défaut None
. Les options disponibles ne sont None
, Generic
, Camcorder
, VoiceRecognition
et VoiceCommunication
. Ceux-ci sont équivalents aux options mentionnées ici sous la configuration Android AudiateCrorder .
AutoBleAudiorEdundancy: la valeur par défaut est vraie. Lorsqu'il est activé, le SDK enverra des données audio redondantes sur la détection de la perte de paquets pour aider à réduire ses effets sur la qualité de l'audio. Plus de détails peuvent être trouvés dans la section audio redondante .
ReconnectTimeoutms: La valeur par défaut est de 180 000 ms. Utilisez cette configuration pour contrôler le délai d'expiration de reconnexion en raison d'une mauvaise condition réseau.
Remarque: Pour éviter de manquer les événements, ajoutez un observateur avant le début de la session. Vous pouvez supprimer l'observateur en appelant des réunions.audiovideo.removeaudiovideoobserver (observateur).
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 des appareils audio disponibles pour la réunion.
val audioDevices = meetingSession.audioVideo.listAudioDevices()
// A list of MediaDevice objects
audioDevices.forEach {
logger.info( TAG , " Device type: ${it.type} , label: ${it.label} " )
}
MediaDevice
.Remarque: vous devez appeler ChooseAuDiodEvice après le début de la session, ou ce sera un non-opération. Vous devez également appeler ChooseAuDiodEvice avec l'un des appareils renvoyés de 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)
Remarque: SwitchCamera () est un no-op si vous utilisez une source de capture de caméra personnalisée. Veuillez vous référer à la vidéo personnalisée pour plus de détails.
Communiquez entre la caméra avant ou arrière sur l'appareil, si disponible.
meetingSession.audioVideo.switchCamera()
Ajoutez un DeviceChangeObserver
pour recevoir un rappel lorsqu'un nouveau périphérique audio se connecte ou lorsqu'un périphérique audio se déconnecte. onAudioDeviceChanged
comprend une liste de périphériques mis à jour.
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)
Remarque: L'API
getActiveAudioDevice
nécessite un niveau API 24 ou plus.
if ( Build . VERSION . SDK_INT >= Build . VERSION_CODES . N ) {
val activeAudioDevice = meetingSession.audioVideo.getActiveAudioDevice()
}
Pour les niveaux d'API inférieurs, les constructeurs peuvent atteindre la même chose en suivant le périphérique sélectionné avec la logique suivante:
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
}
Lorsque vous rejoignez une réunion, chaque configuration aura une valeur par défaut si elle n'est pas explicitement spécifiée lors du démarrage de la session audio.
- Options Audiomode prises en charge: mono / 16khz , mono / 48 kHz et stéréo / 48 kHz . La valeur par défaut est stéréo / 48 kHz .
- Options de l'AudiodEviceCapabilités prises en charge: entrée et sortie , sortie uniquement et aucune . La valeur par défaut est l'entrée et la sortie .
- Options de l'AudiostreAmType prise en charge: VoiceCall et Music . La valeur par défaut est un appel vocal
- AUDIORDING PROSETOROVERRIDE AUDIORDING OPTIONS: Aucune , générique , caméscope , VoiceRecognition et Vocal Commization . La valeur par défaut n'est pas .
- Options prises en charge de l'EnableAudiorEdundancy: vrai et fausse . La valeur par défaut est vraie .
- Valeurs de reconnexion à prise en charge: les entiers supérieurs ou égaux à 0. La valeur par défaut est de 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]
Remarque: Jusqu'à présent, vous avez ajouté des observateurs pour recevoir des événements de cycle de vie de l'appareil et de session. Dans les cas d'utilisation suivants, vous utiliserez les méthodes d'API en temps réel pour envoyer et recevoir des indicateurs de volume et contrôler l'état de la mutation.
val muted = meetingSession.audioVideo.realtimeLocalMute() // returns true if muted, false if failed
val unmuted = meetingSession.audioVideo.realtimeLocalUnmute() // returns true if unmuted, false if failed
Vous pouvez l'utiliser pour construire l'interface utilisateur des indicateurs en temps réel et les mettre à jour pour les modifications fournies par le tableau.
Remarque: Ces rappels ne comprendront que le delta du rappel précédent.
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)
Vous pouvez utiliser l'événement onActiveSpeakerDetected
pour agrandir ou souligner les tuiles vidéo du haut-parleur le plus actif si disponibles. En définissant le scoreCallbackIntervalMs
et en implémentant onActiveSpeakerScoreChanged
, vous pouvez recevoir périodiquement des scores des haut-parleurs actifs.
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)
Remarque: vous devrez lier la vidéo à un
VideoRenderView
pour le rendre.Une tuile vidéo locale peut être identifiée à l'aide de la propriété
isLocalTile
.Une tuile vidéo de contenu peut être identifiée à l'aide de la propriété
isContent
. Voir l'écran et le partage de contenu.Une tuile est créée avec un nouvel ID de tuile lorsque le même participant à distance redémarre la vidéo.
Vous pouvez trouver plus de détails sur l'ajout / supprimer / visualiser la vidéo de la création d'une application de réunion sur Android à l'aide du SDK Amazon Chime.
Vous pouvez appeler startRemoteVideo
pour commencer à recevoir des vidéos distantes, car cela ne se produit pas par défaut.
meetingSession.audioVideo.startRemoteVideo()
stopRemoteVideo
arrête de recevoir des vidéos distantes et déclenche onVideoTileRemoved
pour les vidéos distantes existantes.
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)
Pour une gestion plus avancée des carreaux vidéo, jetez un œil à la pagination vidéo.
// 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)
Remarque: Lorsque vous ou d'autres participants partagez du contenu (par exemple, capture d'écran ou tout autre objet de vidéosorce), le contenu (participant-ID # contenu) rejoint la session et partage du contenu comme si un participant régulier partage une vidéo.
Par exemple, votre identifiant de participation est "My-ID". Lorsque vous appelez
meetingSession.audioVideo.startContentShare
, le contenu "My-ID # Content" rejoindra la session et partagera votre contenu.
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)
Vous pouvez définir la configuration pour le partage de contenu, par exemple maxbitratekbps. La qualité réelle obtenue peut varier tout au long de l'appel en fonction du système et du réseau peut fournir.
val contentShareConfig = LocalVideoConfiguration ( 200 )
meetingSession.audioVideo.startContentShare(contentShareSource, contentShareConfig)
Voir le partage de contenu pour plus de détails.
meetingSession.audioVideo.stopContentShare()
Chime SDK permet deux actions de contenu simultanées par réunion. Les partages de contenu à distance déclencheront onVideoTileAdded
, tandis que la part locale ne le fera pas. Pour rendre la vidéo de l'aperçu, ajoutez une VideoSink
à la VideoSource
dans le 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)
Voir ObservableMetric
pour plus de mesures disponibles et pour surveiller la qualité de partage audio, vidéo et de contenu.
val observer = object : MetricsObserver {
override fun onMetricsReceived ( metrics : Map < ObservableMetric , Any >) {
metrics.forEach { (metricsName, metricsValue) ->
logger.info( TAG , " $metricsName : $metricsValue " )
}
}
}
meetingSession.audioVideo.addMetricsObserver(observer)
Vous pouvez recevoir des messages en temps réel de plusieurs sujets après le début de la session de réunion.
Remarque: les messages de données envoyés par le participant local ne déclencheront pas ce rappel à moins qu'il ne soit étranglé.
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)
Vous pouvez envoyer un message en temps réel à n'importe quel sujet, auquel les observateurs abonnés seront informés.
Remarque: le sujet doit être alpha-numerique et il peut inclure des traits d'union et des soulignements. Les données ne peuvent pas dépasser 2KB et la durée de vie est facultative mais positive entier.
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
)
Remarque: assurez-vous de supprimer tous les observateurs et de libérer les ressources que vous avez ajoutées pour éviter toute fuite de mémoire.
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 réduit le bruit de fond de la réunion pour une meilleure expérience de réunion. Pour plus de détails, voir 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 source vidéo personnalisée vous permet de contrôler la vidéo, comme l'application d'un filtre vidéo. Pour plus de détails, voir la vidéo personnalisée.
Le flou / remplacement d'arrière-plan vous permet d'appliquer un flou ou de remplacer l'arrière-plan de votre vidéo par une image. Pour plus de détails, voir BackgroundFilter.
À partir de la version 0.18.3, le SDK commence à envoyer des données audio redondantes à nos serveurs sur la détection de la perte de paquets pour aider à réduire son effet sur la qualité de l'audio. Les paquets audio redondants ne sont envoyés que pour des paquets contenant un audio actif, une parole ou de la musique. Cela peut augmenter la bande passante consommée par l'audio jusqu'à 3 fois le montant normal en fonction de la quantité de perte de paquets détectée. Le SDK arrête automatiquement d'envoyer des données redondantes si elle n'a détecté aucune perte de paquet pendant 5 minutes.
Si vous avez besoin de désactiver cette fonctionnalité, vous pouvez le faire via le AudiovideOnonfiguration avant de commencer la session.
meetingSession.audioVideo.start( AudioVideoConfiguration (enableAudioRedundancy = false ))
Bien qu'il existe une option pour désactiver la fonctionnalité, nous vous recommandons de le garder activé pour une meilleure qualité audio. Une raison possible de le désactiver pourrait être si vos clients ont des limitations de bande passante très strictes.
Reportez-vous à la FAQ générale pour Amazon Chime SDK.
Les applications peuvent obtenir des journaux du SDK de Chime en passant des instances de bûcheron lors de la création de réunions. Amazon Chime SDK a certaines implémentations par défaut de Logger que votre application peut utiliser, telles que Consolelogger qui se connecte à Console. ConsoleLogger
est défini sur le niveau d' INFO
par défaut. Par conséquent, afin d'obtenir tous les journaux, y compris les journaux multimédias, créez un journaliste en suivant:
val logger = ConsoleLogger ( LogLevel . VERBOSE )
Le SDK utilise des open-als en dessous, ce qui nécessite le réglage des préréglages d'enregistrement lors de l'ouverture de la connexion au dispositif de microphone. Nous avons découvert qu'il n'y a pas de valeur prédéfinie spécifique qui fonctionne bien sur tous les appareils Android possibles. Le SDK utilise un préréglage par défaut de VoiceCommunication
dans laquelle nous sommes arrivés après avoir exécuté certains tests sur les appareils en notre possession. Si ce préréglage par défaut ne fonctionne pas et conduit à la partie distante de ne pas être en mesure de vous entendre, veuillez essayer de commencer la session avec un préréglage d'enregistrement différent en spécifiant audioRecordingPresetOverride
dans l' AudioVideoConfiguration
qui est transmise dans l'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)
L'utilisation du remplacement d'arrière-plan est soumise à un préavis supplémentaire. Vous et vos utilisateurs finaux êtes responsables de tous les contenus (y compris toutes les images) téléchargés pour une utilisation avec remplacement d'arrière-plan, et doivent s'assurer que ce contenu ne viole pas la loi, portefuient ou n'appropriait pas les droits d'un tiers, ou ne viole pas autrement un terme matériel de votre accord avec Amazon (y compris la documentation, les conditions de service AWS ou la politique d'utilisation acceptable).
Copyright Amazon.com, Inc. ou ses affiliés. Tous droits réservés.