Junta del proyecto de Amazon Chime SDK
Nota: Si se construye con el código fuente SDK, la rama
development
contiene cambios de borde de sangrado que pueden no construir con la biblioteca de medios Chime disponible públicamente o no ser tan estable como las versiones públicas.
El SDK de Amazon Chime para iOS facilita agregar llamadas de audio colaborativas, videollamadas y características de visualización de pantallas de pantalla a las aplicaciones iOS mediante el uso de los mismos servicios de infraestructura que impulsan las reuniones en el servicio de Chime de Amazon.
Este SDK de Amazon Chime para iOS funciona conectando a reuniones de recursos de sesión que ha creado en su cuenta AWS. El SDK tiene todo lo que necesita para crear experiencias personalizadas de llamadas y colaboración en su aplicación iOS, incluidos los métodos para: configurar sesiones de reunión, lista y seleccionar dispositivos de audio, cambiar de dispositivos de video, inicio y detener la visualización de la pantalla, recibir backbacks cuando ocurren eventos medianos de este tipo. A medida que cambia el volumen y administra funciones de reuniones como enlaces de baldosas de audio y muda de video.
También tenemos una Junta del Proyecto SDK de Amazon Chime donde puede encontrar solicitudes de la comunidad y sus estados.
Para comenzar, vea los siguientes recursos:
Y revise las siguientes guías:
Puede integrar el SDK de Amazon Chime en su proyecto de SPM, Cocoapods o binarios a través del lanzamiento de GitHub.
A los fines de la configuración, la carpeta raíz de su proyecto (donde puede encontrar su archivo .xcodeproj
) se denominará root
.
El SDK de Amazon Chime está disponible a través de Cocoapods. Si no ha instalado Cocoapods, instale Cocoapods ejecutando el comando:
$ gem install cocoapods
$ pod setup
Dependiendo de la configuración de su sistema, es posible que deba usar sudo para instalar cocoapods de la siguiente manera:
$ sudo gem install cocoapods
$ pod setup
En Root Directory (el directorio donde está su archivo *.xcodeproj), ejecute lo siguiente para crear un podfile en su proyecto:
$ pod init
Edite el Podfile
para incluir AmazonChimeSDK
en su proyecto:
target 'YourTarget' do
pod 'AmazonChimeSDK'
...
end
Si no necesita una funcionalidad de compartir videos y contenido, o soporte de códec de video de software, puede usar AmazonChimeSDKNoVideoCodecs
en su lugar para reducir el tamaño:
target 'YourTarget' do
pod 'AmazonChimeSDKNoVideoCodecs'
...
end
(Opcional) Si desea usar el desenfoque de fondo y las funciones de reemplazo, agregue:
target 'YourTarget' do
pod 'AmazonChimeSDKMachineLearning'
...
end
Luego ejecute el siguiente comando para instalar vainas:
$ pod install --repo-update
Para abrir su proyecto, abra el archivo *.xcworkspace
recientemente generado en el directorio raíz usando XCode. Puede hacer esto emitiendo el siguiente comando en la carpeta de su proyecto
$ xed .
Nota: No use *.xCodeproj para abrir el proyecto.
Si está utilizando las funciones de desenfreno y reemplazo de fondo, en la pestaña Build Settings
, en la sección Linking
, agregue -framework AmazonChimeSDKMachineLearning
a Other Linker Flags
.
El SDK de Amazon Chime está disponible a través de SPM. Si no necesita una funcionalidad de compartir videos y contenido, o soporte de códec de video de software, puede optar por no usar códecs de video SPM.
Abra su proyecto en Xcode
Vaya a Archivo > PAQUETES SWIFT > Agregar dependencia del paquete ...
En el campo Ingrese la URL del repositorio del paquete , ingrese "https://github.com/aws/amazon-chime-sdk-ios-spm". Para no usar el módulo de medios de códecs de video, ingrese "https://github.com/aws/amazon-chime-sdk-ios-no-video-codecsspm".
Ingrese la última versión (por ejemplo, 0.23.1
) y haga clic en Siguiente .
Elija paquetes para su proyecto y haga clic en Finalizar . Se requieren AmazonChimeSDK
y AmazonChimeSDKMedia
. Consulte AmazonChimeSDKMachineLearning
si desea usar el desenfoque de fondo y el reemplazo de fondo.
AmazonChimeSDK
y AmazonChimeSDKMedia
del último lanzamiento.AmazonChimeSDKMachineLearning
. De lo contrario, puede ignorar todas las referencias a AmazonChimeSDKMachineLearning
en las instrucciones a continuación.AmazonChimeSDKMediaNoVideoCodecs
binarios en lugar de AmazonChimeSDKMedia
y tratar todas las referencias a AmazonChimeSDKMedia
como AmazonChimeSDKMediaNoVideoCodecs
en las instrucciones a continuación.Nota: No admitimos binarios de mezcla y coincidencia de diferentes lanzamientos.
.framework
s o .xcframework
s a root
, que depende del marco que utilice su proyecto. Para XCode12.3 y posterior, use .xcframework
si tiene un problema de compilación. .xcframework
está disponible después de Amazon Chime SDK iOS V0.15.0 Abra su archivo .xcodeproj
en Xcode y haga clic en su objetivo de compilación.
En la pestaña Build Settings
,
Agregue $(PROJECT_DIR)
a Framework Search Path
.
Agregue @executable_path/Frameworks
a Runpath Search Paths
.
En la sección Linking
, agregue las siguientes dos banderas en Other Linker Flags
:
-lc++
-ObjC
En la pestaña General
, busque Frameworks, Libraries, and Embedded Content
. Haga clic en +, luego Add Others
, luego Add Files
.
.framework
tradicional, especifique la ubicación de AmazonChimeSDK.framework
, AmazonChimeSDKMedia.framework
y AmazonChimeSDKMachineLearning.framework
del paso 1. .framework
tiene un error de compilación mientras usa .xcframework
, en su lugar, que está disponible después de Amazon Chime SDK iOS V0.15.0..xcframework
, especifique la ubicación de AmazonChimeSDK.xcframework
, AmazonChimeSDKMedia.xcframework
y AmazonChimeSDKMachineLearning.xcframework
del paso 1.AmazonChimeSDK.framework
AmazonChimeSDKMedia.framework
y marcos, verifique que Embed & Sign
se seleccione bajo la opción Embed
. Para AmazonChimeSDKMachineLearning.framework
, seleccione Do Not Embed
. Para ejecutar la aplicación de demostración, siga estos pasos.
git clone [email protected]:aws/amazon-chime-sdk-ios.git
Para ambos objetivos en /AmazonChimeSDKDemo/Podfile
, reemplace AMAZON_CHIME_SDK_VERSION
con una versión SDK específica, por ejemplo, 0.19.3
o elimínelo si utiliza la última versión de Amazon Chime SDK.
Under /AmazonChimeSDKDemo
, ejecute el siguiente comando para instalar vainas:
$ pod install --repo-update
Descargue AmazonChimeSDKMedia
y AmazonChimeSDKMachineLearning
Binaries del último lanzamiento.
Unzip y copien AmazonChimeSDKMedia.xcframework
a la carpeta amazon-chime-sdk-ios/AmazonChimeSDK
y AmazonChimeSDKMachineLearning.xcframework
a la carpeta amazon-chime-sdk-ios/AmazonChimeSDKDemo
.
Implemente la demostración sin servidor de Amazon-Chime-SDK-JS
AmazonChimeDemoSDKBroadcast.appex
es una extensión de transmisión para el intercambio de pantalla a nivel de dispositivo utilizado por AmazOnChimesDKDemo, verifique que Embed without Signing
se seleccione bajo la opción de Embed
. Eliminarlo de Frameworks, Libraries, and Embedded Content
si no desea probar esto. Para cada objetivo, en la pestaña Signing & Capabilities
,
Signing
, use su propio equipo de desarrolladores de Apple e identificador de paquete.App Groups
(opcional), seleccione sus propios grupos de aplicaciones si desea probar la captura de pantalla de nivel de dispositivo para compartir. Vea el contenido compartido para más detalles. Actualizar URL y región del servidor:
AppConfiguration.swift
con la URL del servidor y la región de la demostración sin servidor.ViewControllerObjC.h
con la URL del servidor y la región de la demostración sin servidor. (Opcional) Actualice broadcastBundleId
y appGroupId
en tanto AppConfiguration.swift
y SampleHandler.swift
con la ID de extensión de carga de transmisión y la ID del grupo de aplicaciones si desea probar la captura de pantalla de nivel de dispositivo para compartir compartir. Vea el contenido compartido para más detalles.
Abra AmazonChimeSDKDemo.xcworkspace
archivo en AmazonChimeSDKDemo/
Usando Xcode, seleccione el AmazonChimeSDKDemoPods
en la lista desplegable del esquema en la barra superior de Xcode IDE, elija un dispositivo de compilación y haga clic en el botón Ejecutar.
Abra AmazonChimeSDKDemo.xcworkspace
archivo en AmazonChimeSDKDemo/
Usando Xcode, seleccione el AmazonChimeSDKDemo
de la lista desplegable del esquema en la barra superior de Xcode IDE, elija un dispositivo de compilación y haga clic en el botón Ejecutar.
En la pantalla de unión, elija unirse a la reunión sin CallKit
o unirse a través de CallKit
entrante/llamada saliente. Dado que la aplicación de demostración no tiene una notificación push, se retrasa la unión a través de una llamada entrante en 10 segundos para dar tiempo al usuario el tiempo suficiente para contactar la aplicación o bloquear la pantalla para imitar el comportamiento.
Si descubre un problema de seguridad potencial en este proyecto, le pedimos que notifique a AWS/Amazon Security a través de nuestra página de informes de vulnerabilidad. No cree un problema público de GitHub.
Debe comenzar la sesión de reunión para comenzar a enviar y recibir audio.
meetingSession . audioVideo . start ( )
Las configuraciones predeterminadas son:
.outputOnly
o .none
para evitar requerir permisos de grabación de audio) Puede especificar opciones no defectuosas en AudioVideoConfiguration
y luego comenzar la sesión de reunión.
var audioVideoConfig = AudioVideoConfiguration (
audioMode : . mono48k ,
audioDeviceCapabilities : . outputOnly ,
callKitEnabled : true ,
enableAudioRedundancy : false ,
reconnectTimeoutMs : 180 * 1000 )
meetingSession . audioVideo . start ( audioVideoConfiguration : audioVideoConfig )
Nota: Para evitar perderse cualquier evento, agregue un observador antes de que comience la sesión. Puede eliminar el observador llamando a Meetingsession.audiovideo.removeaudiovideoBserver (observador).
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 )
}
Lista de dispositivos de audio disponibles para la reunión.
// 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: Debe llamar a esto después de que comenzó la sesión o no será OP. Debe llamar a ChooseAudiodeVice con uno de los dispositivos devueltos de LataudioDeVices ().
let audioDevices = audioVideo . listAudioDevices ( )
val device = /* An item from audioDevices */
meetingSession . audioVideo . chooseAudioDevice ( mediaDevice : device )
Nota: SwitchCamera () es NO-OP si está utilizando una fuente de captura de cámara personalizada. Consulte el video personalizado para obtener más detalles.
Cambie para usar la cámara frontal o trasera en el dispositivo, si está disponible.
meetingSession . audioVideo . switchCamera ( )
Agregue un DeviceChangeObserver
para recibir una devolución de llamada cuando se conecta un nuevo dispositivo de audio o cuando se desconecte un dispositivo de audio. audioDeviceDidChange
incluye una lista de dispositivos actualizada.
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 ( )
Al unirse a una reunión, se admiten mono/16kHz , mono/48kHz y estéreo/48 kHz . Stereo/48kHz se establecerá como el modo de audio predeterminado si no se especifica explícitamente al comenzar la sesión de audio.
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: Hasta ahora, ha agregado observadores para recibir eventos de ciclo de vida del dispositivo y sesión. En los siguientes casos de uso, utilizará los métodos API en tiempo real para enviar y recibir indicadores de volumen y controlar el estado de silencio.
let muted = meetingSession . audioVideo . realtimeLocalMute ( ) // returns true if muted, false if failed
let unmuted = meetingSession . audioVideo . realtimeLocalUnmute // returns true if unmuted, false if failed
Puede usar esto para crear indicadores en tiempo real de la interfaz de usuario y actualizarlos para los cambios entregados por la matriz.
Nota: Estas devoluciones de llamada solo incluirán el Delta de la devolución de llamada 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 )
}
Puede usar el evento activeSpeakerDidDetect
para ampliar o enfatizar el mosaico de video más activo si está disponible. Al establecer scoreCallbackIntervalMs
e implementar activeSpeakerScoreDidChange
, puede recibir decenas de los oradores activos periódicamente.
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: Deberá vincular el video a
VideoRenderView
para mostrar el video.Se puede identificar un mosaico de video local utilizando la propiedad
isLocalTile
.Se puede identificar un mosaico de video de contenido utilizando la propiedad
isContent
. Vea la pantalla y el contenido compartido.Se crea un mosaico con una nueva ID de mosaico cuando el mismo asistente remoto reinicia el video.
Puede encontrar más detalles sobre cómo agregar/eliminar/ver el video de la construcción de una aplicación de reunión en iOS utilizando el SDK de Amazon Chime.
Puede llamar startRemoteVideo
para comenzar a recibir videos remotos, ya que esto no sucede de forma predeterminada.
meetingSession . audioVideo . startRemoteVideo ( )
stopRemoteVideo
deja de recibir videos remotos y desencadenantes onVideoTileRemoved
para los videos 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: El video local debe reflejarse. Establecer 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 )
}
Para una gestión de baldosas de video más avanzada, eche un vistazo a la paginación de video.
Nota: Cuando usted u otros asistentes comparten contenido (por ejemplo, captura de pantalla o cualquier otro objeto de videoseurce), el asistente de contenido (Contenido de ID#de asistente) se une a la sesión y comparte contenido como si un asistente regular comparta un video.
Por ejemplo, su identificación de asistente es "my-id". Cuando llamas
meetingSession.audioVideo.startContentShare
, el asistente de contenido "My-ID#Content" se unirá a la sesión y compartirá tu contenido.
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 )
}
Puede establecer la configuración para el contenido compartido, por ejemplo, maxbitratekbps. La calidad real lograda puede variar a lo largo de la llamada dependiendo de qué sistema y red puedan proporcionar.
let contentShareConfig = LocalVideoConfiguration ( maxBitRateKbps : 200 )
meetingSession . audioVideo . startContentShare ( source : contentShareSource , config : contentShareConfig )
Vea el contenido compartido para más detalles.
meetingSession . audioVideo . stopContentShare ( )
Chime SDK permite dos acciones de contenido simultáneo por reunión. Las acciones de contenido remoto activarán onVideoTileAdded
, mientras que la acción local no lo hará. Para representar el video para la vista previa, agregue un VideoSink
en el videos en el VideoSource
en el 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 obtener más métricas disponibles y para monitorear la calidad del audio, el video y el contenido compartido.
class MyMetricsObserver : MetricsObserver {
func metricsDidReceive ( metrics : [ AnyHashable : Any ] ) {
logger . info ( msg : " Media metrics have been received: ( metrics ) " )
}
meetingSession . audioVideo . addMetricsObserver ( observer : self )
}
Puede recibir mensajes en tiempo real de múltiples temas después de comenzar la sesión de reunión.
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 )
}
Puede enviar un mensaje en tiempo real a cualquier tema, al que se notificará a los observadores que se han suscrito.
Nota: El tema debe ser alfa-numérico y puede incluir guiones y subrayos. Los datos no pueden exceder 2KB y la vida útil es opcional pero positiva entera.
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: asegúrese de eliminar todos los observadores y liberar los recursos que ha agregado para evitar cualquier filtración de memoria.
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 reduce el ruido de fondo en la reunión para una mejor experiencia en la reunión. Para más detalles, consulte 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
La fuente de video personalizada le permite controlar el video, como aplicar un filtro de video. Para más detalles, consulte Video personalizado.
A partir de la versión 0.23.3, el SDK comienza a enviar datos de audio redundantes a nuestros servidores para detectar la pérdida de paquetes para ayudar a reducir su efecto en la calidad de audio. Los paquetes de audio redundantes solo se envían para paquetes que contienen audio activo, es decir, discurso o música. Esto puede aumentar el ancho de banda consumido por audio a hasta 3 veces la cantidad normal dependiendo de la cantidad de pérdida de paquetes detectada. El SDK dejará de enviar automáticamente datos redundantes si no ha detectado ninguna pérdida de paquete durante 5 minutos.
Si necesita deshabilitar esta función, puede hacerlo a través de AudiovideOconfiguration antes de comenzar la sesión.
meetingSession . audioVideo . start ( AudioVideoConfiguration ( enableAudioRedundancy : false ) )
Si bien hay una opción para deshabilitar la función, recomendamos mantenerla habilitada para mejorar la calidad de audio. Una posible razón para deshabilitarlo podría ser si sus clientes tienen limitaciones de ancho de banda muy estrictas.
Consulte las preguntas frecuentes generales para Amazon Chime SDK.
Las aplicaciones pueden obtener registros de Chime SDK pasando instancias de Logger al crear reuniones. Amazon Chime SDK tiene algunas implementaciones predeterminadas de Logger que su aplicación puede usar, como Consolelogger que inicia sesión en la consola. ConsoleLogger
se establece en el nivel INFO
como predeterminado. Por lo tanto, para obtener todos los registros, incluidos los registros de medios, cree registrador siguiendo:
logger = ConsoleLogger ( name : " logger " , level : . DEFAULT )
Usted y sus usuarios finales son responsables de todo el contenido (incluidas las imágenes) cargadas para su uso con reemplazo de fondo, y deben asegurarse de que dicho contenido no viole la ley, infringe o apropie mal los derechos de cualquier tercero, o de otra manera viole un término material. de su acuerdo con Amazon (incluida la documentación, los términos de servicio de AWS o la política de uso aceptable).
Copyright Amazon.com, Inc. o sus afiliados. Reservados todos los derechos.