Optimizaciones de transmisión en tiempo real de IVS - Amazon IVS

Optimizaciones de transmisión en tiempo real de IVS

Para garantizar que sus usuarios tengan la mejor experiencia al transmitir y ver videos mediante la transmisión en tiempo real de IVS, hay varias formas de mejorar u optimizar partes de la experiencia con las características que ofrecemos actualmente.

Introducción

Al optimizar la calidad de la experiencia de un usuario, es importante tener en cuenta la experiencia deseada, que puede cambiar según el contenido que esté viendo y las condiciones de la red.

A lo largo de esta guía, nos centramos en los usuarios que son publicadores de transmisiones o suscriptores de transmisiones, y tenemos en cuenta las acciones y experiencias deseadas de esos usuarios.

Transmisión adaptativa: codificación en capas con transmisión simultánea

Esta característica solo se admite en las siguientes versiones de cliente:

  • iOS y Android (versión 1.18.0 o superior)

  • Web (versión 1.12.0 o superior)

Cuando se usan los SDK de transmisión en tiempo real de IVS, los publicadores pueden codificar varias capas de video y los suscriptores se adaptan automáticamente a la calidad que mejor se adapte a su red o la cambian. A esto lo llamamos codificación en capas con transmisión simultánea.

La codificación en capas con transmisión simultánea es compatible con Android y iOS y con los navegadores de escritorio Chrome y Edge (para Windows y macOS). No admitimos la codificación en capas en otros navegadores.

En el siguiente diagrama, el host envía tres calidades de video (alta, media y baja). IVS reenvía video de la más alta calidad a cada espectador en función del ancho de banda disponible. Esto proporciona una experiencia óptima para cada espectador. Si la conexión de red del espectador 1 cambia de buena a mala, IVS comienza automáticamente a enviarle video de menor calidad, de modo que puede seguir viendo la transmisión sin interrupciones (con la mejor calidad posible).

Utilice la codificación en capas con transmisión simultánea para ajustar la calidad del video en función de la calidad de la conexión de red del espectador.

Capas, calidades y velocidades de fotogramas predeterminadas

Las calidades y capas predeterminadas que se proporcionan a los usuarios de dispositivos móviles y de la web son las siguientes:

Móvil (Android, iOS) Web (Chrome)

Capa alta (o personalizada):

  • Velocidad de bits máxima: 900 000 bps

  • Velocidad de fotogramas: 15 fps

Capa alta (o personalizada):

  • Velocidad de bits máxima: 1 700 000 bps

  • Velocidad de fotogramas: 30 fps

Capa intermedia: ninguna (no es necesaria, porque la diferencia entre las velocidades de bits de capa alta y baja en los dispositivos móviles es estrecha)

Capa intermedia:

  • Velocidad de bits máxima: 700 000 bps

  • Velocidad de fotogramas: 20 fps

Capa baja:

  • Velocidad de bits máxima: 100 000 bps

  • Velocidad de fotogramas: 15 fps

Capa baja:

  • Velocidad de bits máxima: 200 000 bps

  • Velocidad de fotogramas: 15 fps

Resolución de las capas

Las resoluciones de las capas media e inferior se reducen verticalmente de forma automática con respecto a la de la capa superior para mantener la misma relación de aspecto.

Se excluyen las capas media e inferior si sus resoluciones se acercan mucho a la de la capa superior. Por ejemplo, si la resolución configurada es de 320 x 180, el SDK no enviará también capas de menor resolución.

En la siguiente tabla se muestran las resoluciones de las capas generadas para diferentes resoluciones configuradas. Los valores proporcionados son para una orientación horizontal, pero se pueden aplicar en sentido inverso para el contenido que se transmita en vertical.

Resolución de entrada Resoluciones de las capa de salida: móvil Resoluciones de las capas de salida: web

720p (1280 x 720)

Alta (1280 x 720)

Baja (320 x 180)

Alta (1280 x 720)

Media (640 x 360)

Baja (320 x 180)

540p (960 x 540)

Alta (960 x 540)

