Amazon Chime SDKプロジェクトボード
注:SDKソースコードを使用して構築する場合、
development
ブランチには、公開されているChime Media Libraryで構築されない可能性のある出血エッジの変更が含まれているか、パブリックリリースほど安定していない可能性があります。
Amazon Chime SDK for Androidは、Amazon Chimeサービスでパワーミーティングと同じインフラストラクチャサービスを使用することにより、Androidアプリケーションに共同オーディオ通話、ビデオ通話、および画面共有の表示機能を簡単に追加できます。
Android用のこのAmazon Chime SDKは、AWSアカウントで作成した会議セッションリソースに接続することで機能します。 SDKには、Androidアプリケーションでカスタム通話とコラボレーションエクスペリエンスを構築するために必要なすべてがあります。これには、会議セッション、リストと選択の選択、ビデオデバイスの切り替え、スクリーン共有の開始と停止の表示、メディアイベントが発生したときにコールバックを受信します。ボリュームが変化し、オーディオミュートやビデオタイルバインディングなどの会議機能を管理します。
また、コミュニティのリクエストとそのステータスを見つけることができるAmazon Chime SDKプロジェクトボードもあります。
開始するには、次のリソースを参照してください。
次のガイドを確認してください。
注:デモアプリケーションを実行するだけの場合は、デモアプリの実行にスキップします
AndroidプロジェクトのGradleファイルに統合して、Android用のモバイルSDKは、Maven Centralリポジトリからダウンロードすることも、.ARファイルを介して直接埋め込むこともできます。
セットアップを目的として、プロジェクトのルートフォルダーはroot
と呼ばれます。
Mavenから依存関係を取得するには、アプリ(モジュールレベル) build.gradle
に依存関係を追加します。
root/app
でbuild.gradle
を更新し、 dependencies
の下で以下を追加します。
dependencies {
implementation 'software.aws.chimesdk:amazon-chime-sdk-media:$MEDIA_VERSION'
implementation 'software.aws.chimesdk:amazon-chime-sdk:$SDK_VERSION'
}
バージョン番号は、最新リリースから取得できます。
ビデオとコンテンツの共有機能、またはソフトウェアビデオコーデックサポートが必要ない場合は、代わりにamazon-chime-sdk-media-no-video-codecs
を使用してサイズを縮小できます。 amazon-chime-sdk-media
モジュールおよび/またはAmazon-Chime amazon-chime-sdk
amazon-chime-sdk-machine-learning
モジュールの使用を除外してください。
dependencies {
implementation 'software.aws.chimesdk:amazon-chime-sdk-media-no-video-codecs:$MEDIA_VERSION'
implementation ('software.aws.chimesdk:amazon-chime-sdk:$MEDIA_VERSION') {
exclude module: 'amazon-chime-sdk-media'
exclude module: 'amazon-chime-sdk-machine-learning'
}
}
プロジェクトはARMおよびX86のターゲットを構築できるようになりました。これは、アプリをバンドルする場合に役立つ場合があります。 X86ターゲットは機能せず、X86デバイスまたはエミュレータにインストールまたは実行することを意図していません。重要:アームデバイスのみがサポートされています。
アプリをバンドルするためにメディアバイナリに機能しないX86スタブが必要な場合は、選択したメディア依存関係に-x86-stub
を追加できます。例えば:
dependencies {
implementation 'software.aws.chimesdk:amazon-chime-sdk-media-no-video-codecs-x86-stub:$MEDIA_VERSION'
implementation ('software.aws.chimesdk:amazon-chime-sdk:$MEDIA_VERSION') {
exclude module: 'amazon-chime-sdk-media'
exclude module: 'amazon-chime-sdk-machine-learning'
}
}
独自のプロジェクトにSDKバイナリを含めるには、次の手順に従ってください。
最新リリースからamazon-chime-sdk
とamazon-chime-sdk-media
バイナリをダウンロードしてください。
より多くの機械学習機能(バックグラウンドブラー/交換などの使用が必要な場合は、最新リリースからamazon-chime-sdk-machine-learning
バイナリもダウンロードしてください。それ以外の場合は、以下の指示でamazon-chime-sdk-machine-learning
へのすべての参照を無視できます。
ビデオとコンテンツの共有機能、またはソフトウェアビデオコーデックサポートが必要ない場合は、Amazon-Chime-SDK-Mediaの代わりにamazon-chime-sdk-media
amazon-chime-sdk-media-no-video-codecs
使用して、ソフトウェアビデオコーデックのサポートを除外し、サイズを縮小します。もしそうなら、 amazon-chime-sdk-media
へのすべての参照をamazon-chime-sdk-media-no-video-codecs
として以下の指示に扱うことができます。
プロジェクトはARMおよびX86のターゲットを構築できるようになりました。これは、アプリをバンドルする場合に役立つ場合があります。 X86ターゲットは機能せず、X86デバイスまたはエミュレータにインストールまたは実行することを意図していません。重要:アームデバイスのみがサポートされています。
アプリをバンドルするために完全に機能的なアームアーキテクチャと組み合わせて機能しないX86スタブが必要な場合は、 amazon-chime-sdk-media-x86-stub
またはamazon-chime-sdk-media-no-video-codecs-x86-stub
使用できます。 amazon-chime-sdk-media-no-video-codecs-x86-stub
mediaバイナリと、以下の手順でamazon-chime-sdk-media
参照に置き換えます。
注:さまざまなリリースの混合と一致するバイナリをサポートしていません。
それらを解凍し、AARファイルをroot/app/libs
にコピーします
allprojects
のrepositories
の下に以下を追加することにより、 build.gradle
をroot
に更新します。
allprojects {
repositories {
jcenter()
flatDir {
dirs 'libs'
}
}
}
root/app
でbuild.gradle
を更新し、 dependencies
の下で以下を追加します。
implementation(name: 'amazon-chime-sdk', ext: 'aar')
implementation(name: 'amazon-chime-sdk-media', ext: 'aar')
amazon-chime-sdk-machine-learning
ライブラリを使用している場合は、 dependencies
に基づいて以下のステートメントを追加します。
implementation(name: 'amazon-chime-sdk-machine-learning', ext: 'aar')
compileOptions
の下のroot/app
のbuild.gradle
を更新します:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
注:これは、DEMOアプリケーションを実行し、AARライブラリの代わりにSDKをコードとして使用するためだけです。
デモアプリケーションを実行するには、次の手順に従ってください。
注:アームサポートされたデバイス(実際のデバイス)またはアームサポートを備えたシミュレーターで実行していることを確認してください。現在、X86をサポートしていないため、X86のシミュレーターは機能しません。
https://xxxxx.xxxxx.xxx.com/Prod/
を返すAmazon-chime-sdk-jsからサーバーレスのデモを展開します。
モバイルデモアプリにhttps://xxxxx.xxxxx.xxx.com/Prod/
提供します。
最新リリースからamazon-chime-sdk-media
バイナリをダウンロードしてください。
機械学習機能のために、 amazon-chime-sdk-machine-learning
バイナリをダウンロードしてください。
AARファイルをamazon-chime-sdk-android/amazon-chime-sdk/libs
に解凍してコピーします
ステップ1に展開されているサーバーレスデモのURLで、パスamazon-chime-sdk-android/app/src/main/res/values
でstrings.xml
のtest_url
を更新します。
注:
https://xxxxx.xxxxx.xxx.com/Prod/
を使用してください
このプロジェクトで潜在的なセキュリティの問題を発見した場合は、脆弱性レポートページからAWS/Amazonセキュリティに通知するようお願いします。公開githubの問題を作成しないでください。
オーディオの送信と受信を開始するには、会議セッションを開始する必要があります。
デフォルトの構成でセッションを開始します。
meetingSession.audioVideo.start()
カスタム構成でセッションを開始します。
meetingSession.audioVideo.start(audioVideoConfiguration)
これらの構成は、 audioVideoConfiguration
で利用できます。
audioMode
audioDeviceCapabilities
audioStreamType
audioRecordingPresetOverride
enableAudioRedundancy
reconnectTimeoutMs
Audiomode:デフォルトのオーディオ形式は、48kHzサンプリングレート(Stereo48K)を備えたステレオ/48kHz IEステレオオーディオです。その他のサポートされているオーディオ形式には、Mono/48kHz(Mono48K)またはMono/16KHz(Mono16K)が含まれます。 AudioVideoConfiguration
で非デフォルトオーディオモードを指定してから、会議セッションを開始できます。
audioDeviceCapability:デフォルトのオーディオデバイス機能は、オーディオ入力デバイスと出力デバイスの両方を有効にする( InputAndOutput
)、つまりマイクとスピーカーの両方を有効にすることです。 InputAndOutput
、 MODIFY_AUDIO_SETTINGS
とRECORD_AUDIO
許可が必要です。その他のオプションは、 OutputOnly
(マイクが無効になり、スピーカーが有効になっている; MODIFY_AUDIO_SETTINGS
許可を必要とする) None
(マイクとスピーカーが無効になっています。オーディオアクセス許可は必要ありません)。
AudioStreamType:デフォルト値はVoiceCall
です。利用可能なオプションはVoiceCall
とMusic
です。それらは、audianagerでそれぞれSTREAM_VOICE_CALL
とSTREAM_MUSIC
に相当します。この構成は、Oculus Quest 2のオーディオボリュームの問題に対処するためのものです。それが何であるかわからない場合は、おそらく心配する必要はありません。詳細については、Androidドキュメントを参照してください:stream_voice_call、stream_music。
注:Androidにはより多くの利用可能なストリームオプションがありますが、現在Stream_voice_callとStream_MusicのみがAndroid用のAmazon Chime SDKでサポートされています。
audiorecordingpreseToverride:デフォルト値はNone
です。利用可能なオプションは、 Generic
、 Camcorder
、 VoiceRecognition
、 VoiceCommunication
None
。これらは、 Android AudiorEcorder構成の下でここで言及されているオプションに相当します。
EnableaudioreDundancy:デフォルト値は真です。有効にすると、SDKはパケット損失の検出に関する冗長なオーディオデータを送信して、オーディオ品質への影響を減らすのに役立ちます。詳細については、冗長なオーディオセクションをご覧ください。
reconnecttimeoutms:デフォルト値は180,000msです。この構成を使用して、ネットワーク条件が不十分なため、セッションの再接続タイムアウトを制御します。
注:イベントの欠落を避けるには、セッションが開始される前にオブザーバーを追加します。 Meetings.audiovideo.RemoveaudiovideOobserver(オブザーバー)に電話して、オブザーバーを削除できます。
val observer = object : AudioVideoObserver {
override fun onAudioSessionStartedConnecting ( reconnecting : Boolean ) {
if (reconnecting) {
// e.g. the network connection is dropped
}
}
override fun onAudioSessionStarted ( reconnecting : Boolean ) {
// Meeting session starts.
// Can use realtime, devices APIs.
}
override fun onAudioSessionDropped ( reconnecting : Boolean ) {}
override fun onAudioSessionStopped ( sessionStatus : MeetingSessionStatus ) {
// See the "Stopping a session" section for details.
}
override fun onAudioSessionCancelledReconnect () {}
override fun onConnectionRecovered () {}
override fun onConnectionBecamePoor () {}
override fun onVideoSessionStartedConnecting () {}
override fun onVideoSessionStarted ( sessionStatus : MeetingSessionStatus ) {
// Video session starts.
// Can use video APIs.
}
override fun onVideoSessionStopped ( sessionStatus : MeetingSessionStatus ) {}
}
meetingSession.audioVideo.addAudioVideoObserver(observer)
会議に利用可能なオーディオデバイスをリストします。
val audioDevices = meetingSession.audioVideo.listAudioDevices()
// A list of MediaDevice objects
audioDevices.forEach {
logger.info( TAG , " Device type: ${it.type} , label: ${it.label} " )
}
MediaDevice
デバイスを選択します。注:セッションが開始された後、Chooseaudiodeviceに電話する必要があります。そうしないと、opになります。また、ListAudioDevicesから返品されたデバイスのいずれかを使用して、Chooseaudiodeviceに電話する必要があります。
// Filter out OTHER type which is currently not supported for selection
val audioDevices = meetingSession.audioVideo.listAudioDevices().filter {
it.type != MediaDeviceType . OTHER )
}
val device = /* An item from audioDevices */
meetingSession.audioVideo.chooseAudioDevice(device)
注:カスタムカメラキャプチャソースを使用している場合、SwitchCamera()はNO-OPです。詳細については、カスタムビデオを参照してください。
利用可能な場合は、デバイス上のフロントカメラまたはバックカメラを切り替えます。
meetingSession.audioVideo.switchCamera()
DeviceChangeObserver
を追加して、新しいオーディオデバイスが接続されているときやオーディオデバイスが切断されたときにコールバックを受信します。 onAudioDeviceChanged
には、更新されたデバイスリストが含まれています。
val observer = object : DeviceChangeObserver {
override fun onAudioDeviceChanged ( freshAudioDeviceList : List < MediaDevice >) {
// A list of updated MediaDevice objects
freshAudioDeviceList.forEach {
logger.info( TAG , " Device type: ${it.type} , label: ${it.label} " )
}
}
}
meetingSession.audioVideo.addDeviceChangeObserver(observer)
注:
getActiveAudioDevice
APIには、APIレベル24以降が必要です。
if ( Build . VERSION . SDK_INT >= Build . VERSION_CODES . N ) {
val activeAudioDevice = meetingSession.audioVideo.getActiveAudioDevice()
}
APIレベルが低い場合、ビルダーは、選択したデバイスを次のロジックで追跡することで同じことを達成できます。
var activeAudioDevice : MediaDevice ? = null
override fun onAudioDeviceChanged ( freshAudioDeviceList : List < MediaDevice >) {
val device = /* An item from freshAudioDeviceList */
meetingSession.audioVideo.chooseAudioDevice(device)
activeAudioDevice = device // Update current device
}
会議に参加すると、各構成には、オーディオセッションを開始するときに明示的に指定されていない場合でもデフォルトが表示されます。
- サポートされているオーディモードオプション: Mono/16kHz 、 Mono/48kHz 、およびStereo/48kHz 。デフォルトはステレオ/48kHzです。
- サポートされているAudioDeviceCapabilityオプション:入力と出力、出力のみ、およびなし。デフォルトは入力と出力です。
- サポートされているAudioStreamTypeオプション: VoiceCallと音楽。デフォルトはvoicecallです
- サポートされているaudiorecordingpreseToverrideオプション:なし、汎用、カムコーダー、ボイセル認識、ボイコミュー化。デフォルトはなしです。
- サポートされているEnableaudioreDundancyオプション: True and False 。デフォルトはtrueです。
- サポートされているreconnecttimeoutms値:0以上の整数。デフォルトは180,000です。
meetingSession.audioVideo.start() // starts the audio video session with defaults mentioned above
meetingSession.audioVideo.start(audioVideoConfiguration) // starts the audio video session with the specified [AudioVideoConfiguration]
注:これまでのところ、オブザーバーを追加して、デバイスとセッションのライフサイクルイベントを受信しました。次のユースケースでは、リアルタイムAPIメソッドを使用して、ボリュームインジケーターを送信および受信し、ミュート状態を制御します。
val muted = meetingSession.audioVideo.realtimeLocalMute() // returns true if muted, false if failed
val unmuted = meetingSession.audioVideo.realtimeLocalUnmute() // returns true if unmuted, false if failed
これを使用して、リアルタイムインジケーターUIを構築し、配列によって配信される変更について更新することができます。
注:これらのコールバックには、以前のコールバックのデルタのみが含まれます。
val observer = object : RealtimeObserver {
override fun onVolumeChanged ( volumeUpdates : Array < VolumeUpdate >) {
volumeUpdates.forEach { (attendeeInfo, volumeLevel) ->
logger.info( TAG , " ${attendeeInfo.attendeeId} 's volume changed: " +
$volumeLevel // Muted, NotSpeaking, Low, Medium, High
)
}
}
override fun onSignalStrengthChanged ( signalUpdates : Array < SignalUpdate >) {
signalUpdates.forEach { (attendeeInfo, signalStrength) ->
logger.info( TAG , " ${attendeeInfo.attendeeId} 's signal strength changed: " +
$signalStrength // None, Low, High
)
}
}
override fun onAttendeesJoined ( attendeeInfo : Array < AttendeeInfo >) {
attendeeInfo.forEach { logger.info( TAG , " ${attendeeInfo.attendeeId} joined the meeting " ) }
}
override fun onAttendeesLeft ( attendeeInfo : Array < AttendeeInfo >) {
attendeeInfo.forEach { logger.info( TAG , " ${attendeeInfo.attendeeId} left the meeting " ) }
}
override fun onAttendeesDropped ( attendeeInfo : Array < AttendeeInfo >) {
attendeeInfo.forEach { logger.info( TAG , " ${attendeeInfo.attendeeId} dropped from the meeting " ) }
}
override fun onAttendeesMuted ( attendeeInfo : Array < AttendeeInfo >) {
attendeeInfo.forEach { logger.info( TAG , " ${attendeeInfo.attendeeId} muted " ) }
}
override fun onAttendeesUnmuted ( attendeeInfo : Array < AttendeeInfo >) {
attendeeInfo.forEach { logger.info( TAG , " ${attendeeInfo.attendeeId} unmuted " ) }
}
}
meetingSession.audioVideo.addRealtimeObserver(observer)
onActiveSpeakerDetected
イベントを使用して、利用可能な場合は最もアクティブなスピーカーのビデオタイルを拡大または強調できます。 scoreCallbackIntervalMs
を設定し、 onActiveSpeakerScoreChanged
実装することにより、定期的にアクティブなスピーカーのスコアを受信できます。
val observer = object : ActiveSpeakerObserver {
override fun onActiveSpeakerDetected ( attendeeInfo : Array < AttendeeInfo >) {
if (attendeeInfo.isNotEmpty()) {
logger.info( TAG , " ${attendeeInfo[ 0 ].attendeeId} is the most active speaker " )
}
}
// Set to receive onActiveSpeakerScoreChanged event at interval of 1s
override val scoreCallbackIntervalMs : Int? get() = 1000
override fun onActiveSpeakerScoreChanged ( scores : Map < AttendeeInfo , Double >) {
val scoreString = scores.map { entry -> " ${entry.key.attendeeId} : ${entry.value} " }.joinToString( " , " )
logger.info( TAG , " Scores of active speakers are: $scoreString " )
}
}
// Calculating the active speaker base on the SDK provided policy, you can provide any custom algorithm
meetingSession.audioVideo.addActiveSpeakerObserver( DefaultActiveSpeakerPolicy (), observer)
注:ビデオを
VideoRenderView
にバインドしてレンダリングする必要があります。
isLocalTile
プロパティを使用して、ローカルビデオタイルを識別できます。
isContent
プロパティを使用して、コンテンツビデオタイルを識別できます。画面とコンテンツの共有を参照してください。同じリモート参加者がビデオを再起動すると、新しいタイルIDでタイルが作成されます。
Amazon Chime SDKを使用して、Androidで会議アプリケーションを構築することからビデオの追加/削除/表示に関する詳細をご覧ください。
startRemoteVideo
に電話してリモートビデオの受信を開始できます。これはデフォルトでは発生しないためです。
meetingSession.audioVideo.startRemoteVideo()
stopRemoteVideo
、リモートビデオの受信を停止し、既存のリモートビデオ用にonVideoTileRemoved
をトリガーします。
meetingSession.audioVideo.stopRemoteVideo()
val observer = object : VideoTileObserver {
override fun onVideoTileAdded ( tileState : VideoTileState ) {
// Ignore local video (see View local video), content video (seeScreen and content share)
if (tileState.isLocalTile || tileState.isContent) return
val videoRenderView = /* a VideoRenderView object in your application to show the video */
meetingSession.audioVideo.bindVideoView(videoRenderView, tileState.tileId)
}
override onVideoTileRemoved(tileState : VideoTileState ) {
// unbind video view to stop viewing the tile
audioVideo.unbindVideoView(tileState.tileId)
}
}
meetingSession.audioVideo.addVideoTileObserver(observer)
より高度なビデオタイル管理については、ビデオページネーションをご覧ください。
// Use internal camera capture for the local video
meetingSession.audioVideo.startLocalVideo()
// Use internal camera capture and set configuration for the video, e.g. maxBitRateKbps
// If maxBitRateKbps is not set, it will be self adjusted depending on number of users and videos in the meeting
// This can be called multiple times to dynamically adjust video configuration
val localVideoConfig = LocalVideoConfiguration ( 600 )
meetingSession.audioVideo.startLocalVideo(localVideoConfig)
// You can switch camera to change the video input device
meetingSession.audioVideo.switchCamera()
// Or you can inject custom video source for local video, see custom video guide
meetingSession.audioVideo.stopLocalVideo()
val observer = object : VideoTileObserver {
override fun onVideoTileAdded ( tileState : VideoTileState ) {
// onVideoTileAdded is called after startLocalVideo
val localVideoRenderView = /* a VideoRenderView object to show local video */
if (tileState.isLocalTile) {
audioVideo.bindVideoView(localVideoRenderView, tileState.tileId)
}
}
override onVideoTileRemoved(tileState : VideoTileState ) {
// onVideoTileRemoved is called after stopLocalVideo
if (tileState.isLocalTile) {
logger.info( TAG , " Local video is removed " )
audioVideo.unbindVideoView(tileState.tileId)
}
}
}
meetingSession.audioVideo.addVideoTileObserver(observer)
注:お客様または他の参加者がコンテンツ(画面キャプチャやその他のビデオソースオブジェクトなど)を共有すると、コンテンツ参加者(出席者-ID#コンテンツ)がセッションに参加し、通常の参加者がビデオを共有するかのようにコンテンツを共有します。
たとえば、出席者IDは「My-ID」です。
meetingSession.audioVideo.startContentShare
に電話すると、コンテンツの参加者「My-ID#Content」がセッションに参加し、コンテンツを共有します。
val observer = object : ContentShareObserver {
override fun onContentShareStarted () {
logger.info( TAG , " Content share started " )
}
override fun onContentShareStopped ( status : ContentShareStatus ) {
logger.info( TAG , " Content share stopped with status ${status.statusCode} " )
}
}
meetingSession.audioVideo.addContentShareObserver(observer)
val contentShareSource = /* a ContentShareSource object, can use DefaultScreenCaptureSource for screen share or any subclass with custom video source */
// ContentShareSource object is not managed by SDK, builders need to start, stop, release accordingly
meetingSession.audioVideo.startContentShare(contentShareSource)
コンテンツ共有の構成を設定できます。たとえば、maxbitratekbpsなどです。達成される実際の品質は、システムとネットワークが提供できるものによって、通話全体で異なる場合があります。
val contentShareConfig = LocalVideoConfiguration ( 200 )
meetingSession.audioVideo.startContentShare(contentShareSource, contentShareConfig)
詳細については、コンテンツの共有を参照してください。
meetingSession.audioVideo.stopContentShare()
Chime SDKは、会議ごとに2つの同時コンテンツシェアを許可します。リモートコンテンツの共有は、 onVideoTileAdded
をトリガーしますが、ローカルシェアはそうしません。プレビュー用のビデオをレンダリングするには、 ContentShareSource
のVideoSource
にVideoSink
を追加します。
val observer = object : VideoTileObserver {
override fun onVideoTileAdded ( tileState : VideoTileState ) {
if (tileState.isContent) {
// tileState.attendeeId is formatted as "attendee-id#content"
val attendeeId = tileState.attendeeId
// Get the attendee ID from "attendee-id#content"
val baseAttendeeId = DefaultModality (attendeeId).base()
logger.info( TAG , " $baseAttendeeId is sharing screen " )
val contentVideoRenderView = /* a VideoRenderView object in your application to show the content video */
meetingSession.audioVideo.bindVideoView(contentVideoRenderView, tileState.tileId)
}
}
override onVideoTileRemoved(tileState : VideoTileState ) {
// unbind video view to stop viewing the tile
meetingSession.audioVideo.unbindVideoView(tileId)
}
}
meetingSession.audioVideo.addVideoTileObserver(observer)
より利用可能なメトリックや、オーディオ、ビデオ、コンテンツの共有品質を監視するためのObservableMetric
参照してください。
val observer = object : MetricsObserver {
override fun onMetricsReceived ( metrics : Map < ObservableMetric , Any >) {
metrics.forEach { (metricsName, metricsValue) ->
logger.info( TAG , " $metricsName : $metricsValue " )
}
}
}
meetingSession.audioVideo.addMetricsObserver(observer)
会議セッションを開始した後、複数のトピックからリアルタイムメッセージを受信できます。
注:ローカル参加者から送信されたデータメッセージは、スロットされていない限り、このコールバックをトリガーしません。
val YOUR_ATTENDEE_ID = meetingSession.configuration.credentials.attendeeId
val observer = object : DataMessageObserver {
override fun onDataMessageReceived ( dataMessage : DataMessage ) {
// A throttled message is returned by backend
if ( ! dataMessage.throttled) {
logger.info( TAG , " [ ${dataMessage.timestampMs} ][{ $dataMessage .senderAttendeeId}] : ${dataMessage.text()} " )
}
}
// You can subscribe to multiple topics.
const val DATA_MESSAGE_TOPIC = " chat "
meetingSession.audioVideo.addRealtimeDataMessageObserver( DATA_MESSAGE_TOPIC , observer)
任意のトピックにリアルタイムメッセージを送信することができます。これには、購読したオブザーバーに通知されます。
注:トピックはアルファ数である必要があり、ハイフンとアンダースコアを含めることができます。データは2kbを超えることはできません。寿命はオプションですが、整数は正です。
const val DATA_MESSAGE_TOPIC = " chat "
const val DATA_MESSAGE_LIFETIME_MS = 1000
// Send "Hello Chime" to any subscribers who are listening to "chat" topic with 1 seconds of lifetime
meetingSession.audioVideo.realtimeSendDataMessage(
DATA_MESSAGE_TOPIC ,
" Hello Chime " ,
DATA_MESSAGE_LIFETIME_MS
)
注:メモリリークを避けるために、すべてのオブザーバーを削除し、追加したリソースをリリースしてください。
val observer = object : AudioVideoObserver {
override fun onAudioSessionStopped ( sessionStatus : MeetingSessionStatus ) {
// This is where meeting ended.
// You can do some clean up work here.
}
override fun onVideoSessionStopped ( sessionStatus : MeetingSessionStatus ) {
// This will be invoked as well.
}
}
meetingSession.audioVideo.addAudioVideoObserver(observer)
meetingSession.audioVideo.stop()
Amazon Voice Focusは、会議のバックグラウンドノイズを減らし、会議の経験を改善します。詳細については、Amazon Voice Focusを参照してください。
val enbabled = meetingSession.audioVideo.realtimeSetVoiceFocusEnabled( true ) // enabling Amazon Voice Focus successful
val disabled = meetingSession.audioVideo.realtimeSetVoiceFocusEnabled( false ) // disabling Amazon Voice Focus successful
カスタムビデオソースを使用すると、ビデオフィルターの適用など、ビデオを制御できます。詳細については、カスタムビデオを参照してください。
バックグラウンドブラー/交換により、ビデオの背景を画像に適用したり、画像に置き換えることができます。詳細については、BackgroundFilterを参照してください。
バージョン0.18.3から始めて、SDKは、パケットの損失を検出してオーディオ品質への影響を減らすために、パケット損失を検出することで冗長なオーディオデータの送信をサーバーに開始します。冗長なオーディオパケットは、アクティブなオーディオ、つまりスピーチ、音楽を含むパケットにのみ送信されます。これにより、検出されたパケット損失の量に応じて、オーディオによって消費される帯域幅が通常の最大3倍に増加する可能性があります。 SDKは、5分間パケット損失が検出されていない場合、冗長データの送信を自動的に停止します。
この機能を無効にする必要がある場合は、セッションを開始する前にaudiovideoconfigurationを使用して行うことができます。
meetingSession.audioVideo.start( AudioVideoConfiguration (enableAudioRedundancy = false ))
機能を無効にするオプションはありますが、オーディオ品質を向上させるために有効にすることをお勧めします。それを無効にする1つの考えられる理由は、顧客が非常に厳しい帯域幅の制限を持っている場合です。
Amazon Chime SDKの一般的なFAQを参照してください。
アプリケーションは、会議を作成する際にロガーのインスタンスを渡すことにより、Chime SDKからログを取得できます。 Amazon Chime SDKには、コンソールにログインするConsoleLoggerなど、アプリケーションが使用できるロガーのデフォルトの実装がいくつかあります。 ConsoleLogger
は、デフォルトとしてINFO
レベルに設定されています。したがって、メディアログを含むすべてのログを取得するために、次のことによりロガーを作成します。
val logger = ConsoleLogger ( LogLevel . VERBOSE )
SDKは、マイクデバイスへの接続を開く際に記録プリセットの設定を必要とするOpenSl ESを使用します。すべての可能なAndroidデバイスでうまく機能する特定のプリセット値がないことを発見しました。 SDKは、私たちが所有しているデバイスでいくつかのテストを実行した後に到達したVoiceCommunication
のデフォルトのプリセットを使用します。このデフォルトのプリセットが機能せず、リモートパーティがあなたの声を聞くことができない場合は、Start APIに渡されるAudioVideoConfiguration
でaudioRecordingPresetOverride
を指定して、別の録音プリセットでセッションを開始してみてください。
// Creating a config where the preset is overriden with Generic (for example)
val audioVideoConfig = AudioVideoConfiguration (audioRecordingPresetOverride = AudioRecordingPresetOverride . Generic )
// Start Audio Video
audioVideo.start(audioVideoConfig)
バックグラウンド交換の使用には追加の通知があります。お客様とあなたのエンドユーザーは、バックグラウンド交換で使用するためにアップロードされるすべてのコンテンツ(任意の画像を含む)に対して責任があり、そのようなコンテンツが法律に違反したり、第三者の権利を侵害したり、不正に流したり、そうでなければ重要な用語に違反しないことを確認する必要がありますAmazonとの合意(ドキュメント、AWSサービス条件、または許容可能な使用ポリシーを含む)。
Copyright Amazon.com、Inc。またはその関連会社。無断転載を禁じます。