Amazon Chime SDK Project Board
หมายเหตุ: หากการสร้างด้วยซอร์สโค้ด SDK สาขา
development
มีการเปลี่ยนแปลงที่มีเลือดออกซึ่งอาจไม่สามารถสร้างได้ด้วยห้องสมุดสื่อมวลชนที่มีอยู่ในที่สาธารณะหรืออาจไม่มั่นคงเท่ากับการเผยแพร่สาธารณะ
Amazon Chime SDK สำหรับ Android ทำให้ง่ายต่อการเพิ่มการโทรด้วยเสียงการทำงานร่วมกันการโทรวิดีโอและคุณสมบัติการดูหน้าจอแชร์ในแอปพลิเคชัน Android โดยใช้บริการโครงสร้างพื้นฐานเดียวกันกับที่ให้บริการการประชุมบนบริการ Amazon Chime
Amazon Chime SDK สำหรับ Android นี้ทำงานโดยการเชื่อมต่อกับทรัพยากรเซสชันการประชุมที่คุณสร้างขึ้นในบัญชี AWS ของคุณ SDK มีทุกสิ่งที่คุณต้องการในการสร้างการโทรที่กำหนดเองและประสบการณ์การทำงานร่วมกันในแอปพลิเคชัน Android ของคุณรวมถึงวิธีการ: กำหนดค่าเซสชันการประชุมรายการและเลือกอุปกรณ์เสียงสลับอุปกรณ์วิดีโอเริ่มต้นและหยุดการดูหน้าจอ เมื่อมีการเปลี่ยนแปลงระดับเสียงและจัดการคุณสมบัติการประชุมเช่นเสียงปิดเสียงและการผูกกระเบื้องวิดีโอ
นอกจากนี้เรายังมีคณะกรรมการโครงการ SDK ของ Amazon Chime ซึ่งคุณสามารถค้นหาคำขอชุมชนและสถานะของพวกเขาได้
ในการเริ่มต้นดูแหล่งข้อมูลต่อไปนี้:
และตรวจสอบคำแนะนำต่อไปนี้:
หมายเหตุ: หากคุณต้องการเรียกใช้แอปพลิเคชันสาธิตให้ข้ามไปเรียกใช้แอพสาธิต
สามารถดาวน์โหลด SDKs สำหรับ Android ได้จากที่เก็บ Maven Central โดยรวมเข้ากับไฟล์ Gradle ของโครงการ Android หรือคุณสามารถฝังตัวผ่านไฟล์. aar ได้โดยตรง
เพื่อจุดประสงค์ในการตั้งค่าโฟลเดอร์รูทของโครงการของคุณจะถูกเรียกว่า root
เพื่อให้ได้การพึ่งพาจาก Maven ให้เพิ่มการพึ่งพาการพึ่งพาแอป (ระดับโมดูล) ของคุณ build.gradle
อัปเดต build.gradle
ใน root/app
และเพิ่มสิ่งต่อไปนี้ภายใต้ 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-sdk-machine-learning
โมดูลจากการพึ่งพาสกรรมกริยาของ 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'
}
}
โครงการสามารถสร้าง ARM และเป้าหมาย X86 ซึ่งอาจเป็นประโยชน์หากรวมแอพ เป้าหมาย x86 จะไม่ทำงานและไม่ได้มีวัตถุประสงค์เพื่อติดตั้งหรือทำงานบนอุปกรณ์หรือตัวจำลองใด ๆ สำคัญ: รองรับอุปกรณ์แขนเท่านั้น
หากคุณต้องการ Stubs X86 ที่ไม่ทำงานใน Media Binary เพื่อรวมแอพของคุณคุณสามารถผนวก -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 Binaries ในโครงการของคุณเองให้ทำตามขั้นตอนเหล่านี้
ดาวน์โหลด amazon-chime-sdk
และ amazon-chime-sdk-media
Binaries จากรุ่นล่าสุด
หากคุณต้องการใช้คุณสมบัติการเรียนรู้ของเครื่องจักรมากขึ้นเช่นพื้นหลังเบลอ/การแทนที่นอกจากนี้ยังดาวน์โหลดไบนารี amazon-chime-sdk-machine-learning
จากการเปิดตัวล่าสุด มิฉะนั้นคุณสามารถเพิกเฉยต่อการอ้างอิงทั้งหมดไปยัง amazon-chime-sdk-machine-learning
ในคำแนะนำด้านล่าง
หากคุณไม่ต้องการฟังก์ชั่นการแชร์วิดีโอและเนื้อหาหรือการสนับสนุนตัวแปลงสัญญาณวิดีโอซอฟต์แวร์คุณสามารถใช้ amazon-chime-sdk-media-no-video-codecs
แทน amazon-chime-sdk-media
เพื่อยกเว้นการสนับสนุนวิดีโอซอฟต์แวร์ ลดขนาด หากคุณทำเช่นนั้นคุณสามารถรักษาการอ้างอิงทั้งหมดไปยัง amazon-chime-sdk-media
เป็น amazon-chime-sdk-media-no-video-codecs
ในคำแนะนำด้านล่าง
โครงการสามารถสร้าง ARM และเป้าหมาย X86 ซึ่งอาจเป็นประโยชน์หากรวมแอพ เป้าหมาย x86 จะไม่ทำงานและไม่ได้มีวัตถุประสงค์เพื่อติดตั้งหรือทำงานบนอุปกรณ์หรือตัวจำลองใด ๆ สำคัญ: รองรับอุปกรณ์แขนเท่านั้น
หากคุณต้องการ stub x86 ที่ไม่ทำงานรวมกับสถาปัตยกรรมแขนที่ใช้งานได้อย่างสมบูรณ์เพื่อรวมแอพของคุณคุณสามารถใช้ amazon-chime-sdk-media-x86-stub
หรือ amazon-chime-sdk-media-no-video-codecs-x86-stub
Media ไบนารีและแทนที่พวกเขาสำหรับการอ้างอิง amazon-chime-sdk-media
ในคำแนะนำด้านล่าง
หมายเหตุ: เราไม่สนับสนุนการผสมและการจับคู่ไบนารีจากรุ่นที่แตกต่างกัน
เปิดเครื่องซิปและคัดลอกไฟล์ AAR ไปยัง root/app/libs
อัปเดต build.gradle
ใน root
โดยการเพิ่มสิ่งต่อไปนี้ภายใต้ repositories
ใน allprojects
:
allprojects {
repositories {
jcenter()
flatDir {
dirs 'libs'
}
}
}
อัปเดต build.gradle
ใน root/app
และเพิ่มสิ่งต่อไปนี้ภายใต้ 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')
อัปเดต build.gradle
ใน root/app
ภายใต้ compileOptions
:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
หมายเหตุ: นี่เป็นเพียงการเรียกใช้แอปพลิเคชันตัวอย่างและใช้ SDK เป็นรหัสแทน AAR Library
ในการเรียกใช้แอปพลิเคชันสาธิตให้ทำตามขั้นตอนเหล่านี้
หมายเหตุ: โปรดตรวจสอบให้แน่ใจว่าคุณกำลังทำงานบนอุปกรณ์ที่รองรับ ARM (อุปกรณ์จริง) หรือเครื่องจำลองที่รองรับ ARM เราไม่สนับสนุน x86 ในปัจจุบันดังนั้นเครื่องจำลองที่มี x86 จะไม่ทำงาน
ปรับใช้การสาธิต Serverless จาก Amazon-chime-sdk-js ซึ่งส่งคืน https://xxxxx.xxxxx.xxx.com/Prod/
ให้ https://xxxxx.xxxxx.xxx.com/Prod/
สำหรับแอพสาธิตมือถือ
ดาวน์โหลด amazon-chime-sdk-media
Binary จากรุ่นล่าสุด
ดาวน์โหลดไบนารี amazon-chime-sdk-machine-learning
สำหรับคุณสมบัติการเรียนรู้ของเครื่อง
เปิดซิปและคัดลอกไฟล์ AAR ไปยัง amazon-chime-sdk-android/amazon-chime-sdk/libs
อัปเดต test_url
ใน strings.xml
ที่พา ธ amazon-chime-sdk-android/app/src/main/res/values
ด้วย URL ของการสาธิตแบบไร้เซิร์ฟเวอร์ที่ปรับใช้ในขั้นตอนที่ 1
หมายเหตุ: ใช้
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 เช่นเสียงสเตอริโอด้วยอัตราการสุ่มตัวอย่าง 48kHz (Stereo48K) รูปแบบเสียงที่รองรับอื่น ๆ ได้แก่ mono/48kHz (mono48K) หรือ mono/16kHz (mono16k) คุณสามารถระบุโหมดเสียงที่ไม่เปลี่ยนรูปใน AudioVideoConfiguration
จากนั้นเริ่มเซสชันการประชุม
AudioDeviceCapabilities: ความสามารถของอุปกรณ์เสียงเริ่มต้นคือการเปิดใช้งานทั้งอุปกรณ์อินพุตเสียงและเอาต์พุต ( InputAndOutput
) IE ทั้งไมโครโฟนและลำโพงถูกเปิดใช้งาน InputAndOutput
จะต้องมีการแก้ไข MODIFY_AUDIO_SETTINGS
และ RECORD_AUDIO
ตัวเลือกอื่น ๆ คือ OutputOnly
(เปิดใช้งานไมโครโฟนและเปิดใช้งานลำโพงต้องการการอนุญาต MODIFY_AUDIO_SETTINGS
) และ None
(ทั้งไมโครโฟนและลำโพงปิดใช้งาน; ไม่จำเป็นต้องได้รับอนุญาตใด ๆ )
AudiOSTreamType: ค่าเริ่มต้นคือ VoiceCall
ตัวเลือกที่มีอยู่คือ VoiceCall
และ Music
พวกเขาเทียบเท่ากับ STREAM_VOICE_CALL
และ STREAM_MUSIC
ตามลำดับใน Audiomanager การกำหนดค่านี้มีไว้สำหรับการแก้ไขปัญหาปริมาณเสียงใน Oculus Quest 2 หากคุณไม่รู้ว่ามันคืออะไรคุณอาจไม่ต้องกังวลเกี่ยวกับเรื่องนี้ สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสารเกี่ยวกับ Android: Stream_voice_Call, Stream_Music
หมายเหตุ: แม้ว่าจะมีตัวเลือกสตรีมที่มีอยู่มากขึ้นใน Android แต่ปัจจุบันเฉพาะ Stream_voice_Call และ Stream_Music เท่านั้นที่รองรับใน Amazon Chime SDK สำหรับ Android
AudiorecordingPresetOverride: ค่าเริ่มต้นคือ None
ตัวเลือกที่มีอยู่คือ None
, Generic
, Camcorder
, VoiceRecognition
และ VoiceCommunication
สิ่งเหล่านี้เทียบเท่ากับตัวเลือกที่กล่าวถึงที่นี่ภายใต้ การกำหนดค่า ADIORECORDER ของ Android
enableAudiorEdundancy: ค่าเริ่มต้นเป็นจริง เมื่อเปิดใช้งาน SDK จะส่งข้อมูลเสียงซ้ำซ้อนเกี่ยวกับการตรวจจับการสูญเสียแพ็คเก็ตเพื่อช่วยลดผลกระทบต่อคุณภาพเสียง รายละเอียดเพิ่มเติมสามารถพบได้ในส่วน เสียงซ้ำซ้อน
reconnectTimeOutms: ค่าเริ่มต้นคือ 180,000ms ใช้การกำหนดค่านี้เพื่อควบคุมเซสชันเชื่อมต่อหมดเวลาเนื่องจากสภาพเครือข่ายที่ไม่ดี
หมายเหตุ: หากต้องการหลีกเลี่ยงเหตุการณ์ใด ๆ ให้เพิ่มผู้สังเกตการณ์ก่อนที่เซสชันจะเริ่มขึ้น คุณสามารถลบผู้สังเกตการณ์ได้โดยโทรไปที่การประชุม. 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 หลังจากเริ่มเซสชันหรือจะเป็นแบบไม่มี คุณควรโทรหา Chooseaudiodevice ด้วยหนึ่งในอุปกรณ์ที่ส่งคืนจาก 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)
หมายเหตุ: SwitchCamera () เป็นแบบไม่ใช้ถ้าคุณใช้แหล่งถ่ายกล้องที่กำหนดเอง โปรดดูวิดีโอที่กำหนดเองสำหรับรายละเอียดเพิ่มเติม
สลับระหว่างกล้องด้านหน้าหรือด้านหลังบนอุปกรณ์หากมี
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
}
เมื่อเข้าร่วมการประชุมการกำหนดค่าแต่ละครั้งจะมีค่าเริ่มต้นหากไม่ได้ระบุไว้อย่างชัดเจนเมื่อเริ่มต้นเซสชันเสียง
- ตัวเลือก Audiomode ที่รองรับ: mono/16kHz , mono/48kHz และ สเตอริโอ/48kHz ค่าเริ่มต้นคือ สเตอริโอ/48kHz
- ตัวเลือก AudioDeviceCapabilities ที่รองรับ: อินพุตและเอาต์พุต , เอาต์พุตเท่านั้น และ ไม่มี ค่าเริ่มต้นคือ อินพุตและเอาต์พุต
- ตัวเลือก AudiOSTreamtype ที่รองรับ: Voicecall และ เพลง ค่าเริ่มต้นคือ voicecall
- รองรับ AudiorecordingPresetOverride: ไม่มี , ทั่วไป , กล้องถ่ายวิดีโอ , Voicerecognition และ การสื่อสาร Voicecommunication ค่าเริ่มต้นคือ ไม่มี
- ตัวเลือก enableaudioredundancy ที่รองรับ: จริง และ เท็จ ค่าเริ่มต้นเป็น จริง
- ค่า 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 กระเบื้องใหม่เมื่อผู้เข้าร่วมระยะไกลเดียวกันรีสตาร์ทวิดีโอ
คุณสามารถค้นหารายละเอียดเพิ่มเติมเกี่ยวกับการเพิ่ม/ลบ/ดูวิดีโอจากการสร้างแอปพลิเคชันการประชุมบน Android โดยใช้ Amazon Chime SDK
คุณสามารถเรียก 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) เข้าร่วมเซสชันและแชร์เนื้อหาราวกับว่าผู้เข้าร่วมประชุมทั่วไปแชร์วิดีโอ
ตัวอย่างเช่นรหัสผู้เข้าร่วมของคุณคือ "My-id" เมื่อคุณโทรไปที่
meetingSession.audioVideo.startContentShare
ผู้เข้าร่วมเนื้อหา "My-Id#เนื้อหา" จะเข้าร่วมเซสชันและแบ่งปันเนื้อหาของคุณ
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
ในขณะที่การแบ่งปันในท้องถิ่นจะไม่ หากต้องการแสดงวิดีโอเพื่อดูตัวอย่างให้เพิ่ม VideoSink
ลงใน VideoSource
ใน 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)
ดู 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
แหล่งวิดีโอที่กำหนดเองช่วยให้คุณสามารถควบคุมวิดีโอเช่นการใช้ตัวกรองวิดีโอ สำหรับรายละเอียดเพิ่มเติมดูวิดีโอที่กำหนดเอง
พื้นหลังเบลอ/การเปลี่ยนช่วยให้คุณสามารถใช้เบลอหรือแทนที่พื้นหลังของวิดีโอด้วยรูปภาพ สำหรับรายละเอียดเพิ่มเติมดูพื้นหลัง Filter
เริ่มต้นจากเวอร์ชัน 0.18.3 SDK เริ่มส่งข้อมูลเสียงซ้ำซ้อนไปยังเซิร์ฟเวอร์ของเราในการตรวจจับการสูญเสียแพ็กเก็ตเพื่อช่วยลดผลกระทบต่อคุณภาพเสียง แพ็คเก็ตเสียงซ้ำซ้อนจะถูกส่งออกไปสำหรับแพ็กเก็ตที่มีเสียงที่ใช้งานอยู่เช่นคำพูดหรือเพลง สิ่งนี้อาจเพิ่มแบนด์วิดท์ที่ใช้โดยเสียงมากถึง 3 เท่าของจำนวนปกติขึ้นอยู่กับปริมาณของการสูญเสียแพ็กเก็ตที่ตรวจพบ SDK จะหยุดส่งข้อมูลซ้ำซ้อนโดยอัตโนมัติหากไม่พบการสูญเสียแพ็กเก็ตใด ๆ เป็นเวลา 5 นาที
หากคุณต้องการปิดการใช้งานคุณสมบัตินี้คุณสามารถทำได้ผ่านการกำหนดค่า AudioVideOconfiguration ก่อนเริ่มเซสชัน
meetingSession.audioVideo.start( AudioVideoConfiguration (enableAudioRedundancy = false ))
ในขณะที่มีตัวเลือกในการปิดใช้งานคุณสมบัติเราขอแนะนำให้เปิดใช้งานเพื่อปรับปรุงคุณภาพเสียง เหตุผลหนึ่งที่เป็นไปได้ที่จะปิดการใช้งานอาจเป็นเพราะลูกค้าของคุณมีข้อ จำกัด แบนด์วิดท์ที่เข้มงวดมาก
อ้างถึงคำถามที่พบบ่อยทั่วไปสำหรับ Amazon Chime SDK
แอปพลิเคชันสามารถรับบันทึกจาก CHIME SDK โดยผ่านอินสแตนซ์ของ Logger เมื่อสร้างการประชุม Amazon Chime SDK มีการใช้งานเครื่องบันทึกเริ่มต้นที่แอปพลิเคชันของคุณสามารถใช้งานได้เช่น consolelogger ซึ่งเข้าสู่คอนโซล ConsoleLogger
ถูกตั้งค่าเป็นระดับ INFO
เป็นค่าเริ่มต้น ดังนั้นเพื่อให้ได้บันทึกทั้งหมดรวมถึงบันทึกสื่อสร้าง logger โดยติดตาม:
val logger = ConsoleLogger ( LogLevel . VERBOSE )
SDK ใช้ opensl es ใต้ซึ่งต้องการการตั้งค่าการบันทึกที่ตั้งไว้ล่วงหน้าในขณะที่เปิดการเชื่อมต่อกับอุปกรณ์ไมโครโฟน เราได้ค้นพบว่าไม่มีค่าที่ตั้งไว้ล่วงหน้าที่เฉพาะเจาะจงซึ่งทำงานได้ดีกับอุปกรณ์ Android ที่เป็นไปได้ทั้งหมด SDK ใช้ค่าเริ่มต้นที่ตั้งไว้ล่วงหน้าของ VoiceCommunication
ซึ่งเรามาถึงหลังจากทำการทดสอบบางอย่างบนอุปกรณ์ในความครอบครองของเรา หากค่าที่ตั้งไว้ล่วงหน้าเริ่มต้นนี้ใช้งานไม่ได้และนำไปสู่ฝ่ายรีโมทที่ไม่สามารถได้ยินคุณได้โปรดลองเริ่มต้นเซสชันด้วยการตั้งค่าการบันทึกที่แตกต่างกันโดยการระบุ audioRecordingPresetOverride
ในการกำหนดค่า AudioVideoConfiguration
ที่ผ่านเข้าสู่ API เริ่มต้น
// 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. หรือ บริษัท ในเครือ สงวนลิขสิทธิ์