Baja (320 x 180)

Alta (960 x 540)

Baja (320 x 180)

360p (640 x 360)

Alta (640 x 360)

Baja (360 x 180)

Alta (640 x 360)

Baja (360 x 180)

270p (480 x 270)

Alta (480 x 270)

Alta (480 x 270)

180p (320 x 180)

Alta (320 x 180)

Alta (320 x 180)

Puede calcular las resoluciones de entrada personalizadas que no figuren en la lista anterior con la siguiente herramienta.

Configuración de la codificación en capas con transmisión simultánea

Para utilizar la codificación por capas con transmisión simultánea, debe haber habilitado la característica en el cliente. Si la habilita, el publicador aumentará el uso del ancho de banda de carga, por lo que los espectadores experimentarán menos problemas de congelación de video.

Android

// Enable Simulcast StageVideoConfiguration config = new StageVideoConfiguration(); config.simulcast.setEnabled(true); ImageLocalStageStream cameraStream = new ImageLocalStageStream(frontCamera, config); // Other Stage implementation code

iOS

// Enable Simulcast let config = IVSLocalStageStreamVideoConfiguration() config.simulcast.enabled = true let cameraStream = IVSLocalStageStream(device: camera, configuration: config) // Other Stage implementation code

Web

// Enable Simulcast let cameraStream = new LocalStageStream(cameraDevice, { simulcast: { enabled: true } }) // Other Stage implementation code

Configuraciones de transmisión

En esta sección, se exploran otras configuraciones que puede aplicar a las transmisiones de video y audio.

Cambiar la velocidad de bits de la transmisión

Para cambiar la velocidad de bits de la transmisión, use los siguientes ejemplos de configuración.

Android

StageVideoConfiguration config = new StageVideoConfiguration(); // Update Max Bitrate to 1.5mbps config.setMaxBitrate(1500000); ImageLocalStageStream cameraStream = new ImageLocalStageStream(frontCamera, config); // Other Stage implementation code

iOS

let config = IVSLocalStageStreamVideoConfiguration(); // Update Max Bitrate to 1.5mbps try! config.setMaxBitrate(1500000); let cameraStream = IVSLocalStageStream(device: camera, configuration: config); // Other Stage implementation code

Web

