Amazon Cank SDK Project Board
ПРИМЕЧАНИЕ. Если построение с исходным кодом SDK, филиал
development
содержит изменения на крахах, которые могут не построить с общедоступной библиотекой CHIME Media или не могут быть такими стабильными, как публичные выпуски.
Amazon Chime SDK для iOS позволяет легко добавлять совместные аудиозвонки, видеозвонки и функции просмотра общего экрана в приложения для iOS, используя те же инфраструктурные услуги, что и Power Meetings в службе Amazon Chime.
Этот Amazon Chime SDK для iOS работает, подключаясь к ресурсам сессий, которые вы создали в своей учетной записи AWS. У SDK есть все, что вам нужно для создания пользовательского опыта вызова и сотрудничества в вашем приложении для iOS, включая методы для: настройки сеансов встреч, списка и выбора аудиоустройств, переключение видеоустройства, просмотр экрана запуска и остановки, получение обратных вызовов, когда возникают события мультимедиа, такие в качестве изменения объема и управление функциями собрания, такие как Audio Mute и видео -привязки.
У нас также есть проектный совет по проекту Amazon Chime SDK, где вы можете найти запросы сообщества и их статусы.
Чтобы начать работу, см. Следующие ресурсы:
И просмотрите следующие гиды:
Вы можете интегрировать Amazon Chime SDK в свой проект от SPM, кокопод или двоичных файлов через выпуск GitHub.
В целях настройки корневая папка вашего проекта (где вы можете найти свой файл .xcodeproj
) будет упоминаться как root
.
Amazon Cank SDK доступен через кокопод. Если вы не установили кокопод, установите кокопод, выполнив команду:
$ gem install cocoapods
$ pod setup
В зависимости от настроек вашей системы вам, возможно, придется использовать Sudo для установки кокопод следующим образом:
$ sudo gem install cocoapods
$ pod setup
В корневом каталоге (каталог, где находится ваш *.
$ pod init
Отредактируйте Podfile
, чтобы включить AmazonChimeSDK
в свой проект:
target 'YourTarget' do
pod 'AmazonChimeSDK'
...
end
Если вам не нужны функциональные возможности обмена видео и контентом или поддержка программного видео -кодека, вы можете вместо этого использовать AmazonChimeSDKNoVideoCodecs
для уменьшения размера:
target 'YourTarget' do
pod 'AmazonChimeSDKNoVideoCodecs'
...
end
(Необязательно) Если вы хотите использовать фоновые функции размытия и замены, добавьте:
target 'YourTarget' do
pod 'AmazonChimeSDKMachineLearning'
...
end
Затем запустите следующую команду для установки POD:
$ pod install --repo-update
Чтобы открыть свой проект, откройте недавно сгенерированный файл *.xcworkspace
в корневом каталоге с помощью XCode. Вы можете сделать это, выпустив следующую команду в папке проекта
$ xed .
Примечание. Не используйте *.xcodeproj для открытия проекта.
Если вы используете фоновые функции размытия и замены, на вкладке Build Settings
» в разделе Linking
добавьте -framework AmazonChimeSDKMachineLearning
к Other Linker Flags
.
Amazon Chime SDK доступен через SPM. Если вам не нужны функциональность обмена видео и контентом или поддержку программного видео -кодека, вы можете вместо этого использовать видеокодеки.
Откройте свой проект в Xcode
Перейдите в файл > Swift Packages > Добавить зависимость пакета ...
В поле Введите URL-адрес репозитория пакета , введите «https://github.com/aws/amazon-chime-sdk-ios-pm». Чтобы вместо этого использовать видео-кодекс, введите «https://github.com/aws/amazon-chime-sdk-ios-no-video-codecs-pm».
Введите последнюю версию (например, 0.23.1
) и нажмите «Далее» .
Выберите пакеты для своего проекта и нажмите «Закончить» . AmazonChimeSDK
и AmazonChimeSDKMedia
требуются. Проверьте AmazonChimeSDKMachineLearning
если вы хотите использовать фоновое размытие и замену фона.
AmazonChimeSDK
и AmazonChimeSDKMedia
с последнего выпуска.AmazonChimeSDKMachineLearning
. В противном случае вы можете игнорировать все ссылки на AmazonChimeSDKMachineLearning
в инструкциях ниже.AmazonChimeSDKMediaNoVideoCodecs
Binary вместо AmazonChimeSDKMedia
и рассматривать все ссылки на AmazonChimeSDKMedia
как AmazonChimeSDKMediaNoVideoCodecs
в приведенных ниже инструкциях.Примечание: мы не поддерживаем смешивание и сопоставление двоичных файлов из разных выпусков.
.framework
root
.xcframework
. Для XCode12.3 и позже, пожалуйста, используйте .xcframework
если у вас есть проблема с компиляцией. .xcframework
доступен после Amazon Chime SDK iOS v0.15.0 Откройте свой файл .xcodeproj
в Xcode и нажмите на цель сборки.
Под вкладкой Build Settings
,
Добавьте $(PROJECT_DIR)
в Framework Search Path
.
Добавьте @executable_path/Frameworks
чтобы Runpath Search Paths
.
В разделе Linking
добавьте следующие два флага в Other Linker Flags
:
-lc++
-ObjC
В Tab General
ищите Frameworks, Libraries, and Embedded Content
. Нажмите +, затем Add Others
, затем Add Files
.
.xcframework
.framework
, укажите местоположение AmazonChimeSDK.framework
, AmazonChimeSDKMedia.framework
и AmazonChimeSDKMachineLearning.framework
с шага 1. Если у вас есть ошибка компиляции при использовании традиционных .framework
Вместо этого .xcframework
, которая доступна после Amazon CHIME SDK IOS V0.15.0..xcframework
, укажите местоположение AmazonChimeSDK.xcframework
, AmazonChimeSDKMedia.xcframework
и AmazonChimeSDKMachineLearning.xcframework
с шага 1.AmazonChimeSDK.framework
AmazonChimeSDKMedia.framework
и Frameworks убедитесь, что 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
из последнего выпуска.
Unzip и скопируйте AmazonChimeSDKMedia.xcframework
в папку amazon-chime-sdk-ios/AmazonChimeSDK
и AmazonChimeSDKMachineLearning.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
, выберите свои собственные группы приложений, если вы хотите проверить захват экрана на уровне обмена устройствами. Смотрите Content Share для получения более подробной информации. URL и региона обновления сервера:
AppConfiguration.swift
с URL -адресом сервера и регионом без сервера демонстрации.ViewControllerObjC.h
с URL -адресом сервера и регионом без серверной демонстрации. (Необязательно) Обновление broadcastBundleId
и appGroupId
как в AppConfiguration.swift
и SampleHandler.swift
с идентификатором пакета расширения в вещательной загрузке, если вы хотите проверить захват экрана на уровне обмена устройствами. Смотрите Content Share для получения более подробной информации.
Откройте файл AmazonChimeSDKDemo.xcworkspace
в AmazonChimeSDKDemo/
Использование XCode, выберите AmazonChimeSDKDemoPods
из раскрывающегося списка схемы в верхней панели Xcode IDE, выберите устройство Build и нажмите кнопку «Запустить».
Откройте файл AmazonChimeSDKDemo.xcworkspace
в AmazonChimeSDKDemo/
Использование XCode, выберите AmazonChimeSDKDemo
из раскрывающейся списка схемы в верхней панели Xcode IDE, выберите устройство Build и нажмите кнопку «Запустить».
На экране присоединения выберите присоединиться к собрании без CallKit
или присоединиться через входящий/исходящий звонок CallKit
. Поскольку демонстрационное приложение не имеет уведомления о том, что оно задерживает соединение с помощью входящего вызова на 10 секунд, чтобы дать пользователю достаточно времени для рассмотрения приложения или заблокировать экран, чтобы имитировать поведение.
Если вы обнаружите потенциальную проблему безопасности в этом проекте, мы просим вас уведомить безопасность AWS/Amazon через нашу страницу отчетности по уязвимости. Пожалуйста, не создавайте публичную проблему 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 )
ПРИМЕЧАНИЕ. Чтобы не пропустить какие -либо события, добавьте наблюдатель перед началом сеанса. Вы можете удалить наблюдателя, позвонив в Abtercessession.Audiovideo.Removeaudiovideoobserver (Observer).
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
.Примечание: вы должны позвонить в это после начала сеанса, иначе это не будет. Вам следует позвонить в chooseaudiodevice с одним из устройств, возвращенных из ListAudioDevices ().
let audioDevices = audioVideo . listAudioDevices ( )
val device = /* An item from audioDevices */
meetingSession . audioVideo . chooseAudioDevice ( mediaDevice : device )
Примечание: SwitchCamera () не является 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 ( )
При присоединении к встрече поддерживаются моно/16 кГц , моно/48 кГц и стерео/48 кГц . Стерео/48 кГц будет установлен как звуковой режим по умолчанию, если не указан явно при запуске аудиосессии.
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
Вы можете использовать это для создания пользовательского интерфейса индикаторов в режиме реального времени и обновлять их для изменений, внесенных массивом.
Примечание. Эти обратные вызовы будут включать дельту только из предыдущего обратного вызова.
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
Property.Контент -видео -плитка может быть идентифицирована с использованием свойства
isContent
. См. Screen и Content Share.Плитка создается с новым идентификатором плитки, когда тот же отдаленный посетитель перезапускает видео.
Вы можете найти более подробную информацию о добавлении/удалении/просмотре видео с построения приложения для встреч на iOS с помощью Amazon Chime SDK.
Вы можете позвонить в 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), посетитель контента (Contiteee-Id#Content) присоединяется к сеансу и делится контентом, как если бы постоянный посетитель делится видео.
Например, ваш идентификатор посетителя-«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 )
Смотрите Content Share для получения более подробной информации.
meetingSession . audioVideo . stopContentShare ( )
CHIME SDK позволяет двум одновременным акциям контента за встречу. Удаленные акции контента будут вызывать onVideoTileAdded
, а местная доля - нет. Чтобы отобразить видео для предварительного просмотра, добавьте VideoSink
в VideoSource
в ContentShareSource
.
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 )
}
Вы можете отправить сообщение в реальном времени на любую тему, на которую будут подписаны наблюдатели, будут уведомлены.
Примечание. Тема должна быть альфа-цифровым числом, и она может включать в себя дефис и подчеркивание. Данные не могут превышать 2 КБ, а срок службы не является обязательным, но положительным целым числом.
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 минут.
Если вам нужно отключить эту функцию, вы можете сделать это через аудиовидеоконфигурацию перед началом сеанса.
meetingSession . audioVideo . start ( AudioVideoConfiguration ( enableAudioRedundancy : false ) )
Хотя есть возможность отключить эту функцию, мы рекомендуем оставить ее включенным для улучшения качества звука. Одна из возможных причин отключения может быть, если у ваших клиентов очень строгие ограничения полосы пропускания.
Обратитесь к общим часто задаваемым вопросам для Amazon Chime SDK.
Заявки могут получить журналы от CHIME SDK, передавая экземпляры регистрации при создании собраний. Amazon Chime SDK обладает некоторыми реализациями Logger по умолчанию, которые может использовать ваше приложение, такие как Consolelogger, который входит в консоль. ConsoleLogger
устанавливается на уровень INFO
в качестве дефолта. Поэтому, чтобы получить все журналы, включая журналы носителя, создайте журнал, следуя:
logger = ConsoleLogger ( name : " logger " , level : . DEFAULT )
Вы и ваши конечные пользователи несете ответственность за все контент (включая любые изображения), загруженные для использования с заменой фоновой замены, и должны убедиться, что такой контент не нарушает закон, нарушает или не присводит права любой третьей стороны или иным образом нарушает существенный термин вашего соглашения с Amazon (включая документацию, условия службы AWS или политику приемлемого использования).
Copyright Amazon.com, Inc. или ее филиалы. Все права защищены.