아마존 차임 SDK 프로젝트 보드
참고 : SDK 소스 코드를 사용하여 구축하는 경우
development
지점에는 공개적으로 사용 가능한 Chime Media Library와 함께 구축되지 않을 수 있거나 공개 릴리스만큼 안정적이지 않을 수있는 출혈 엣지 변경이 포함되어 있습니다.
iOS 용 Amazon Chime SDK를 사용하면 Amazon Chime 서비스에서 회의를 제공하는 동일한 인프라 서비스를 사용하여 IOS 응용 프로그램에 협업 오디오 통화, 화상 통화 및 화면 공유 기능을 쉽게 추가 할 수 있습니다.
iOS 용 Amazon Chime SDK는 AWS 계정에서 만든 회의 세션 리소스에 연결하여 작동합니다. SDK에는 회의 세션, 목록 및 오디오 장치 선택, 비디오 장치 전환, 화면 공유 시작 및 정지 및 중지, 미디어 이벤트가 발생할 때 콜백 수신 볼륨이 변경되고 오디오 음소거 및 비디오 타일 바인딩과 같은 회의 기능을 관리합니다.
또한 커뮤니티 요청 및 해당 상태를 찾을 수있는 Amazon Chime SDK 프로젝트 보드도 있습니다.
시작하려면 다음 리소스를 참조하십시오.
다음 안내서를 검토하십시오.
GitHub 릴리스를 통해 SPM, Cocoapods 또는 Binaries의 프로젝트에서 Amazon Chime SDK를 통합 할 수 있습니다.
설정을 위해 프로젝트의 루트 폴더 ( .xcodeproj
파일을 찾을 수있는 곳)를 root
라고합니다.
Amazon Chime SDK는 Cocoapods를 통해 제공됩니다. Cocoapods를 설치하지 않은 경우 명령을 실행하여 Cocoapods를 설치하십시오.
$ gem install cocoapods
$ pod setup
시스템 설정에 따라 Cocoapods를 설치하는 데 Sudo를 사용해야 할 수도 있습니다.
$ sudo gem install cocoapods
$ pod setup
루트 디렉토리 ( *.xcodeproj 파일이있는 디렉토리)에서 다음을 실행하여 프로젝트에서 podfile을 만듭니다.
$ pod init
Podfile
편집하여 AmazonChimeSDK
프로젝트에 포함시킵니다.
target 'YourTarget' do
pod 'AmazonChimeSDK'
...
end
비디오 및 컨텐츠 공유 기능 또는 소프트웨어 비디오 코덱 지원이 필요하지 않은 경우 AmazonChimeSDKNoVideoCodecs
사용하여 크기를 줄일 수 있습니다.
target 'YourTarget' do
pod 'AmazonChimeSDKNoVideoCodecs'
...
end
(선택 사항) 배경 흐림 및 교체 기능을 사용하려면 다음을 추가하십시오.
target 'YourTarget' do
pod 'AmazonChimeSDKMachineLearning'
...
end
그런 다음 다음 명령을 실행하여 포드를 설치하십시오.
$ pod install --repo-update
프로젝트를 열려면 xcode를 사용하여 새로 생성 된 *.xcworkspace
파일을 루트 디렉토리에서 열어보십시오. 프로젝트 폴더에서 다음 명령을 발행하여이를 수행 할 수 있습니다.
$ xed .
참고 : *.xcodeproj를 사용하여 프로젝트를 열지 마십시오 .
배경 흐림 및 교체 기능을 사용하는 경우 Build Settings
탭 아래 Linking
섹션 아래에서 Other Linker Flags
에 -framework AmazonChimeSDKMachineLearning
추가하십시오.
Amazon Chime SDK는 SPM을 통해 제공됩니다. 비디오 및 컨텐츠 공유 기능 또는 소프트웨어 비디오 코덱 지원이 필요하지 않은 경우 대신 비디오 코덱 SPM을 사용하지 않도록 선택할 수 있습니다.
Xcode에서 프로젝트를 엽니 다
파일 로 이동> 스위프트 패키지 > 패키지 종속성 추가 ...
필드에서 패키지 저장소 URL을 입력하면 "https://github.com/aws/amazon-chime-sdk-ios-spm"을 입력하십시오. 대신 비디오 코덱 미디어 모듈을 사용하지 않으려면 "https://github.com/aws/amazon-chime-sdk-ios-no-video-codecs-spm"을 입력하십시오.
최신 버전 (예 : 0.23.1
)을 입력하고 다음을 클릭하십시오.
프로젝트의 패키지를 선택하고 마감을 클릭하십시오. AmazonChimeSDK
및 AmazonChimeSDKMedia
가 필요합니다. 배경 흐림 및 배경 교체를 사용하려면 AmazonChimeSDKMachineLearning
확인하십시오.
AmazonChimeSDK
및 AmazonChimeSDKMedia
Binaries를 다운로드하십시오.AmazonChimeSDKMachineLearning
바이너리를 다운로드하십시오. 그렇지 않으면 아래 지침에서 AmazonChimeSDKMachineLearning
에 대한 모든 참조를 무시할 수 있습니다.AmazonChimeSDKMedia
대신 AmazonChimeSDKMediaNoVideoCodecs
바이너리를 사용하여 아래 지시 사항에서 AmazonChimeSDKMedia
에 대한 모든 참조 AmazonChimeSDKMediaNoVideoCodecs
처리 할 수 있습니다.참고 : 우리는 다른 릴리스에서 믹싱 및 일치하는 이진을 지원하지 않습니다.
.framework
또는 .xcframework
s를 root
시키고 복사하여 프로젝트가 사용하는 프레임 워크에 따라 다릅니다. Xcode12.3 이상의 경우 컴파일 문제가 있으면 .xcframework
사용하십시오. .xcframework
는 Amazon Chime SDK iOS V0.15.0 이후에 사용할 수 있습니다 Xcode에서 .xcodeproj
파일을 열고 빌드 대상을 클릭하십시오.
Build Settings
탭에서
Framework Search Path
에 $(PROJECT_DIR)
를 추가하십시오.
Runpath Search Paths
에 @executable_path/Frameworks
추가하십시오.
Linking
섹션 아래에서 Other Linker Flags
에 다음 두 플래그를 추가하십시오.
-lc++
-ObjC
General
탭에서 Frameworks, Libraries, and Embedded Content
섹션을 찾으십시오. +를 클릭 한 다음 Add Others
다음 Add Files
.
.framework
사용하는 경우 AmazonChimeSDK.framework
.framework
AmazonChimeSDKMedia.framework
및 AmazonChimeSDKMachineLearning.framework
의 위치를 지정하십시오 .xcframework
대신 .xcframework
는 Amazon Chime SDK iOS V0.15.0 이후에 제공됩니다..xcframework
사용하는 경우 AmazonChimeSDK.xcframework
, AmazonChimeSDKMedia.xcframework
및 AmazonChimeSDKMachineLearning.xcframework
의 위치를 1 단계에서 지정하십시오.AmazonChimeSDK.framework
의 경우 AmazonChimeSDKMedia.framework
및 프레임 워크의 경우 Embed & Sign
이 Embed
옵션에서 선택되었는지 확인하십시오. AmazonChimeSDKMachineLearning.framework
의 경우 Do Not Embed
. 데모 응용 프로그램을 실행하려면 다음 단계를 따르십시오.
git clone [email protected]:aws/amazon-chime-sdk-ios.git
/AmazonChimeSDKDemo/Podfile
의 두 대상의 경우 AMAZON_CHIME_SDK_VERSION
특정 SDK 버전 (예 : 0.19.3
으로 바꾸거나 최신 버전의 Amazon Chime SDK를 사용하면 제거하십시오.
Under /AmazonChimeSDKDemo
에서 다음 명령을 실행하여 포드를 설치하십시오.
$ pod install --repo-update
최신 릴리스에서 AmazonChimeSDKMedia
및 AmazonChimeSDKMachineLearning
Binaries를 다운로드하십시오.
amazon-chime-sdk-ios/AmazonChimeSDK
폴더 및 AmazonChimeSDKMachineLearning.xcframework
에 AmazonChimeSDKMedia.xcframework
avenchimesdkdecframework에 amazonchimesdkmedia.xcframework를 amazon-chime-sdk-ios/AmazonChimeSDKDemo
폴더로 압축하고 복사하십시오.
Amazon-Chime-SDK-JS에서 서버리스 데모를 배포하십시오
AmazonChimeDemoSDKBroadcast.appex
는 AmazonChimesDkdemo에서 사용하는 장치 레벨 화면 공유에 대한 방송 확장자입니다. Embed without Signing
Embed
하십시오. 테스트하지 않으려면 Frameworks, Libraries, and Embedded Content
섹션에서 제거하십시오. 각 대상, Signing & Capabilities
탭에서
Signing
섹션, 자신의 Apple 개발자 팀 및 번들 식별자를 사용하십시오.App Groups
섹션에서는 공유 장치 레벨 화면 캡처를 테스트하려는 경우 앱 그룹을 선택하십시오. 자세한 내용은 콘텐츠 공유를 참조하십시오. 서버 URL 및 지역 업데이트 :
AppConfiguration.swift
서버 URL 및 Serverless 데모의 영역으로 위트를 업데이트하십시오.ViewControllerObjC.h
업데이트하십시오. (선택 사항) AppConfiguration.swift
및 SampleHandler.swift
에서 broadcastBundleId
및 appGroupId
업데이트하여 공유 장치 수준 화면 캡처를 테스트하려면 Broadcast Eplension Bundle ID 및 App Group ID를 사용하여 Swift를 업데이트하십시오. 자세한 내용은 콘텐츠 공유를 참조하십시오.
AmazonChimeSDKDemo/
에서 AmazonChimeSDKDemo.xcworkspace
파일을 열고 Xcode 사용 Xcode IDE의 상단 막대에서 Scheme 드롭 다운 목록에서 AmazonChimeSDKDemoPods
선택하고 빌드 장치를 선택하고 실행 버튼을 클릭하십시오.
AmazonChimeSDKDemo/
에서 AmazonChimeSDKDemo.xcworkspace
파일을 열고 Xcode 사용 Xcode IDE의 상단 막대에서 Scheme 드롭 다운 목록에서 AmazonChimeSDKDemo
선택하고 빌드 장치를 선택하고 실행 버튼을 클릭하십시오.
가입 화면에서 CallKit
없이 회의에 가입하거나 CallKit
Incoming/Outgeing 통화를 통해 가입하십시오. 데모 앱에는 푸시 알림이 없으므로 들어오는 통화를 통해 10 초 씩 결합하는 것이 지연되어 사용자에게 앱을 백그라운드하거나 화면을 잠글 수 있도록 충분한 시간을 제공합니다.
이 프로젝트에서 잠재적 인 보안 문제를 발견하면 취약성보고 페이지를 통해 AWS/Amazon Security에 알리는 것을 요청합니다. 공개 github 문제를 만들지 마십시오 .
오디오 보내기 및 수신을 시작하려면 회의 세션을 시작해야합니다.
meetingSession . audioVideo . start ( )
기본 구성은 다음과 같습니다.
.outputOnly
또는 .none
사용). AudioVideoConfiguration
에서 비 디폴트 옵션을 지정한 다음 회의 세션을 시작할 수 있습니다.
var audioVideoConfig = AudioVideoConfiguration (
audioMode : . mono48k ,
audioDeviceCapabilities : . outputOnly ,
callKitEnabled : true ,
enableAudioRedundancy : false ,
reconnectTimeoutMs : 180 * 1000 )
meetingSession . audioVideo . start ( audioVideoConfiguration : audioVideoConfig )
참고 : 이벤트 누락을 피하려면 세션이 시작되기 전에 관찰자를 추가하십시오. meetingsession.audiovideo.removeaudiovideoobserver (옵저버)로 전화하여 관찰자를 제거 할 수 있습니다.
class MyAudioVideoObserver : AudioVideoObserver {
func audioSessionDidStartConnecting ( reconnecting : Bool ) {
if ( reconnecting ) {
// e.g. the network connection is dropped.
}
}
func audioSessionDidStart ( reconnecting : Bool ) {
// Meeting session starts.
// Can use realtime, devices APIs.
}
func audioSessionDidDrop ( ) { }
func audioSessionDidStopWithStatus ( sessionStatus : MeetingSessionStatus ) {
// See the "Stopping a session" section for details.
}
func audioSessionDidCancelReconnect ( ) { }
func connectionDidRecover ( ) { }
func connectionDidBecomePoor ( ) { }
func videoSessionDidStartConnecting ( ) { }
func videoSessionDidStartWithStatus ( sessionStatus : MeetingSessionStatus ) {
// Video session starts.
// Can use video APIs.
}
func videoSessionDidStopWithStatus ( sessionStatus : MeetingSessionStatus ) { }
meetingSession . audioVideo . addAudioVideoObserver ( observer : self )
}
회의에 사용 가능한 오디오 장치를 나열하십시오.
// An list of MediaDevice objects
let audioDevices = meetingSession . audioVideo . listAudioDevices ( )
for device in audioDevices {
logger . info ( msg : " Device type: ( device . type ) , label: ( device . label ) " )
}
MediaDevice
객체를 전달하여 오디오 장치를 선택하십시오.참고 : 세션이 시작된 후에 전화해야합니다. 그렇지 않으면 No-OP가됩니다. listaudiodevices ()에서 반환 된 장치 중 하나와 함께 chooseaudiodevice를 호출해야합니다.
let audioDevices = audioVideo . listAudioDevices ( )
val device = /* An item from audioDevices */
meetingSession . audioVideo . chooseAudioDevice ( mediaDevice : device )
참고 : 사용자 정의 카메라 캡처 소스를 사용하는 경우 SwitchCamera ()가 No-OP입니다. 자세한 내용은 사용자 정의 비디오를 참조하십시오.
가능한 경우 장치에서 전면 또는 후면 카메라를 사용하도록 전환하십시오.
meetingSession . audioVideo . switchCamera ( )
새 오디오 장치가 연결되거나 오디오 장치가 연결이 끊어 질 때 콜백을 받으려면 DeviceChangeObserver
를 추가하십시오. audioDeviceDidChange
에는 업데이트 된 장치 목록이 포함되어 있습니다.
class MyDeviceChangeObserver : DeviceChangeObserver {
func audioDeviceDidChange ( freshAudioDeviceList : [ MediaDevice ] ) {
// A list of updated MediaDevice objects
for device in freshAudioDeviceList {
logger . info ( msg : " Device type: ( device . type ) , label: ( device . label ) " )
}
}
meetingSession . audioVideo . addDeviceChangeObserver ( observer : self )
}
let activeAudioDevice = meetingSession . audioVideo . getActiveAudioDevice ( )
회의에 참여할 때 Mono/16kHz , Mono/48kHz 및 Stereo/48kHz 가 지원됩니다. 오디오 세션을 시작할 때 명시 적으로 지정되지 않은 경우 스테레오/48kHz가 기본 오디오 모드로 설정됩니다.
meetingSession . audioVideo . start ( ) // starts the audio video session with Stereo/48KHz audio, audio input and output devices enabled, callkit disabled, and audio redundancy enabled
meetingSession . audioVideo . start ( audioVideoConfiguration ) // starts the audio video session with the specified [AudioVideoConfiguration]
참고 : 지금까지, 당신은 관찰자를 추가하여 장치 및 세션 수명주기 이벤트를받습니다. 다음 사용 사례에서는 실시간 API 방법을 사용하여 볼륨 표시기를 보내고 받고 음소거 상태를 제어합니다.
let muted = meetingSession . audioVideo . realtimeLocalMute ( ) // returns true if muted, false if failed
let unmuted = meetingSession . audioVideo . realtimeLocalUnmute // returns true if unmuted, false if failed
이를 사용하여 실시간 표시기 UI를 구축하고 배열에서 전달한 변경 사항에 대해 업데이트 할 수 있습니다.
참고 :이 콜백에는 이전 콜백의 델타 만 포함됩니다.
class MyRealtimeObserver : RealtimeObserver {
func volumeDidChange ( volumeUpdates : [ VolumeUpdate ] ) {
for currentVolumeUpdate in volumeUpdates {
// Muted, NotSpeaking, Low, Medium, High
logger . info ( msg : " ( currentVolumeUpdate . attendeeInfo . attendeeId ) 's volume changed: ( currentVolumeUpdate . volumeLevel ) " )
}
}
func signalStrengthDidChange ( signalUpdates : [ SignalUpdate ] ) {
for currentSignalUpdate in signalUpdates {
// None, Low, High
logger . info ( msg : " ( currentSignalUpdate . attendeeInfo . attendeeId ) 's signal strength changed: ( currentSignalUpdate . signalStrength ) " )
}
}
func attendeesDidJoin ( attendeeInfo : [ AttendeeInfo ] ) {
for currentAttendeeInfo in attendeeInfo {
logger . info ( msg : " ( currentAttendeeInfo . attendeeId ) joined the meeting " )
}
}
func attendeesDidLeave ( attendeeInfo : [ AttendeeInfo ] ) {
for currentAttendeeInfo in attendeeInfo {
logger . info ( msg : " ( currentAttendeeInfo . attendeeId ) left the meeting " )
}
}
func attendeesDidDrop ( attendeeInfo : [ AttendeeInfo ] ) {
for currentAttendeeInfo in attendeeInfo {
logger . info ( msg : " ( currentAttendeeInfo . attendeeId ) dropped from the meeting " )
}
}
func attendeesDidMute ( attendeeInfo : [ AttendeeInfo ] ) {
for currentAttendeeInfo in attendeeInfo {
logger . info ( msg : " ( currentAttendeeInfo . attendeeId ) muted " )
}
}
func attendeesDidUnmute ( attendeeInfo : [ AttendeeInfo ] ) {
for currentAttendeeInfo in attendeeInfo {
logger . info ( msg : " ( currentAttendeeInfo . attendeeId ) unmuted " )
}
}
meetingSession . audioVideo . addRealtimeObserver ( observer : self )
}
activeSpeakerDidDetect
이벤트를 사용하여 사용 가능한 경우 가장 활발한 스피커의 비디오 타일을 확대하거나 강조 할 수 있습니다. scoreCallbackIntervalMs
를 설정하고 activeSpeakerScoreDidChange
구현하면 정기적으로 활성 스피커의 점수를받을 수 있습니다.
class MyActiveSpeakerObserver : ActiveSpeakerObserver {
let activeSpeakerObserverId = UUID ( ) . uuidString
var observerId : String {
return activeSpeakerObserverId
}
func activeSpeakerDidDetect ( attendeeInfo : [ AttendeeInfo ] ) {
if !attendeeInfo . isEmpty {
logger . info ( msg : " ( attendeeInfo [ 0 ] . attendeeId ) is the most active speaker " )
}
}
var scoresCallbackIntervalMs : Int {
return 1000 // 1 second
}
func activeSpeakerScoreDidChange ( scores : [ AttendeeInfo : Double ] ) {
let scoresInString = scores . map { ( score ) -> String in
let ( key , value ) = score
return " ( key . attendeeId ) : ( value ) "
} . joined ( separator : " , " )
logger . info ( msg : " Scores of active speakers are: ( scoresInString ) " )
}
// Calculating the active speaker base on the SDK provided policy, you can provide any custom algorithm
meetingSession . audioVideo . addActiveSpeakerObserver ( policy : DefaultActiveSpeakerPolicy ( ) , observer : self )
}
참고 : 비디오를 표시하려면 비디오를
VideoRenderView
에 바인딩해야합니다.현지 비디오 타일은
isLocalTile
속성을 사용하여 식별 할 수 있습니다.
isContent
속성을 사용하여 컨텐츠 비디오 타일을 식별 할 수 있습니다. 화면 및 콘텐츠 공유를 참조하십시오.동일한 원격 참석자가 비디오를 다시 시작할 때 새 타일 ID로 타일이 생성됩니다.
Amazon Chime SDK를 사용하여 iOS에서 회의 애플리케이션을 구축하여 비디오 추가/제거/보기에 대한 자세한 내용을 확인할 수 있습니다.
기본적으로 발생하지 않으므로 startRemoteVideo
에 전화하여 원격 비디오를 받기 시작할 수 있습니다.
meetingSession . audioVideo . startRemoteVideo ( )
stopRemoteVideo
원격 비디오 수신을 중지하고 기존 원격 비디오를 위해 onVideoTileRemoved
를 트리거합니다.
meetingSession . audioVideo . stopRemoteVideo ( )
class MyVideoTileObserver : VideoTileObserver {
func videoTileDidAdd ( tileState : VideoTileState ) {
// Ignore local video (see View local video), content video (see Screen and content share)
if tileState . isLocalTile || tileState . isContent {
return
}
let videoRenderView = /* a VideoRenderView object in your application to show the video */
meetingSession . audioVideo . bind ( videoView : videoRenderView , tileId : tileState . tileId )
}
func videoTileDidRemove ( tileState : VideoTileState ) {
// unbind video view to stop viewing the tile
meetingSession . audioVideo . unbindVideoView ( tileId : tileState . tileId )
}
meetingSession . audioVideo . addVideoTileObserver ( observer : self )
}
// Use internal camera capture for the local video
meetingSession . audioVideo . startLocalVideo ( )
// Use internal camera capture and set configuration for the video, e.g. simulcastEnabled, 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 enable/disable simulcast and adjust video max bit rate on the fly
let localVideoConfig = LocalVideoConfiguration ( simulcastEnabled : true, maxBitRateKbps : 600 )
meetingSession . audioVideo . startLocalVideo ( config : 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 ( )
참고 : 로컬 비디오는 반영되어야합니다. videorenderview.mirror = true를 설정하십시오
class MyVideoTileObserver : VideoTileObserver {
func videoTileDidAdd ( tileState : VideoTileState ) {
if tileState . isLocalTile {
let localVideoView = /* a VideoRenderView object in your application to show the video */
meetingSession . audioVideo . bind ( videoView : localVideoView , tileId : tileState . tileId )
}
}
}
func videoTileDidRemove ( tileState : VideoTileState ) {
// unbind video view to stop viewing the tile
meetingSession . audioVideo . unbindVideoView ( tileId : tileState . tileId )
}
meetingSession . audioVideo . addVideoTileObserver ( observer : self )
}
보다 고급 비디오 타일 관리를 보려면 비디오 페이지 매김을 살펴보십시오.
참고 : 귀하 또는 다른 참석자가 콘텐츠 (예 : 스크린 캡처 또는 기타 VideoSource 객체)를 공유 할 때 Content 참석자 (참석자 -ID#컨텐츠)가 세션에 가입하고 일반 참석자가 비디오를 공유하는 것처럼 콘텐츠를 공유합니다.
예를 들어, 참석자 ID는 "my-id"입니다.
meetingSession.audioVideo.startContentShare
에 전화하면 콘텐츠 참석자 "My-ID#Content"가 세션에 참여하여 콘텐츠를 공유합니다.
class MyContentShareObserver : ContentShareObserver {
func contentShareDidStart ( ) {
logger . info ( msg : " Content Share has started " )
}
func contentShareDidStop ( status : ContentShareStatus ) {
logger . info ( msg : " Content Share has stopped " )
}
meetingSession . audioVideo . addContentShareObserver ( observer : self )
let contentShareSource = /* a ContentShareSource object, can use InAppScreenCaptureSource 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 ( source : contentShareSource )
}
MaxBitrateKBPS와 같은 컨텐츠 공유 구성을 설정할 수 있습니다. 달성 된 실제 품질은 시스템과 네트워크가 제공 할 수있는 것에 따라 통화에 따라 다를 수 있습니다.
let contentShareConfig = LocalVideoConfiguration ( maxBitRateKbps : 200 )
meetingSession . audioVideo . startContentShare ( source : contentShareSource , config : contentShareConfig )
자세한 내용은 콘텐츠 공유를 참조하십시오.
meetingSession . audioVideo . stopContentShare ( )
Chime SDK는 회의 당 동시 컨텐츠 공유를 허용합니다. 원격 컨텐츠 주식은 onVideoTileAdded
유발하는 반면, 현지 주식은 그렇지 않습니다. 미리보기 비디오를 렌더링하려면 ContentShareSource
에서 VideoSource
에 VideoSink
추가하십시오.
class MyVideoTileObserver : VideoTileObserver {
func videoTileDidAdd ( tileState : VideoTileState ) {
if ( tileState . isContent ) {
// tileState.attendeeId is formatted as "attendee-id#content"
let attendeeId = tileState . attendeeId
// Get the attendee ID from "attendee-id#content"
let baseAttendeeId = DefaultModality ( attendeeId ) . base ( )
logger . info ( msg : " $baseAttendeeId is sharing screen " )
let screenVideoView = /* a VideoRenderView object in your application to show the video */
meetingSession . audioVideo . bindVideoView ( videoView : screenVideoView , tileId : tileState . tileId )
}
}
func videoTileDidRemove ( tileState : VideoTileState ) {
meetingSession . audioVideo . unbindVideoView ( tileId : tileState . tileId )
}
meetingSession . audioVideo . addVideoTileObserver ( observer : self )
}
더 많이 사용 가능한 메트릭과 오디오, 비디오 및 콘텐츠 공유 품질을 모니터링하려면 ObservableMetric
참조하십시오.
class MyMetricsObserver : MetricsObserver {
func metricsDidReceive ( metrics : [ AnyHashable : Any ] ) {
logger . info ( msg : " Media metrics have been received: ( metrics ) " )
}
meetingSession . audioVideo . addMetricsObserver ( observer : self )
}
회의 세션을 시작한 후 여러 주제에서 실시간 메시지를받을 수 있습니다.
class MyDataMessageObserver : DataMessageObserver {
let dataMessageTopic = " chat "
// A throttled message is returned by backend from local sender
func dataMessageDidReceived ( dataMessage : DataMessage ) {
logger . info ( msg : " ( dataMessage . timestampMs ) ( dataMessage . text ( ) ) ( dataMessage . senderAttendeeId ) " )
}
// You can also subscribe to multiple topics.
meetingSession . audioVideo . addRealtimeDataMessageObserver ( topic : dataMessageTopic , observer : self )
}
구독 한 관찰자에게 알림을받는 모든 주제에 실시간 메시지를 보낼 수 있습니다.
참고 : 주제는 알파 숫자 여야하며 하이픈과 밑줄을 포함 할 수 있습니다. 데이터는 2KB를 초과 할 수 없으며 수명은 선택적이지만 양의 정수입니다.
let dataMessageTopic = " chat "
let dataMessageLifetimeMs = 1000
do {
// Send "Hello Chime" to any subscribers who are listening to "chat" topic with 1 seconds of lifetime
try meetingSession
. audioVideo
. realtimeSendDataMessage ( topic : dataMessageTopic ,
data : " Hello Chime " ,
lifetimeMs : dataMessageLifetimeMs )
} catch let err as SendDataMessageError {
logger . error ( msg : " Failed to send message! ( err ) " )
} catch {
logger . error ( msg : " Unknown error ( error . localizedDescription ) " )
}
참고 : 메모리 누출을 피하기 위해 추가 한 모든 관찰자 및 릴리스 리소스를 제거하십시오.
class MyAudioVideoObserver : AudioVideoObserver {
func audioSessionDidStopWithStatus ( sessionStatus : MeetingSessionStatus ) {
// This is where meeting ended.
// You can do some clean up work here.
}
func videoSessionDidStopWithStatus ( sessionStatus : MeetingSessionStatus ) {
// This will be invoked as well.
}
meetingSession . audioVideo . addAudioVideoObserver ( observer : self )
meetingSession . audioVideo . stop ( )
}
Amazon Voice Focus는 회의에서 더 나은 회의 경험을 위해 배경 소음을 줄입니다. 자세한 내용은 Amazon Voice Focus를 참조하십시오.
let enabled = audioVideo . realtimeSetVoiceFocusEnabled ( enabled : true ) // enabling Amazon Voice Focus successful
let disabled = audioVideo . realtimeSetVoiceFocusEnabled ( enabled : false ) // disabling Amazon Voice Focus successful
사용자 정의 비디오 소스를 사용하면 비디오 필터 적용과 같은 비디오를 제어 할 수 있습니다. 자세한 내용은 사용자 정의 비디오를 참조하십시오.
버전 0.23.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
수준으로 기본값으로 설정되었습니다. 따라서 미디어 로그를 포함한 모든 로그를 얻으려면 다음을 수행하여 로거를 만듭니다.
logger = ConsoleLogger ( name : " logger " , level : . DEFAULT )
귀하와 최종 사용자는 백그라운드 교체와 함께 사용하기 위해 업로드 된 모든 콘텐츠 (모든 이미지 포함)에 대한 책임이 있으며, 그러한 컨텐츠 Amazon과의 계약 (문서, AWS 서비스 약관 또는 허용 가능한 사용 정책 포함).
Copyright Amazon.com, Inc. 또는 그 계열사. 모든 권리 보유.