Amazon Chime SDK Project Board
Hinweis: Wenn Sie mit dem SDK-Quellcode erstellen, enthält die
development
Änderungen, die möglicherweise nicht mit der öffentlich verfügbaren Chime-Medienbibliothek aufbauen oder nicht so stabil sind wie Öffentlichkeitsfreigaben.
Mit dem Amazon Chime SDK für Android können Android -Anwendungen mit denselben Infrastrukturdiensten, die Meetings auf dem Amazon Chime -Service anbieten, einfach kollaborative Audioanrufe, Videoanrufe und Bildschirmfreigabe -Funktionen hinzufügen.
Dieser Amazon -Chime -SDK für Android arbeitet, indem sie eine Verbindung zu Meeting -Sitzungsressourcen herstellen, die Sie in Ihrem AWS -Konto erstellt haben. Das SDK verfügt über alles, was Sie benötigen, um benutzerdefinierte Anruf- und Zusammenarbeitserlebnisse in Ihrer Android -Anwendung zu erstellen, einschließlich Methoden zu: Konfigurieren von Besprechungssitzungen, Liste und Auswählen von Audiogeräten, Switch Video -Geräte, Start- und Stop -Bildschirmfreigabe anzeigen, Rückrufe empfangen, wenn Medienereignisse auftreten. Wenn sich Volumen ändert und Besprechungsfunktionen wie Audio -Stummschalt- und Videofliesenbindungen verwalten.
Wir haben auch ein Amazon Chime SDK Project Board, in dem Sie Community -Anfragen und deren Status finden.
Sehen Sie sich die folgenden Ressourcen an:
Und überprüfen Sie die folgenden Anleitungen:
Hinweis: Wenn Sie nur die Demo -Anwendung ausführen möchten, gehen Sie zum Ausführen der Demo -App aus
Die mobilen SDKs für Android können aus dem Maven Central Repository heruntergeladen werden, indem Sie in die Gradle -Dateien Ihres Android -Projekts integriert werden, oder Sie können direkt über .AAR -Dateien eingebettet werden.
Zum Zwecke der Einrichtung wird der Root -Ordner Ihres Projekts als root
bezeichnet.
Um die Abhängigkeiten von Maven zu erhalten, fügen Sie die Abhängigkeiten in build.gradle
Ihrer App (Modulebene) hinzu.
Aktualisieren Sie build.gradle
in root/app
und fügen Sie Folgendes unter dependencies
hinzu:
dependencies {
implementation 'software.aws.chimesdk:amazon-chime-sdk-media:$MEDIA_VERSION'
implementation 'software.aws.chimesdk:amazon-chime-sdk:$SDK_VERSION'
}
Die Versionsnummern können aus der neuesten Veröffentlichung erhalten werden.
Wenn Sie keine Video- und Inhaltsfreigabefunktionen oder Software-Video-Codec-Unterstützung benötigen, können Sie amazon-chime-sdk-media-no-video-codecs
verwenden, um die Größe zu reduzieren. Ausschließen der Verwendung des amazon-chime-sdk-media
Moduls und/oder amazon-chime-sdk-machine-learning
Moduls von der transitiven Abhängigkeit von 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'
}
}
Projekte können jetzt ARM- und X86 -Ziele erstellen, was bei der Bündelung einer App nützlich sein kann. X86 -Ziele funktionieren nicht und sollen nicht auf einem X86 -Gerät oder einem Emulator installiert oder ausgeführt werden. Wichtig: Es werden nur Armgeräte unterstützt.
Wenn Sie in der Medien-Binärdatei nicht funktionsfähige X86-Stubs benötigen, um Ihre App zu bündeln, können Sie -x86-stub
an Ihre ausgewählte Medienabhängigkeit anhängen. Zum Beispiel:
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'
}
}
Befolgen Sie diese Schritte, um die SDK -Binärdateien in Ihr eigenes Projekt aufzunehmen.
Laden Sie amazon-chime-sdk
und amazon-chime-sdk-media
Binärdateien von der neuesten Version herunter.
Wenn Sie mehr Funktionen für maschinelles Lernen verwenden möchten, z. B. Hintergrund verschwommen/ersetzt werden, laden Sie auch die amazon-chime-sdk-machine-learning
Binärdatei von der neuesten Version herunter. Andernfalls können Sie in den folgenden Anweisungen alle Verweise auf amazon-chime-sdk-machine-learning
ignorieren.
Wenn Sie keine Video- und Inhaltsfreigabefunktionalität oder Software-Video-Codec-Unterstützung benötigen, können Sie amazon-chime-sdk-media-no-video-codecs
anstelle von amazon-chime-sdk-media
verwenden, um Software-Video-Codecs-Support auszuschließen und auszuschließen. Größe reduzieren. Wenn Sie dies tun, können Sie in den folgenden Anweisungen alle Verweise auf amazon-chime-sdk-media
als amazon-chime-sdk-media-no-video-codecs
behandeln.
Projekte können jetzt ARM- und X86 -Ziele erstellen, was bei der Bündelung einer App nützlich sein kann. X86 -Ziele funktionieren nicht und sollen nicht auf einem X86 -Gerät oder einem Emulator installiert oder ausgeführt werden. Wichtig: Es werden nur Armgeräte unterstützt.
Wenn Sie nicht funktionale X86 amazon-chime-sdk-media-x86-stub
Stubs in Kombination mit voll funktionsfähigen ARM amazon-chime-sdk-media-no-video-codecs-x86-stub
Architekturen benötigen, um Ihre App zu bündeln amazon-chime-sdk-media-no-video-codecs-x86-stub
Medienbinärdateien und ersetzen Sie sie für amazon-chime-sdk-media
Referenzen in den folgenden Anweisungen.
Hinweis: Wir unterstützen keine Misch- und Matching -Binärdateien aus verschiedenen Veröffentlichungen.
Entpacken Sie sie und kopieren Sie die AAR -Dateien in root/app/libs
Update build.gradle
in root
, indem Sie Folgendes unter repositories
in allprojects
hinzufügen:
allprojects {
repositories {
jcenter()
flatDir {
dirs 'libs'
}
}
}
Aktualisieren Sie build.gradle
in root/app
und fügen Sie Folgendes unter dependencies
hinzu:
implementation(name: 'amazon-chime-sdk', ext: 'aar')
implementation(name: 'amazon-chime-sdk-media', ext: 'aar')
Wenn Sie amazon-chime-sdk-machine-learning
Bibliothek verwenden, fügen Sie unter dependencies
auch die folgende Anweisung hinzu:
implementation(name: 'amazon-chime-sdk-machine-learning', ext: 'aar')
Aktualisieren Sie build.gradle
in root/app
unter compileOptions
:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
Hinweis: Dies dient nur dazu, Demo -Anwendung auszuführen und SDK als Code anstelle einer AAR -Bibliothek zu verwenden.
Befolgen Sie diese Schritte, um die Demo -Anwendung auszuführen.
Hinweis: Bitte stellen Sie sicher, dass Sie auf Armstützgeräten (echte Geräte) oder Simulator mit unterstütztem Arm ausgeführt werden. Wir unterstützen derzeit X86 derzeit nicht, daher werden Simulatoren mit x86 nicht funktionieren.
Stellen Sie die serverlose Demo von Amazon-Chime-Sdk-js bereit, die https://xxxxx.xxxxx.xxx.com/Prod/
zurückgibt
Geben Sie https://xxxxx.xxxxx.xxx.com/Prod/
für die mobile Demo -App bereit.
Laden Sie amazon-chime-sdk-media
Binary von der neuesten Veröffentlichung herunter.
Download amazon-chime-sdk-machine-learning
binär für maschinelles Lernen.
Unzippieren und kopieren Sie die AAR-Dateien in amazon-chime-sdk-android/amazon-chime-sdk/libs
Aktualisieren Sie test_url
in strings.xml
am Pfad amazon-chime-sdk-android/app/src/main/res/values
mit der URL der in Schritt 1 bereitgestellten serverlosen Demo.
Hinweis: Verwenden Sie
https://xxxxx.xxxxx.xxx.com/Prod/
Wenn Sie in diesem Projekt ein potenzielles Sicherheitsproblem entdecken, informieren Sie die AWS/Amazon Security über unsere Seite mit Anfälligkeitsberichten. Bitte erstellen Sie kein öffentliches Github -Problem.
Sie müssen mit der Besprechungssitzung beginnen, um Audio zu senden und zu empfangen.
Starten Sie eine Sitzung mit Standardkonfigurationen:
meetingSession.audioVideo.start()
Starten Sie eine Sitzung mit benutzerdefinierten Konfigurationen:
meetingSession.audioVideo.start(audioVideoConfiguration)
Diese Konfigurationen sind in audioVideoConfiguration
verfügbar:
audioMode
audioDeviceCapabilities
audioStreamType
audioRecordingPresetOverride
enableAudioRedundancy
reconnectTimeoutMs
Audiomode: Das Standard -Audio -Format ist Stereo/48 -kHz -IE -Stereo -Audio mit einer Abtastrate von 48 kHz (Stereo48K). Weitere unterstützte Audioformate sind Mono/48KHz (mono48K) oder Mono/16KHz (mono16k). Sie können in AudioVideoConfiguration
einen nicht defekten Audio-Modus angeben und dann die Besprechungssitzung starten.
AudioDeViceCapabilities: Die Standard -Audio -Gerätefunktionen sollen sowohl über die Audioeingangs- als auch die Ausgabegeräte aktiviert werden ( InputAndOutput
), dh sowohl Mikrofon als auch Lautsprecher sind aktiviert. InputAndOutput
erfordert MODIFY_AUDIO_SETTINGS
und RECORD_AUDIO
-Berechtigungen. Andere Optionen sind OutputOnly
(mikrofon deaktiviert und der Lautsprecher aktiviert; erfordert MODIFY_AUDIO_SETTINGS
-Berechtigung) und None
(sowohl mikrofon als auch mikrofonisch deaktiviert; erfordert keine Audioberechtigungen).
AUDIOTREAMTYPE: Der Standardwert ist VoiceCall
. Die verfügbaren Optionen sind VoiceCall
und Music
, sie sind gleichwertig zu STREAM_VOICE_CALL
und STREAM_MUSIC
in audiomanager. Diese Konfiguration dient zur Behandlung des Audiovolumenproblems auf Oculus Quest 2. Wenn Sie nicht wissen, was es ist, müssen Sie sich wahrscheinlich keine Sorgen machen. Weitere Informationen finden Sie unter Android -Dokumentation: Stream_voice_call, Stream_music.
Hinweis: Obwohl es in Android mehr Stream -Optionen gibt, werden derzeit nur Stream_voice_call und Stream_Music in Amazon Chime SDK für Android unterstützt.
AUDIORECORDINGPRESETOVERRIDE: Der Standardwert ist None
. Die verfügbaren Optionen sind None
, Generic
, Camcorder
, VoiceRecognition
und VoiceCommunication
. Diese entsprechen den hier genannten Optionen unter Android AudioreCorder -Konfiguration .
EnableAudiorDundancy: Der Standardwert ist wahr. Wenn das SDK aktiviert ist, sendet er redundante Audiodaten zum Erkennen von Paketverlusten, um die Auswirkungen auf die Audioqualität zu verringern. Weitere Details finden Sie im redundanten Audioabschnitt .
ReconnectTimeOutms: Der Standardwert beträgt 180.000 ms. Verwenden Sie diese Konfiguration, um das Timeout der Sitzung aufgrund einer schlechten Netzwerkbedingung zu steuern.
HINWEIS: Um Ereignisse zu vermeiden, fügen Sie einen Beobachter hinzu, bevor die Sitzung beginnt. Sie können den Beobachter entfernen.
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)
Listen Sie die verfügbaren Audiogeräte für das Meeting auf.
val audioDevices = meetingSession.audioVideo.listAudioDevices()
// A list of MediaDevice objects
audioDevices.forEach {
logger.info( TAG , " Device type: ${it.type} , label: ${it.label} " )
}
MediaDevice
-Objekt übergeben.Hinweis: Sie sollten nach Beginn der Sitzung ChooseAudioDevice anrufen, oder es wird ein No-op sein. Sie sollten auch ChooseAudioDevice mit einem der von ListaudioDevices zurückgegebenen Geräte anrufen.
// 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)
HINWEIS: SwitchCamera () ist ein No-op, wenn Sie eine benutzerdefinierte Kamera-Capture-Quelle verwenden. Weitere Informationen finden Sie im benutzerdefinierten Video.
Wechseln Sie, falls verfügbar zwischen der Vorder- oder Rückkamera auf dem Gerät.
meetingSession.audioVideo.switchCamera()
Fügen Sie einen DeviceChangeObserver
hinzu, um einen Rückruf zu erhalten, wenn ein neues Audio -Gerät eine Verbindung herstellt oder wenn ein Audiogerät die Verbindung abnimmt. onAudioDeviceChanged
enthält eine aktualisierte Geräteliste.
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)
HINWEIS:
getActiveAudioDevice
API erfordert eine API -Ebene 24 oder höher.
if ( Build . VERSION . SDK_INT >= Build . VERSION_CODES . N ) {
val activeAudioDevice = meetingSession.audioVideo.getActiveAudioDevice()
}
Für niedrigere API -Ebenen können Bauherren dasselbe erreichen, indem sie das ausgewählte Gerät mit der folgenden Logik verfolgen:
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
}
Beim Beitritt zu einer Besprechung hat jede Konfiguration einen Standard, wenn es beim Starten der Audiositzung nicht explizit angegeben ist.
- Unterstützte Audiomode -Optionen: Mono/16KHz , Mono/48 kHz und Stereo/48 kHz . Standard ist Stereo/48kHz .
- Unterstützte AudiodeViceCapabilities Optionen: Eingabe und Ausgabe , nur Ausgabe und keine . Standard ist Eingang und Ausgabe .
- Unterstützte AudioStreamtype -Optionen: Voicecall und Musik . Standard ist VoiceCall
- Unterstützte audioreCordingPresetoverride -Optionen: Keine , generische , Camcorder , Voicorecognition und Voicecommunication . Standard ist keine .
- Unterstützte Optionen für EnableAudiorDundancy: Richtig und falsch . Standard ist wahr .
- Unterstützte Wiederverbindungs -Timeoutms -Werte: Ganzzahlen größer als oder gleich 0. Die Standardeinstellung beträgt 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]
Hinweis: Bisher haben Sie Beobachter hinzugefügt, um Geräte- und Sitzungslebenszyklusereignisse zu empfangen. In den folgenden Anwendungsfällen verwenden Sie die Echtzeit-API-Methoden, um Volumenindikatoren zu senden und zu empfangen und den State zu steuern.
val muted = meetingSession.audioVideo.realtimeLocalMute() // returns true if muted, false if failed
val unmuted = meetingSession.audioVideo.realtimeLocalUnmute() // returns true if unmuted, false if failed
Sie können dies verwenden, um Echtzeit-Indikatoren-Benutzeroberflächen zu erstellen und sie für Änderungen durch das Array aktualisieren zu lassen.
Hinweis: Diese Rückrufe enthalten nur das Delta aus dem vorherigen Rückruf.
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)
Sie können das onActiveSpeakerDetected
-Ereignis verwenden, um die aktivste Videofliese des aktivsten Sprechers zu vergrößern oder zu betonen. Durch Einstellen der scoreCallbackIntervalMs
und der Implementierung onActiveSpeakerScoreChanged
können Sie regelmäßig Punktzahlen der aktiven Lautsprecher erhalten.
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)
Hinweis: Sie müssen das Video an eine
VideoRenderView
binden, um es zu rendern.Eine lokale Videofliese kann mit der
isLocalTile
-Eigenschaft identifiziert werden.Ein Content -Video -Fliese kann mit der
isContent
-Eigenschaft identifiziert werden. Siehe Bildschirm und Inhaltsheigung.Eine Kachel wird mit einer neuen Kachel -ID erstellt, wenn derselbe entfernte Teilnehmer das Video neu startet.
Weitere Informationen zum Hinzufügen/Entfernen/Anzeigen von Videos finden Sie beim Erstellen einer Besprechungsanwendung auf Android mit dem Amazon Chime SDK.
Sie können startRemoteVideo
anrufen, um Remote -Videos zu empfangen, da dies nicht standardmäßig passiert.
meetingSession.audioVideo.startRemoteVideo()
stopRemoteVideo
hört nicht mehr, Remote -Videos zu empfangen und onVideoTileRemoved
für vorhandene Remote -Videos auszulösen.
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)
Für fortgeschrittene Video -Fliesen -Management finden Sie einen Blick auf die Video -Pagination.
// 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)
HINWEIS: Wenn Sie oder andere Teilnehmer Inhalte (z. B. Bildschirmaufnahme oder ein anderes Videosource-Objekt) teilen, schließt sich der Inhaltsbeauftragte (Teilnehmer-ID-Inhalt) der Sitzung an und teilt den Inhalt so, als ob ein regulärer Teilnehmer ein Video teilt.
Zum Beispiel ist Ihr Teilnehmer-ID "my-id". Wenn Sie
meetingSession.audioVideo.startContentShare
anrufen, wird der Inhaltsbeauftragte "My-ID#Inhalt" der Sitzung beitreten und Ihre Inhalte weitergeben.
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)
Sie können die Konfiguration für die Inhaltsfreigabe, z. B. MaxbitrateKbps, festlegen. Die tatsächliche Qualität kann im Laufe des Anrufs variieren, je nachdem, welches System und das Netzwerk bereitstellen können.
val contentShareConfig = LocalVideoConfiguration ( 200 )
meetingSession.audioVideo.startContentShare(contentShareSource, contentShareConfig)
Weitere Informationen finden Sie in den Inhalten Freigabe.
meetingSession.audioVideo.stopContentShare()
Chime SDK ermöglicht zwei gleichzeitige Inhaltsanteile pro Meeting. Remote -Inhaltsanteile auslösen onVideoTileAdded
, während die lokale Aktien nicht der Fall sind. Um das Video zur Vorschau zu rendern, fügen Sie der VideoSource
in der ContentShareSource
einen VideoSink
hinzu.
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)
Weitere verfügbare Metriken finden Sie ObservableMetric
und Überwachung von Audio-, Video- und Inhaltsfreigabequalität.
val observer = object : MetricsObserver {
override fun onMetricsReceived ( metrics : Map < ObservableMetric , Any >) {
metrics.forEach { (metricsName, metricsValue) ->
logger.info( TAG , " $metricsName : $metricsValue " )
}
}
}
meetingSession.audioVideo.addMetricsObserver(observer)
Sie können nach Beginn der Besprechungssitzung Echtzeitnachrichten von mehreren Themen erhalten.
HINWEIS: Datennachrichten, die vom lokalen Teilnehmer gesendet werden, werden diesen Rückruf nicht auslösen, es sei denn, er ist gedrosselt.
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)
Sie können Echtzeitnachrichten an ein beliebiges Thema senden, zu dem die abonnierten Beobachter benachrichtigt werden.
Hinweis: Das Thema muss alpha-numerisch sein und es kann Bindestrich und Unterstrich enthalten. Die Daten dürfen 2 KB nicht überschreiten und die Lebensdauer ist optional, aber positive Ganzzahl.
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
)
HINWEIS: Entfernen Sie alle Beobachter und Freigabe von Ressourcen, die Sie hinzugefügt haben, um Speicherlecks zu vermeiden.
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 reduziert den Hintergrundgeräusch im Meeting, um bessere Besprechungserfahrungen zu erzielen. Weitere Informationen finden Sie unter 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
Mit benutzerdefinierten Videoquelle können Sie das Video steuern, z. B. das Anwenden eines Videofilters. Weitere Informationen finden Sie unter benutzerdefiniertes Video.
Hintergrund -Unschärfe/Ersatz ermöglicht es Ihnen, Unschärfe auf den Hintergrund Ihres Videos durch ein Bild anzuwenden oder zu ersetzen. Weitere Informationen finden Sie unter Hintergrundfilter.
Ab Version 0.18.3 sendet der SDK redundante Audiodaten an unsere Server zum Erkennen von Paketverlusten, um die Auswirkungen auf die Audioqualität zu verringern. Redundante Audiopakete werden nur für Pakete mit aktivem Audio, dh Spect oder Musik verschickt. Dies kann die von Audio konsumierte Bandbreite auf bis zu dreifache normaler Betrag erhöhen, abhängig von der Höhe des erkannten Paketverlusts. Das SDK hört automatisch auf, redundante Daten zu senden, wenn er 5 Minuten lang keinen Paketverlust erkannt hat.
Wenn Sie diese Funktion deaktivieren müssen, können Sie dies über die audiovideoconfiguration tun, bevor Sie die Sitzung starten.
meetingSession.audioVideo.start( AudioVideoConfiguration (enableAudioRedundancy = false ))
Obwohl es eine Option gibt, um die Funktion zu deaktivieren, empfehlen wir, sie für eine verbesserte Audioqualität aktiviert zu halten. Ein möglicher Grund, dies zu deaktivieren, könnte sein, wenn Ihre Kunden sehr strenge Bandbreitenbeschränkungen haben.
Siehe allgemeine FAQ für Amazon Chime SDK.
Anwendungen können Protokolle von Chime SDK erhalten, indem sie beim Erstellen von Besprechungen Instanzen von Logger bestehen. Amazon Chime SDK verfügt über einige Standardimplementierungen von Logger, die Ihre Anwendung verwenden kann, z. B. Consolelogger, das sich in die Konsole anmeldet. ConsoleLogger
wird als Standard auf INFO
-Ebene eingestellt. Um alle Protokolle, einschließlich Medienprotokolle, zu erhalten, erstellen Sie Logger, indem Sie folgen:
val logger = ConsoleLogger ( LogLevel . VERBOSE )
Der SDK verwendet Opensl ES darunter, wodurch die Einstellung von Voreinstellungen aufgenommen wird, während die Verbindung zum Mikrofongerät geöffnet wird. Wir haben herausgefunden, dass es keinen bestimmten voreingestellten Wert gibt, der auf allen möglichen Android -Geräten gut funktioniert. Der SDK verwendet eine Standardvoreinstellung von VoiceCommunication
, zu der wir nach einigen Tests auf den in unserem Besitz durchgeführten Geräten gekommen sind. Wenn dieses Standard -Voreinsatz nicht funktioniert und dazu führt, dass die Remote -Partei Sie nicht hören kann, versuchen Sie, die Sitzung mit einem anderen Aufzeichnungsvoreinstellung zu starten, indem Sie audioRecordingPresetOverride
in der AudioVideoConfiguration
, die in die Start -API übergeben wird, angeben.
// Creating a config where the preset is overriden with Generic (for example)
val audioVideoConfig = AudioVideoConfiguration (audioRecordingPresetOverride = AudioRecordingPresetOverride . Generic )
// Start Audio Video
audioVideo.start(audioVideoConfig)
Die Verwendung von Hintergrundersatz wird zusätzliche Mitteilung unterliegen. Sie und Ihre Endbenutzer sind für alle Inhalte (einschließlich aller Bilder) verantwortlich Ihrer Vereinbarung mit Amazon (einschließlich der Dokumentation, den AWS -Servicebedingungen oder der akzeptablen Nutzungsrichtlinie).
Copyright Amazon.com, Inc. oder seine verbundenen Unternehmen. Alle Rechte vorbehalten.