Placa de projeto sdk sdk da Amazon
NOTA: Se a construção do código-fonte do SDK, a filial
development
contém alterações de borda de sangramento que podem não ser construídas com a biblioteca de mídia de chime publicamente disponíveis ou pode não ser tão estável quanto os lançamentos públicos.
O Amazon Chime SDK para iOS facilita a adição de recursos colaborativos de chamadas de áudio, videocliação e compartilhamento de tela aos aplicativos iOS usando os mesmos serviços de infraestrutura que as reuniões de energia do Amazon Chime Service.
Este sdk do Amazon Chime para iOS funciona conectando -se à reunião de recursos de sessão que você criou em sua conta da AWS. O SDK tem tudo o que você precisa para criar experiências personalizadas de chamadas e colaboração em seu aplicativo iOS, incluindo métodos para: configurar sessões de reunião, listar e selecionar dispositivos de áudio, alternar dispositivos de vídeo, iniciar e interromper a exibição de compartilhamento, receber retornos de chamada quando ocorrem eventos como mudanças de volume e gerenciar recursos de reunião, como mudo de áudio e encadernações de ladrilhos de vídeo.
Também temos um quadro de projetos do Amazon Chime SDK, onde você pode encontrar solicitações da comunidade e seus status.
Para começar, consulte os seguintes recursos:
E revise os seguintes guias:
Você pode integrar o Amazon Chime SDK em seu projeto a partir do SPM, Cocoapods ou Binários através do GitHub Release.
Para fins de configuração, a pasta raiz do seu projeto (onde você pode encontrar seu arquivo .xcodeproj
) será chamado de root
.
O Amazon Chime SDK está disponível no Cocoapods. Se você não instalou Cocoapods, instale Cocoapods executando o comando:
$ gem install cocoapods
$ pod setup
Dependendo das configurações do seu sistema, talvez seja necessário usar o sudo para instalar o Cocoapods da seguinte maneira:
$ sudo gem install cocoapods
$ pod setup
No diretório raiz (o diretório em que seu arquivo *.xcodeproj é), execute o seguinte para criar um podfile em seu projeto:
$ pod init
Edite o Podfile
para incluir AmazonChimeSDK
em seu projeto:
target 'YourTarget' do
pod 'AmazonChimeSDK'
...
end
Se você não precisar de funcionalidade de compartilhamento de vídeo e conteúdo ou suporte de codec de vídeo de software, pode usar AmazonChimeSDKNoVideoCodecs
para reduzir o tamanho:
target 'YourTarget' do
pod 'AmazonChimeSDKNoVideoCodecs'
...
end
(Opcional) Se você deseja usar os Recursos Blur e Substituição, adicione: Adicionar:
target 'YourTarget' do
pod 'AmazonChimeSDKMachineLearning'
...
end
Em seguida, execute o seguinte comando para instalar pods:
$ pod install --repo-update
Para abrir seu projeto, abra o arquivo *.xcworkspace
recém -gerado no diretório raiz usando o xcode. Você pode fazer isso emitindo o seguinte comando na pasta do seu projeto
$ xed .
NOTA: Não use *.xcodeproj para abrir o projeto.
Se você estiver usando os recursos de broto e substituição em segundo plano, na guia Build Settings
, na seção Linking
, adicione -framework AmazonChimeSDKMachineLearning
a Other Linker Flags
.
O Amazon Chime SDK está disponível no SPM. Se você não precisar de funcionalidade de compartilhamento de vídeo e conteúdo ou suporte ao codec de vídeo de software, você poderá optar por não usar o Codecs de vídeo SPM.
Abra seu projeto no Xcode
Vá para Arquivo > Pacotes Swift > Adicionar dependência do pacote ...
No campo, insira o URL do repositório do pacote , digite "https://github.com/aws/amazon-chime-sdk-ios spm". Para usar nenhum módulo de mídia de codecs de vídeo, digite "https://github.com/aws/amazon-chime-sdk-ios-no-video-codecs spm".
Digite a versão mais recente (por exemplo, 0.23.1
) e clique em Avançar .
Escolha pacotes para o seu projeto e clique em Concluir . AmazonChimeSDK
e AmazonChimeSDKMedia
são necessários. Verifique AmazonChimeSDKMachineLearning
se desejar usar o desfoque e a substituição de fundo.
AmazonChimeSDK
e AmazonChimeSDKMedia
a partir do lançamento mais recente.AmazonChimeSDKMachineLearning
Binary. Caso contrário, você pode ignorar todas as referências ao AmazonChimeSDKMachineLearning
nas instruções abaixo.AmazonChimeSDKMediaNoVideoCodecs
binário em vez de AmazonChimeSDKMedia
e tratar todas as referências a AmazonChimeSDKMedia
como AmazonChimeSDKMediaNoVideoCodecs
nas instruções abaixo.Nota: Não suportamos binários de mistura e correspondência de diferentes lançamentos.
.framework
S ou .xcframework
s para root
, que depende de qual estrutura seu projeto usa. Para Xcode12.3 e, posterior, use .xcframework
Se você tiver um problema de compilação. .xcframework
está disponível após a Amazon Chime SDK iOS v0.15.0 Abra seu arquivo .xcodeproj
no Xcode e clique no seu destino de compilação.
Na guia Build Settings
,
Adicione $(PROJECT_DIR)
ao Framework Search Path
.
Adicione @executable_path/Frameworks
aos Runpath Search Paths
.
Em seção Linking
, adicione os dois sinalizadores a seguir em Other Linker Flags
:
-lc++
-ObjC
Na guia General
, procure Frameworks, Libraries, and Embedded Content
. Clique em +, Add Others
e Add Files
.
.framework
tradicional, especifique a localização de AmazonChimeSDK.framework
, AmazonChimeSDKMedia.framework
e AmazonChimeSDKMachineLearning.framework
da etapa 1. Se você tiver um erro .xcframework
compilação enquanto usa o tradicional .framework
.xcframework
, que está disponível após o Amazon Chime SDK iOS v0.15.0..xcframework
, especifique a localização do AmazonChimeSDK.xcframework
, AmazonChimeSDKMedia.xcframework
e AmazonChimeSDKMachineLearning.xcframework
da etapa 1.AmazonChimeSDK.framework
AmazonChimeSDKMedia.framework
and Frameworks, verifique se o Embed & Sign
está selecionado na opção Embed
. Para AmazonChimeSDKMachineLearning.framework
, selecione Do Not Embed
. Para executar o aplicativo de demonstração, siga estas etapas.
git clone [email protected]:aws/amazon-chime-sdk-ios.git
Para os dois alvos em /AmazonChimeSDKDemo/Podfile
, substitua AMAZON_CHIME_SDK_VERSION
por uma versão SDK específica, por exemplo, 0.19.3
ou remova se utilizar a versão mais recente do Amazon Chime SDK.
Em /AmazonChimeSDKDemo
, execute o seguinte comando para instalar pods:
$ pod install --repo-update
Faça o download dos binários AmazonChimeSDKMedia
e AmazonChimeSDKMachineLearning
do último lançamento.
Unzip e Copy AmazonChimeSDKMedia.xcframework
para pasta amazon-chime-sdk-ios/AmazonChimeSDK
e AmazonChimeSDKMachineLearning.xcframework
para pasta amazon-chime-sdk-ios/AmazonChimeSDKDemo
.
Implante a demonstração sem servidor da Amazon-Chime-SDK-JS
AmazonChimeDemoSDKBroadcast.appex
é uma extensão de transmissão para compartilhamento de tela em nível de dispositivo usado pelo AmazonChimesdkdemo, verifique se Embed without Signing
é selecionada na opção Embed
. Remova -o das Frameworks, Libraries, and Embedded Content
se você não desejar testar isso. Para cada alvo, na guia Signing & Capabilities
,
Signing
, use sua própria equipe de desenvolvedor da Apple e identificador de pacote.App Groups
, selecione seus próprios grupos de aplicativos se desejar testar a captura da tela no nível do dispositivo. Consulte Compartilhe de conteúdo para obter mais detalhes. URL e região de atualização do servidor:
AppConfiguration.swift
com o URL do servidor e a região da demonstração sem servidor.ViewControllerObjC.h
com o URL do servidor e a região da demonstração sem servidor. (Opcional) Update broadcastBundleId
e appGroupId
em AppConfiguration.swift
e SampleHandler.swift
com o ID do pacote de extensão de upload de transmissão e o ID do grupo de aplicativos se você deseja testar a captura de tela no nível do dispositivo. Consulte Compartilhe de conteúdo para obter mais detalhes.
Abra o arquivo AmazonChimeSDKDemo.xcworkspace
no AmazonChimeSDKDemo/
Usando Xcode, selecione os AmazonChimeSDKDemoPods
na lista suspensa Scheme na barra superior do Xcode IDE, escolha um dispositivo de compilação e clique no botão Executar.
Abra o arquivo AmazonChimeSDKDemo.xcworkspace
no AmazonChimeSDKDemo/
Usando Xcode, selecione o AmazonChimeSDKDemo
na lista suspensa Scheme na barra superior do Xcode IDE, escolha um dispositivo de compilação e clique no botão Executar.
Na tela de união, opte por participar da reunião sem CallKit
ou participar da chamada de entrada/saída CallKit
. Como o aplicativo de demonstração não possui notificação por push, ele atrasa a participação via chamada recebida por 10 segundos para dar tempo ao usuário tempo suficiente para pagar o aplicativo ou bloquear a tela para imitar o comportamento.
Se você descobrir um problema de segurança em potencial neste projeto, solicitamos que você notifique a segurança da AWS/Amazon por meio de nossa página de relatório de vulnerabilidades. Por favor, não crie um problema público do github.
Você precisa iniciar a sessão de reuniões para começar a enviar e receber áudio.
meetingSession . audioVideo . start ( )
As configurações padrão são:
.outputOnly
ou .none
para evitar a exigência de permissões de gravação de áudio) Você pode especificar opções não-defensivas no AudioVideoConfiguration
e iniciar a sessão de reuniões.
var audioVideoConfig = AudioVideoConfiguration (
audioMode : . mono48k ,
audioDeviceCapabilities : . outputOnly ,
callKitEnabled : true ,
enableAudioRedundancy : false ,
reconnectTimeoutMs : 180 * 1000 )
meetingSession . audioVideo . start ( audioVideoConfiguration : audioVideoConfig )
NOTA: Para evitar a falta de eventos, adicione um observador antes do início da sessão. Você pode remover o observador ligando para a reunião.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 )
}
Liste os dispositivos de áudio disponíveis para a reunião.
// 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
.NOTA: Você deve ligar para isso após o início da sessão ou não será ninguém. Você deve chamar ChooseAudiodEvice com um dos dispositivos retornados de listaudiodEvices ().
let audioDevices = audioVideo . listAudioDevices ( )
val device = /* An item from audioDevices */
meetingSession . audioVideo . chooseAudioDevice ( mediaDevice : device )
NOTA: SwitchCamera () não é op se você estiver usando a fonte de captura de câmera personalizada. Consulte o vídeo personalizado para obter mais detalhes.
Alterne para usar a câmera frontal ou traseira no dispositivo, se disponível.
meetingSession . audioVideo . switchCamera ( )
Adicione um DeviceChangeObserver
para receber um retorno de chamada quando um novo dispositivo de áudio se conectar ou quando um dispositivo de áudio se desconectar. audioDeviceDidChange
inclui uma lista de dispositivos atualizados.
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 ( )
Ao ingressar em uma reunião, são suportados mono/16kHz , mono/48khz e estéreo/48kHz . Estéreo/48kHz será definido como o modo de áudio padrão se não for especificado explicitamente ao iniciar a sessão de áudio.
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]
NOTA: Até agora, você adicionou observadores para receber eventos do ciclo de vida do dispositivo e da sessão. Nos casos de uso a seguir, você usará os métodos da API em tempo real para enviar e receber indicadores de volume e controlar o estado mudo.
let muted = meetingSession . audioVideo . realtimeLocalMute ( ) // returns true if muted, false if failed
let unmuted = meetingSession . audioVideo . realtimeLocalUnmute // returns true if unmuted, false if failed
Você pode usar isso para criar indicadores de interface do tempo em tempo real e atualizá-los para alterações entregues pela matriz.
Nota: esses retornos de chamada incluirão apenas o delta do retorno de chamada anterior.
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 )
}
Você pode usar o evento activeSpeakerDidDetect
para ampliar ou enfatizar o ladrilho de vídeo do alto -falante mais ativo, se disponível. Ao definir o scoreCallbackIntervalMs
e implementar activeSpeakerScoreDidChange
, você pode receber notas dos alto -falantes ativos periodicamente.
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 )
}
Nota: Você precisará vincular o vídeo ao
VideoRenderView
para exibir o vídeo.Um ladrilho de vídeo local pode ser identificado usando a propriedade
isLocalTile
.Um ladrilho de vídeo de conteúdo pode ser identificado usando a propriedade
isContent
. Consulte a tela e o compartilhamento de conteúdo.Um ladrilho é criado com um novo ID de ladrilhos quando o mesmo participante remoto reinicia o vídeo.
Você pode encontrar mais detalhes sobre como adicionar/remover/visualizar o vídeo da criação de um pedido de reunião no iOS usando o Amazon Chime SDK.
Você pode ligar para startRemoteVideo
para começar a receber vídeos remotos, pois isso não acontece por padrão.
meetingSession . audioVideo . startRemoteVideo ( )
stopRemoteVideo
para de receber vídeos remotos e gatilhos onVideoTileRemoved
para vídeos remotos existentes.
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 ( )
Nota: O vídeo local deve ser espelhado. Definir videRenderView.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 )
}
Para um gerenciamento de ladrilhos de vídeo mais avançado, dê uma olhada na paginação em vídeo.
NOTA: Quando você ou outros participantes compartilham conteúdo (por exemplo, captura de tela ou qualquer outro objeto VideoSource), o participante do conteúdo (conteúdo do participante-id) se junta à sessão e compartilha o conteúdo como se um participante regular compartilhasse um vídeo.
Por exemplo, seu ID do participante é "meu id". Quando você liga para
meetingSession.audioVideo.startContentShare
, o participante do conteúdo "My-Id#Content" participará da sessão e compartilhará seu conteúdo.
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 )
}
Você pode definir a configuração para compartilhar conteúdo, por exemplo, maxbitratekbps. A qualidade real alcançada pode variar ao longo da chamada, dependendo de qual sistema e rede podem fornecer.
let contentShareConfig = LocalVideoConfiguration ( maxBitRateKbps : 200 )
meetingSession . audioVideo . startContentShare ( source : contentShareSource , config : contentShareConfig )
Consulte Compartilhe de conteúdo para obter mais detalhes.
meetingSession . audioVideo . stopContentShare ( )
O Chime SDK permite duas ações simultâneas de conteúdo por reunião. As ações de conteúdo remoto desencadearão onVideoTileAdded
, enquanto o compartilhamento local não. Para renderizar o vídeo para visualização, adicione um VideoSink
ao VideoSource
no 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 )
}
Consulte ObservableMetric
para obter mais métricas disponíveis e para monitorar a qualidade de compartilhamento de áudio, vídeo e conteúdo.
class MyMetricsObserver : MetricsObserver {
func metricsDidReceive ( metrics : [ AnyHashable : Any ] ) {
logger . info ( msg : " Media metrics have been received: ( metrics ) " )
}
meetingSession . audioVideo . addMetricsObserver ( observer : self )
}
Você pode receber mensagens em tempo real de vários tópicos após iniciar a sessão de reunião.
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 )
}
Você pode enviar uma mensagem em tempo real para qualquer tópico, ao qual os observadores que se inscreveram serão notificados.
Nota: O tópico precisa ser alfa-numérico e pode incluir hífen e sublinhado. Os dados não podem exceder 2KB e a vida útil é opcional, mas inteiro positivo.
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 ) " )
}
Nota: Certifique -se de remover todos os observadores e liberar recursos que você adicionou para evitar vazamentos de memória.
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 ( )
}
O foco da voz da Amazon reduz o ruído de fundo na reunião para uma melhor experiência em reuniões. Para mais detalhes, consulte a 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
A fonte de vídeo personalizada permite controlar o vídeo, como aplicar um filtro de vídeo. Para mais detalhes, consulte o vídeo personalizado.
A partir da versão 0.23.3, o SDK começa a enviar dados de áudio redundantes para nossos servidores na detecção de perda de pacotes para ajudar a reduzir seu efeito na qualidade do áudio. Pacotes de áudio redundantes são enviados apenas para pacotes que contêm áudio ativo, discurso ou música. Isso pode aumentar a largura de banda consumida por áudio para até 3 vezes a quantidade normal, dependendo da quantidade de perda de pacotes detectada. O SDK parará automaticamente de enviar dados redundantes se não tiver detectado nenhuma perda de pacotes por 5 minutos.
Se você precisar desativar esse recurso, poderá fazê -lo através do AudioVideoconfiguration antes de iniciar a sessão.
meetingSession . audioVideo . start ( AudioVideoConfiguration ( enableAudioRedundancy : false ) )
Embora exista uma opção para desativar o recurso, recomendamos mantê -lo ativado para melhorar a qualidade do áudio. Uma razão possível para desativar pode ser se seus clientes tiverem limitações muito rígidas de largura de banda.
Consulte as Perguntas frequentes em geral para o Amazon Chime SDK.
Os aplicativos podem obter logs do Chime SDK, passando instâncias de Logger ao criar a entrega. O Amazon Chime SDK possui algumas implementações padrão do Logger que seu aplicativo pode usar, como o consolelogger que faz login no console. ConsoleLogger
está definido como o nível INFO
como padrão. Portanto, para obter todos os logs, incluindo logs de mídia, crie o Logger seguindo:
logger = ConsoleLogger ( name : " logger " , level : . DEFAULT )
Você e seus usuários finais são responsáveis por todo o conteúdo (incluindo quaisquer imagens) carregados para uso com substituição de fundo e devem garantir que esse conteúdo não viole a lei, infrinja ou apropriou indefinir os direitos de terceiros ou violar um termo material do seu contrato com a Amazon (incluindo a documentação, os termos de serviço da AWS ou a política de uso aceitável).
Copyright Amazon.com, Inc. ou suas afiliadas. Todos os direitos reservados.