아마존 차임 SDK 프로젝트 보드
참고 : SDK 소스 코드를 사용하여 구축하는 경우
development
지점에는 공개적으로 사용 가능한 Chime Media Library와 함께 구축되지 않을 수 있거나 공개 릴리스만큼 안정적이지 않을 수있는 출혈 엣지 변경이 포함되어 있습니다.
Android 용 Amazon Chime SDK를 사용하면 Amazon Chime 서비스에서 회의를 제공하는 동일한 인프라 서비스를 사용하여 협업 오디오 통화, 화상 통화 및 화면 공유 기능을 Android 애플리케이션에 쉽게 추가 할 수 있습니다.
Android 용 Amazon Chime SDK는 AWS 계정에서 만든 회의 세션 리소스에 연결하여 작동합니다. SDK에는 Android 애플리케이션에서 사용자 정의 통화 및 협업 경험을 구축하는 데 필요한 모든 내용이 있습니다. 방법을 포함하여 다음과 같은 방법을 포함하여 회의 세션, 목록 및 선택, 비디오 장치 전환, 화면 공유 시작 및 중지, 미디어 이벤트가 발생할 때 콜백 수신 볼륨이 변경되고 오디오 음소거 및 비디오 타일 바인딩과 같은 회의 기능을 관리합니다.
또한 커뮤니티 요청 및 해당 상태를 찾을 수있는 Amazon Chime SDK 프로젝트 보드도 있습니다.
시작하려면 다음 리소스를 참조하십시오.
다음 안내서를 검토하십시오.
참고 : 데모 애플리케이션을 실행하려면 데모 앱 실행에 건너 뜁니다.
Android 용 Mobile SDK는 Android Project의 Gradle 파일에 통합하여 Maven Central 저장소에서 다운로드하거나 .AAR 파일을 통해 직접 내장 할 수 있습니다.
설정을 위해 프로젝트의 루트 폴더를 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- 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 장치 또는 에뮬레이터에 설치되거나 실행되지 않습니다. 중요 : ARM 장치 만 지원됩니다.
앱을 묶기 위해 미디어 바이너리에 기능이없는 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
Binaries를 다운로드하십시오.
더 많은 머신 러닝 기능을 사용하려면 Background Blur/Replacement와 같은 최신 릴리스에서 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 장치 또는 에뮬레이터에 설치되거나 실행되지 않습니다. 중요 : ARM 장치 만 지원됩니다.
앱을 묶기 위해 완전히 기능적인 ARM 아키텍처와 결합하지 않는 비 기능 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
미디어 바이너리 및 아래 지침에서 amazon-chime-sdk-media
참조로 대체하십시오.
참고 : 우리는 다른 릴리스에서 믹싱 및 일치하는 이진을 지원하지 않습니다.
압축을 풀고 AAR 파일을 root/app/libs
에 복사하십시오
allprojects
의 repositories
root
에 다음을 추가하여 build.gradle
업데이트하십시오.
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
Library를 사용하는 경우 dependencies
하에서 아래 명령문을 추가하십시오.
implementation(name: 'amazon-chime-sdk-machine-learning', ext: 'aar')
compileOptions
아래의 root/app
에서 gradle : update build.gradle
:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
참고 : 이것은 단지 데모 애플리케이션을 실행하고 SDK를 AAR 라이브러리 대신 코드로 사용하는 것입니다.
데모 응용 프로그램을 실행하려면 다음 단계를 따르십시오.
참고 : ARM 지원 장치 (실제 장치) 또는 ARM을 지원하는 시뮬레이터에서 실행 중인지 확인하십시오. 현재 X86을 지원하지 않으므로 X86이있는 시뮬레이터가 작동하지 않습니다.
https://xxxxx.xxxxx.xxx.com/Prod/
반환하는 Amazon-Chime-SDK-JS에서 Serverless 데모를 배포하십시오.
모바일 데모 앱에 https://xxxxx.xxxxx.xxx.com/Prod/
제공하십시오.
최신 릴리스에서 amazon-chime-sdk-media
Binary Binary를 다운로드하십시오.
머신 러닝 기능을 위해 amazon-chime-sdk-machine-learning
바이너리를 다운로드하십시오.
AAR 파일을 압축하고 복사하여 amazon-chime-sdk-android/amazon-chime-sdk/libs
에 복사하십시오
strings.xml
에서 test_url
업데이트하여 1 단계에 배포 된 서버리스 데모의 URL을 사용하여 amazon-chime-sdk-android/app/src/main/res/values
하십시오.
참고 :
https://xxxxx.xxxxx.xxx.com/Prod/
사용하십시오.
이 프로젝트에서 잠재적 인 보안 문제를 발견하면 취약성보고 페이지를 통해 AWS/Amazon Security에 알리는 것을 요청합니다. 공개 github 문제를 만들지 마십시오 .
오디오 보내기 및 수신을 시작하려면 회의 세션을 시작해야합니다.
기본 구성으로 세션을 시작하십시오.
meetingSession.audioVideo.start()
사용자 정의 구성으로 세션을 시작하십시오.
meetingSession.audioVideo.start(audioVideoConfiguration)
이러한 구성은 audioVideoConfiguration
에서 사용할 수 있습니다.
audioMode
audioDeviceCapabilities
audioStreamType
audioRecordingPresetOverride
enableAudioRedundancy
reconnectTimeoutMs
Audiomode : 기본 오디오 형식은 48kHz 샘플링 속도 (stereo48k)가있는 Stereo/48KHz IE Stereo Audio입니다. 다른 지원되는 오디오 형식에는 Mono/48kHz (MONO48K) 또는 MONO/16KHz (MONO16K)가 있습니다. AudioVideoConfiguration
에서 비 디폴트 오디오 모드를 지정한 다음 회의 세션을 시작할 수 있습니다.
AudioDeviceCapabilities : 기본 오디오 장치 기능은 오디오 입력 및 출력 장치가 활성화 된 ( InputAndOutput
), 즉 마이크 및 스피커가 모두 활성화되어야합니다. InputAndOutput
MODIFY_AUDIO_SETTINGS
및 RECORD_AUDIO
권한이 필요합니다. 다른 옵션은 OutputOnly
(마이크 비활성화 및 스피커가 활성화; MODIFY_AUDIO_SETTINGS
권한이 필요함) 및 None
(마이크 및 스피커 비활성화, 오디오 권한이 필요하지 않음)입니다.
AudiostreamType : 기본값은 VoiceCall
입니다. 사용 가능한 옵션은 VoiceCall
및 Music
이며 Audiomanager에서 각각 STREAM_VOICE_CALL
및 STREAM_MUSIC
과 같습니다. 이 구성은 Oculus Quest 2의 오디오 볼륨 문제를 해결하기위한 것입니다. 그것이 무엇인지 모르는 경우 걱정할 필요가 없습니다. 자세한 내용은 Android 문서 : Stream_voice_call, Stream_music을 참조하십시오.
참고 : Android에는 사용 가능한 스트림 옵션이 더 많지만 현재 Amazon Chime SDK에서는 Stream_Voice_Call 및 Stream_Music 만 지원됩니다.
AudioreCordingPresetOverride : 기본값은 None
입니다. 사용 가능한 옵션은 Generic
, Camcorder
, VoiceRecognition
및 VoiceCommunication
None
. 이들은 여기에 Android AudioreCorder 구성 에 언급 된 옵션과 같습니다.
enableAudioredUndancy : 기본값은 참입니다. 활성화되면 SDK는 패킷 손실 감지에 대한 중복 오디오 데이터를 보내 오디오 품질에 미치는 영향을 줄입니다. 자세한 내용은 중복 오디오 섹션에서 찾을 수 있습니다.
ReconnectTimeoutms : 기본값은 180,000ms입니다. 이 구성을 사용하여 네트워크 상태가 좋지 않아 세션 재 연결 시간 초과를 제어하십시오.
참고 : 이벤트 누락을 피하려면 세션이 시작되기 전에 관찰자를 추가하십시오. meetingsession.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
객체를 전달하여 오디오 장치를 선택하십시오.참고 : 세션이 시작된 후에 선택권에 전화해야합니다. 그렇지 않으면 No-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
}
회의에 가입하면 오디오 세션을 시작할 때 명시 적으로 지정되지 않은 경우 각 구성에는 기본값이 있습니다.
- 지원되는 오디오 모드 옵션 : 모노/16kHz , 모노/48kHz 및 스테레오/48kHz . 기본값은 스테레오/48kHz 입니다.
- 지원되는 AudioDeviceCapabilities 옵션 : 입력 및 출력 , 출력 전용 및 없음 . 기본값은 입력 및 출력 입니다.
- 지원되는 오디오 스트림 유형 옵션 : Voicecall 및 음악 . 기본값은 VoiceCall 입니다
- 지원되는 AudioreCordingPreseToverride 옵션 : 없음 , 제네릭 , 캠코더 , Voicerecognition 및 Voicecommunication . 기본값은 없다 .
- 지원되는 enableAudioredUndancy 옵션 : True 및 False . 기본값은 사실 입니다.
- 지원되는 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)
참고 : 귀하 또는 다른 참석자가 콘텐츠 (예 : 스크린 캡처 또는 기타 VideoSource 객체)를 공유 할 때 Content 참석자 (참석자 -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는 회의 당 동시 컨텐츠 공유를 허용합니다. 원격 컨텐츠 주식은 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 ))
기능을 비활성화하는 옵션이 있지만 오디오 품질 향상을 위해 IT를 활성화하는 것이 좋습니다. 비활성화해야 할 이유 중 하나는 고객이 엄격한 대역폭 제한을 가지고 있다면 가능할 수 있습니다.
Amazon Chime SDK의 일반 FAQ를 참조하십시오.
응용 프로그램은 회의를 만들 때 로거 인스턴스를 전달하여 Chime SDK에서 로그를 얻을 수 있습니다. Amazon Chime SDK에는 콘솔에 로그인하는 Consolelogger와 같이 응용 프로그램이 사용할 수있는 로거의 기본 구현이 있습니다. ConsoleLogger
INFO
수준으로 기본값으로 설정되었습니다. 따라서 미디어 로그를 포함한 모든 로그를 얻으려면 다음을 수행하여 로거를 만듭니다.
val logger = ConsoleLogger ( LogLevel . VERBOSE )
SDK는 아래에 오프 렌스를 사용하여 마이크 장치에 대한 연결을 열면서 사전 설정을 설정해야합니다. 우리는 가능한 모든 Android 장치에서 잘 작동하는 특정 사전 설정 값이 없다는 것을 발견했습니다. SDK는 기본 VoiceCommunication
의 기본 사전 설정을 사용하여 소유물의 장치에서 일부 테스트를 실행 한 후 도착했습니다. 이 기본 사전 설정이 작동하지 않고 원격 당사자가 귀하의 의견을들을 수없는 경우, 시작 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. 또는 그 계열사. 모든 권리 보유.