let cameraStream = new LocalStageStream(camera.getVideoTracks()[0], { // Update Max Bitrate to 1.5mbps or 1500kbps maxBitrate: 1500 }) // Other Stage implementation code

Cambiar la velocidad de fotogramas de la transmisión de video

Para cambiar la velocidad de fotogramas de la transmisión de video, use los siguientes ejemplos de configuración.

Android

StageVideoConfiguration config = new StageVideoConfiguration(); // Update target framerate to 10fps config.targetFramerate(10); ImageLocalStageStream cameraStream = new ImageLocalStageStream(frontCamera, config); // Other Stage implementation code

iOS

let config = IVSLocalStageStreamVideoConfiguration(); // Update target framerate to 10fps try! config.targetFramerate(10); let cameraStream = IVSLocalStageStream(device: camera, configuration: config); // Other Stage implementation code

Web

// Note: On web it is also recommended to configure the framerate of your device from userMedia const camera = await navigator.mediaDevices.getUserMedia({ video: { frameRate: { ideal: 10, max: 10, }, }, }); let cameraStream = new LocalStageStream(camera.getVideoTracks()[0], { // Update Max Framerate to 10fps maxFramerate: 10 }) // Other Stage implementation code

Optimización de la tasa de bits de audio y el soporte estéreo

Para cambiar la velocidad de bits y la configuración estéreo de la transmisión de audio, use los siguientes ejemplos de configuración.

Web

// Note: Disable autoGainControl, echoCancellation, and noiseSuppression when enabling stereo. const camera = await navigator.mediaDevices.getUserMedia({ audio: { autoGainControl: false, echoCancellation: false, noiseSuppression: false }, }); let audioStream = new LocalStageStream(camera.getAudioTracks()[0], { // Optional: Update Max Audio Bitrate to 96Kbps. Default is 64Kbps maxAudioBitrateKbps: 96, // Signal stereo support. Note requires dual channel input source. stereo: true }) // Other Stage implementation code

Android

StageAudioConfiguration config = new StageAudioConfiguration(); // Update Max Bitrate to 96Kbps. Default is 64Kbps. config.setMaxBitrate(96000); AudioLocalStageStream microphoneStream = new AudioLocalStageStream(microphone, config); // Other Stage implementation code

iOS

let config = IVSLocalStageStreamConfiguration(); // Update Max Bitrate to 96Kbps. Default is 64Kbps. try! config.audio.setMaxBitrate(96000); let microphoneStream = IVSLocalStageStream(device: microphone, config: config); // Other Stage implementation code

Cambio en el valor de MinDelay del búfer de fluctuación del suscriptor

Para cambiar el retardo mínimo del búfer de fluctuación de un participante que se está suscribiendo, se puede utilizar un valor de subscribeConfiguration personalizado. El búfer de fluctuación determina cuántos paquetes se almacenan antes de que comience la reproducción. El retardo mínimo representa el objetivo de la cantidad mínima de datos que se deben almacenar. Cambiar el retardo mínimo puede hacer que la reproducción sea más resiliente cuando se produzcan problemas de pérdida de paquetes o de conexión.

La desventaja de aumentar el tamaño del búfer de fluctuación es que también aumentará el retardo antes de que comience la reproducción. El aumento del retardo mínimo proporciona una mayor resiliencia, a costa de repercutir en el tiempo que se tarda en iniciar el video. Tenga en cuenta que aumentar el retardo mínimo durante la reproducción tiene un efecto similar: la reproducción se detendrá brevemente para permitir que se llene el búfer de fluctuación.

Si se necesita una mayor resiliencia, se recomienda empezar con un ajuste preestablecido de retardo mínimo de MEDIUM y definir la configuración de suscripción antes de que comience la reproducción.

Tenga en cuenta que el retardo mínimo se aplica solo si un participante es de suscripción única. Si un participante publica, no se aplica el retardo mínimo. Esto se hace para garantizar que varios publicadores puedan comunicarse entre sí sin retardos adicionales.

En los ejemplos siguientes se utiliza un ajuste preestablecido de retardo mínimo de MEDIUM. Consulte la documentación de referencia del SDK para ver todos los posibles valores.

Web

const strategy = { subscribeConfiguration: (participant) => { return { jitterBuffer: { minDelay: JitterBufferMinDelay.MEDIUM } } // ... other strategy functions }

Android

@Override public SubscribeConfiguration subscribeConfigrationForParticipant(@NonNull Stage stage, @NonNull ParticipantInfo participantInfo) { SubscribeConfiguration config = new SubscribeConfiguration(); config.jitterBuffer.setMinDelay(JitterBufferConfiguration.JitterBufferDelay.MEDIUM()); return config; }

iOS

func stage(_ stage: IVSStage, subscribeConfigurationForParticipant participant: IVSParticipantInfo) -> IVSSubscribeConfiguration { let config = IVSSubscribeConfiguration() try! config.jitterBuffer.setMinDelay(.medium()) return config }

Optimizaciones sugeridas

Escenario Recomendaciones
Transmite con texto o contenido que se mueve lentamente, como presentaciones o diapositivas Utilice la codificación por capas con la transmisión simultánea o configure las transmisiones con una velocidad de fotogramas más baja.
Transmisiones con acción o mucho movimiento Utilice la codificación por capas con la transmisión simultánea.
Transmisiones con conversación o poco movimiento Utilice la codificación por capas con la transmisión simultánea o elija solo audio (consulte la sección “Suscripción a los participantes” en las guías del SDK de transmisiones en tiempo real: Web, Androide iOS).
Usuarios que transmiten con datos limitados Utilice la codificación por capas con transmisión simultánea o, si desea reducir el uso de datos para todos, configure una velocidad de fotogramas más baja y baje la velocidad de bits manualmente.