Vídeo escalable

El vídeo escalable es una función para sesiones enrutadas que mejora la calidad del vídeo en sesiones con varios participantes, al permitir que cada abonado reciba una calidad de vídeo que se adapte a sus condiciones de red actuales, independientemente de los demás abonados.

Sin el vídeo escalable, el OpenTok Media Router envía la misma calidad de vídeo a todos los suscriptores de una transmisión. Cuando la conexión de un suscriptor se deteriora, el router utiliza la estimación del ancho de banda para indicar al editor que reduzca su velocidad de bits, lo que disminuye la calidad para todos los suscriptores de esa transmisión. Con el vídeo escalable activado, el router selecciona la capa de calidad más adecuada para cada suscriptor de forma independiente y en tiempo real, sin afectar a lo que reciben los demás suscriptores.

El vídeo escalable requiere sesión enrutada (una sesión que utiliza el OpenTok Media Router). No está disponible en sesiones retransmitidas y no resultaría útil en ese caso, ya que las transmisiones se envían directamente entre los clientes sin que haya ningún enrutador en la ruta que permita seleccionar o cambiar las capas de calidad. Véase El OpenTok Media Router y los modos multimedia.

El vídeo escalable está activado por defecto. La configuración a nivel de proyecto se establece por defecto en Auto, lo que significa que OpenTok Media Router activa automáticamente el vídeo escalable cuando hay más de dos clientes en una sesión y se cumplen todas las demás condiciones. También puedes configurarlo para que El (siempre activo) o Fuera de. En la mayoría de las aplicaciones, no es necesario modificar el código.

Códecs y modelos de escalabilidad

El funcionamiento del vídeo escalable depende del códec que negocie el editor. Comprender las diferencias te ayuda a elegir el códec adecuado para tu caso de uso, por ejemplo, cuando necesites optimizar el uso de la CPU del editor, el ancho de banda de subida o la adaptación de la calidad por parte del suscriptor.

VP8: Retransmisión simultánea

Con VP8El vídeo escalable se implementa mediante retransmisión simultánea. El editor codifica y transmite múltiples flujos de bits independientes con diferentes resoluciones y frecuencias de fotogramas. Por ejemplo, 1080p, 540p y 270p, cada uno con sus propias capas temporales (frecuencia de fotogramas). Cada flujo es autónomo y puede decodificarse por sí solo.

Dado que cada transmisión es independiente, el OpenTok Media Router puede cambiar a cualquier suscriptor a un nivel de calidad diferente sin necesidad de recodificación. Esto proporciona una gran resiliencia ante las condiciones cambiantes de la red.

Contrapartida: La codificación y carga de múltiples flujos requiere más CPU y ancho de banda de subida por parte del editor que el envío de una sola calidad. Las capas de menor resolución son bastante más baratas de codificar que las de mayor calidad, pero el coste total sigue siendo mayor que el de un flujo no simulado.

VP9: Codificación de vídeo escalable (SVC)

Con VP9usos escalables del vídeo Codificación de vídeo escalable (SVC). El editor codifica un único flujo de bits que contiene múltiples capas espaciales (resolución) y temporales (frecuencia de fotogramas) integradas en él. Cada capa superior depende de las capas inferiores, por lo que un decodificador que reciba únicamente la capa base obtendrá una calidad inferior, mientras que uno que reciba todas las capas obtendrá la máxima calidad, todo ello a partir del mismo flujo de bits.

El coste de CPU del editor para la codificación SVC es mayor que el de la codificación de un único flujo, más o menos comparable al de la transmisión simultánea en VP8, pero el SVC requiere menos ancho de banda de subida, ya que solo hay que cargar un flujo de bits en lugar de múltiples flujos independientes. A partir de la única secuencia codificada, el OpenTok Media Router puede extraer y reenviar el subconjunto adecuado de capas para cada suscriptor, lo que proporciona una adaptación de la calidad eficiente y flexible que, además, es más resistente a la pérdida de paquetes.

SVC requiere que tanto el punto final del editor como el OpenTok Media Router sean compatibles con VP9 SVC. Firefox es compatible con VP9, pero no con SVC. Un editor de Firefox envía VP9 sin capas, por lo que el OpenTok Media Router no puede ajustar la calidad de esa transmisión.

Para una explicación completa de las capas del SVC, los modos de escalabilidad (L1T3, L2T3, L3T3), el comportamiento de archivado y la compatibilidad de dispositivos, consulte Codificación de vídeo escalable VP9 para sesiones enrutadas.

Principales diferencias

Aspecto Retransmisión simultánea (VP8) SVC (VP9)
Lo que envía la editorial Múltiples flujos de bits independientes con diferentes resoluciones y frecuencias de imagen (SSRC/RID distintos) Un flujo de bits con capas espaciales y temporales integradas (SSRC único)
Capas espaciales Multi-stream: cada resolución es un flujo codificado independiente Incorporado en un único flujo de bits
Capas temporales Cada transmisión simultánea puede incluir capas temporales Incorporado en un único flujo de bits
Función de OpenTok Media Router Elige qué flujo reenviar Extraer y reenviar las capas adecuadas
Compatibilidad con Firefox para editores Compatible con codificaciones basadas en RID VP9 sí; SVC no compatible con Firefox

Relación de resolución de las capas espaciales: Cada paso espacial utiliza un Relación de resolución de 2:1. Un L3T3 La transmisión tiene capas al 100 %, al 50 % y al 25 % de la resolución original (por ejemplo, de 1080p a 540p y a 270p). Por eso setPreferredResolution() pueden estar pensadas para resoluciones muy diferentes.

H.264: Vídeo escalable no compatible

El códec H.264 es totalmente compatible con la API de Video de Vonage para publicar y suscribirse, pero el vídeo escalable no está disponible para secuencias H.264. El OpenTok Media Router no puede cambiar de nivel de calidad en las transmisiones H.264, y la configuración de vídeo escalable no tiene ningún efecto cuando se negocia el formato H.264. Si tu aplicación requiere vídeo escalable, utiliza VP8 o VP9 en su lugar. Consulta Códecs de vídeo.

Compatibilidad con vídeo escalable

El vídeo escalable es compatible con la transmisión simultánea en VP8 y con VP9 SVC. No es compatible con Flujos H.264. Solo está disponible en sesiones enrutadas.

Los siguientes clientes admiten vídeo escalable:

  • SDK web - Chrome, Firefox, Safari, Samsung Internet, WebView para Android, WebView para iOS y Edge basado en Chromium. Nota: Firefox es compatible con la transmisión simultánea en VP8, pero no con VP9 SVC.
  • SDK de Android en los dispositivos compatibles
  • SDK para iOS en los dispositivos compatibles
  • SDK de Windows
  • SDK para Linux
  • SDK de macOS
  • SDK de React Native en los dispositivos compatibles

Para obtener información sobre la compatibilidad de dispositivos y navegadores con VP9 SVC, consulte Codificación de vídeo escalable VP9 para sesiones enrutadas.

Nota: De forma predeterminada, el vídeo escalable está desactivado para las transmisiones de pantalla compartida y activado para las transmisiones de cámara y de fuentes de vídeo personalizadas. Para activar el vídeo escalable para la pantalla compartida, consulta Transmisiones de pantalla compartida escalables.

Cómo utilizar el vídeo escalable

Configuración a nivel de proyecto

El vídeo escalable cuenta con tres modos que puedes configurar para un proyecto en tu Account de la Video API:

  1. Vaya a su Account de la Video API y selecciona el proyecto de la lista de proyectos que aparece en el menú de la izquierda.
  2. En Configuración del proyectoencuentra Vídeo escalable y selecciona la configuración del proyecto:
    • Auto (recomendado) - El OpenTok Media Router permite la transmisión de vídeo escalable cuando hay más de dos clientes en una sesión. Deja esta opción seleccionada a menos que tengas una razón concreta para cambiarla.
    • El - El vídeo escalable está siempre activado (en los clientes compatibles) para todas las sesiones de este proyecto.
    • Fuera de - El vídeo escalable está desactivado para todas las sesiones de este proyecto. Utiliza esta opción para fijar la resolución y la velocidad de fotogramas, o para reducir el consumo de CPU y ancho de banda del editor.
  3. Haz clic Guardar.

Nota: Este ajuste controla Emisión simultánea VP8 Comportamiento. VP9 siempre utiliza SVC cuando es compatible, mientras que H.264 no admite vídeo escalable. Ninguno de los dos se ve afectado por esta configuración.

Nota: Los flujos requieren más ancho de banda de subida del editor cuando el vídeo escalable está activo, porque se codifican y transmiten capas de calidad adicionales.

Transmisiones de pantalla compartida escalables

Por defecto, el vídeo escalable es discapacitado para las retransmisiones con pantalla compartida y activado para las transmisiones de cámara y de fuentes de vídeo personalizadas. El contenido compartido en pantalla suele cambiar con menos frecuencia que el vídeo de la cámara, por lo que el coste adicional de codificación del vídeo escalable suele ser innecesario. Sin embargo, activarlo puede resultar beneficioso en sesiones en las que los participantes que comparten pantalla tengan condiciones de red variables. Puedes anular la configuración predeterminada por editor:

SDK Método / Propiedad
SDK web scalableScreenshare opción en OT.initPublisher()
SDK de Android PublisherKit.Builder.scalableScreenshare()
SDK para iOS OTPublisherKitSettings.scalableScreenshare
SDK de Windows Publisher.Builder.ScalableScreenshare
SDK para Linux otc_publisher_settings_set_scalable_screenshare()

Cómo afecta la sugerencia de contenido a las capas de pantalla compartida

Cuando se habilita el vídeo escalable para una transmisión de pantalla compartida en formato VP8 en una sesión enrutada, el Sugerencia sobre el contenido de vídeo La configuración que elijas para el emisor determina cómo este estructura las capas de transmisión simultánea que envía. Por eso, el número de flujos (SSRC) que ves para un emisor que comparte pantalla en una herramienta como chrome://webrtc-internals Depende de la sugerencia de contenido:

  • detail o text — El editor está optimizado para conservar los detalles más sutiles y la legibilidad (texto, dibujos lineales, contenido estático). Envía dos secuencias con la misma resolución espacial que solo se diferencian en la frecuencia de fotogramas: una transmisión a resolución completa con la frecuencia de fotogramas habitual y una segunda transmisión a resolución completa con una frecuencia de fotogramas inferior. De este modo, el contenido compartido se mantiene nítido y legible, al tiempo que se proporciona al OpenTok Media Router una capa con una tasa de bits más baja a la que recurrir cuando la red de un suscriptor se degrada; así, la degradación reduce la frecuencia de fotogramas en lugar de difuminar los detalles. Las dos capas a resolución completa ofrecen un buen equilibrio entre la resiliencia ante la degradación y el mantenimiento de la resolución detallada original.

  • motion — El reproductor está optimizado para garantizar una reproducción fluida (por ejemplo, al compartir la reproducción de un vídeo). Funciona como una retransmisión simultánea de cámara, enviando varias secuencias con diferentes resoluciones espaciales, por lo que el OpenTok Media Router puede reducir la resolución de un suscriptor para mantener la fluidez del movimiento en condiciones de red limitadas.

Elige la sugerencia de contenido que mejor se adapte al contenido que has compartido: detail o text da prioridad a mantener la nitidez de los detalles (reduciendo primero la frecuencia de fotogramas), mientras que motion da prioridad a la fluidez del movimiento (reduciendo primero la resolución).

Nota: Este comportamiento de la capa se aplica a las transmisiones simultáneas de VP8 con pantalla compartida. Configura la indicación de contenido a través de la videoContentHint opción en OT.initPublisher() o el publisher.setVideoContentHint() método — véase Configuración de sugerencias de contenido de vídeo.

Configuración de la frecuencia de fotogramas y la resolución preferidas por el suscriptor

Cuando se publica una transmisión con vídeo escalable, los suscriptores pueden indicar al OpenTok Media Router la calidad que prefieren. El OpenTok Media Router selecciona la capa disponible más cercana que se adapte a las condiciones reales de la red del suscriptor.

Importante: Llamando a setPreferredResolution() o setPreferredFrameRate() provoca una renegociación con el OpenTok Media Router. Hacerlo repetidamente o en rápida sucesión resulta costoso. Consume recursos de la CPU y puede reducir la calidad general de la transmisión. Establece los valores preferidos una sola vez, o solo cuando la configuración del suscriptor cambie de forma significativa, en lugar de ajustarlos continuamente.

Advertencia: Estas preferencias del lado del suscriptor dan por hecho que el editor utiliza la disposición predeterminada de la capa de escalabilidad. Si el editor la ha sustituido por setTargetScalabilityMode(), es posible que la capa que reenvía el Media Router no coincida con la resolución o la frecuencia de fotogramas solicitadas. Véase Interacción con la resolución y la frecuencia de fotogramas preferidas por el suscriptor Para más información.

SDK Frecuencia de imagen Resolución
SDK web Subscriber.setPreferredFrameRate() - véase Guía web de «subscribe-streams» Subscriber.setPreferredResolution() - véase Guía web de «subscribe-streams»
SDK de Android SubscriberKit.setPreferredFrameRate() - véase Guía de «subscribe-streams» para Android SubscriberKit.setPreferredResolution() - véase Guía de «subscribe-streams» para Android
SDK para iOS OTSubscriberKit.preferredFrameRate - véase Guía subscribe-streams iOS OTSubscriberKit.preferredResolution - véase Guía subscribe-streams iOS
SDK de Windows Subscriber.PreferredFramerate - véase subscribe-streams Guía de Windows Subscriber.PreferredResolution - véase subscribe-streams Guía de Windows
SDK para Linux otc_subscriber_set_preferred_framerate() - véase Guía de Linux sobre «subscribe-streams» otc_subscriber_set_preferred_resolution() - véase Guía de Linux sobre «subscribe-streams»
React Native preferredFrameRate propiedad de OTSubscriber - véase Guía de React Native sobre «subscribe-streams» preferredResolution propiedad de OTSubscriber - véase Guía de React Native sobre «subscribe-streams»

Cómo Verificar que el Vídeo Escalable Funciona

En el SDK no existe un indicador específico de «vídeo escalable activo», pero puedes comprobar si está funcionando mediante los siguientes métodos.

Inspector de vídeo

El Inspector de vídeo La herramienta del módulo «Métricas de calidad» muestra el códec, la resolución y la frecuencia de fotogramas. Pasa el cursor por cualquier punto de una línea representada gráficamente para ver el códec que se está utilizando en ese momento. Cuando el vídeo escalable está activado, la resolución y/o la frecuencia de fotogramas de uno o varios suscriptores pueden ajustarse dinámicamente en respuesta a los cambios en las condiciones de la red.

Estadísticas de WebRTC

Cada SDK pone a disposición el informe de estadísticas de WebRTC subyacente. Por parte del editor, comprueba RTCOutboundRtpStreamStats:

  • Con Emisión simultánea VP8, verás varios ssrc entradas con diferentes frameWidth y frameHeight valores, uno por cada capa de emisión simultánea.
  • Con VP9 SVC, verás un único ssrc con un scalabilityMode conjunto de propiedades, por ejemplo L3T3.

Nota: Para un VP8 compartir pantalla transmisión publicada con el detail o text Sugerencia de contenido: los dos ssrc las entradas tienen el lo mismo frameWidth y frameHeight y se diferencian en la frecuencia de fotogramas en lugar de en la resolución. Véase Cómo afecta la sugerencia de contenido a las capas de pantalla compartida.

Métodos del SDK para acceder al informe de estadísticas:

Lista de control: Condiciones necesarias para que el vídeo escalable esté activo

Si no observa un comportamiento de calidad adaptable, Verifique lo siguiente:

  • La sesión es derrotado, no retransmitido.
  • El vídeo escalable no está configurado en Fuera de a nivel de proyecto.
  • El códec negociado es VP8 o VP9, no H.264.
  • El editor funciona en un cliente compatible.

Configuración del modo de escalabilidad deseado

Puedes configurar explícitamente el modo de escalabilidad de un editor, controlando el número de capas espaciales (resolución) y temporales (frecuencia de fotogramas) que codifica WebRTC. Esto te permite controlar con gran precisión el equilibrio entre la adaptabilidad de la calidad del vídeo y el uso de recursos.

Cómo funciona

El modo de escalabilidad de destino se aplica a la ruta de medios del Media Router (editor → Media Router). Se puede configurar o modificar en cualquier momento; no es necesario que la negociación de la ruta de medios haya finalizado, y se puede actualizar sobre la marcha durante una sesión activa mientras el codificador ya está en funcionamiento. Si se invoca el método set antes de que se establezca la ruta multimedia, el SDK retiene el valor y lo aplica una vez que finaliza la negociación del códec. En Enrutamiento adaptativo de contenidos multimedia En las sesiones (AMR), este modo solo se aplica a la ruta de medios del enrutador de medios (emisor → enrutador de medios), ya que los modos de escalabilidad no se utilizan cuando se omite el enrutador de medios en la ruta de medios.

Qué controla el objetivo

El modo de escalabilidad de destino indica al codificador cuántas capas espaciales (resolución) y temporales (frecuencia de fotogramas) debe generar. Esto determina directamente qué opciones de calidad tiene disponibles el Media Router a la hora de reenviar el vídeo a cada suscriptor:

  • Más capas espaciales — El Media Router puede reducir la resolución para los abonados con ancho de banda limitado, al tiempo que mantiene la resolución completa para los demás. Por ejemplo, L3T3 ofrece tres niveles de resolución entre los que puede elegir el router.
  • Más capas temporales — El Media Router puede reducir la frecuencia de fotogramas para los abonados con limitaciones sin reducir la resolución. Por ejemplo, L1T3 mantiene la resolución máxima en todo momento, pero ofrece al router tres niveles de frecuencia de fotogramas entre los que elegir; esto resulta ideal para contenidos en los que el nivel de detalle es fundamental, como diapositivas o documentos.
  • Menos capas — reduce el consumo de CPU y ancho de banda del servidor de distribución, pero limita la capacidad del enrutador multimedia para adaptar la calidad a cada abonado.

Cuando es posible que el objetivo no se aplique en su totalidad

El objetivo es una preferencia: el codificador la aplica cuando las condiciones lo permiten. El modo que se aplique realmente puede diferir de tu objetivo en los siguientes casos:

  • Limitaciones de los códecs — Si el códec negociado no admite las capas solicitadas, se ajusta el modo. Por ejemplo, al configurar L2T3 con VP8 da como resultado L1T3 se aplica porque VP8 no admite la escalabilidad espacial. Véase Solución alternativa en función del códec.
  • La resolución es demasiado baja para las capas espaciales solicitadas — Cada paso de la capa espacial utiliza una relación de resolución de 2:1. Si la resolución de captura del editor es demasiado baja para realizar una subdivisión significativa (por ejemplo, al publicar a 320×240 con L3T3 (si se solicita), el codificador puede generar menos capas espaciales de las solicitadas, ya que la capa más baja sería demasiado pequeña para resultar útil.
  • Limitaciones de hardware o de recursos — En dispositivos con recursos limitados, es posible que el codificador no genere todas las capas solicitadas si ello supone superar los límites de la CPU o del ancho de banda.

Comprobación del modo aplicado

El método «get» devuelve tu objetivo (lo que hayas configurado), no necesariamente lo que se haya aplicado. Para comprobar las capas de escalabilidad reales que genera el codificador, utiliza el informe de estadísticas de WebRTC —concretamente el RTCOutboundRtpStreamStats — vía getRtcStatsReport(). Para obtener más información sobre cómo acceder a las estadísticas en las distintas plataformas, consulta Cómo Verificar que el Vídeo Escalable Funciona y Observabilidad del cliente.

Modos de escalabilidad válidos

Se admiten los siguientes modos:

Modo Capas espaciales Capas temporales Descripción
L1T1 1 1 Una sola resolución, una sola velocidad de fotogramas (sin escalabilidad)
L1T2 1 2 Una sola resolución, dos niveles de velocidad de fotogramas
L1T3 1 3 Una sola resolución, tres niveles de velocidad de fotogramas
L2T1 2 1 Dos resoluciones, una sola frecuencia de fotogramas
L2T2 2 2 Dos resoluciones, dos niveles de frecuencia de fotogramas
L2T3 2 3 Dos resoluciones, tres niveles de frecuencia de fotogramas
L3T1 3 1 Tres resoluciones, una sola frecuencia de fotogramas
L3T2 3 2 Tres resoluciones, dos niveles de frecuencia de fotogramas
L3T3 3 3 Tres resoluciones, tres niveles de frecuencia de fotogramas

El formato sigue el Especificación SVC de WebRTC del W3C: L<spatial>T<temporal>, donde el número que aparece después de L es el número de capas espaciales y el número que aparece después de T es el número de capas temporales.

Cualquier valor que no figure en esta lista se rechaza y se genera un error. Si nunca has llamado al método «set» (por ejemplo, setTargetScalabilityMode() en la web o en Android, o en la targetScalabilityMode propiedad en iOS/Windows), el método get correspondiente devuelve un valor vacío o nulo (dependiendo de la plataforma); esto se debe a que el modo de escalabilidad es un objetivo Es solo una preferencia, no un valor predeterminado gestionado internamente. El SDK no establece un destino predeterminado por ti, por lo que, hasta que no establezcas uno de forma explícita, no hay ningún valor que devolver.

Solución alternativa en función del códec

El modo que en realidad es aplicado Depende del códec negociado en la ruta multimedia del Media Router:

  • Códecs compatibles con SVC (VP9) — El modo solicitado se aplica tal cual. Estos códecs admiten de forma nativa tanto las capas de escalabilidad espacial como las temporales.
  • VP8 — VP8 solo admite escalabilidad temporal, sin capas espaciales; las características espaciales se gestionan mediante la publicación de múltiples flujos a diferentes resoluciones (retransmisión simultánea). El modo aplicable más cercano se obtiene conservando la dimensión temporal y fijando las capas espaciales en 1. Por ejemplo, si se configura L2T2 y se negocia el VP8, L1T2 se aplica.
  • H.264 — En esta API no se admite el vídeo escalable para H.264, por lo que el comportamiento alternativo descrito anteriormente no se aplica a las transmisiones H.264.

El método `get` siempre devuelve lo que hayas establecido explícitamente (tu intención), independientemente de lo que se haya aplicado realmente tras el recurso alternativo dependiente del códec. Por ejemplo, si estableces L2T3 y, una vez negociado el VP8, el Media Router aplica L1T3 (dado que VP8 no tiene capas espaciales), pero el método «get» sigue devolviendo L2T3 — que refleja tu objetivo original, no el modo efectivo.

Interacción con la resolución y la frecuencia de fotogramas preferidas por el suscriptor

La lógica de selección de capas del Media Router para Subscriber.setPreferredResolution() y Subscriber.setPreferredFrameRate() se basa en la disposición predeterminada de las capas de escalabilidad. Cuando un editor establece un modo de escalabilidad de destino distinto al predeterminado, las capas espaciales y/o temporales que genera realmente el codificador ya no se ajustan a lo que el enrutador multimedia da por supuesto que está disponible, y es posible que la capa que el enrutador reenvía a un suscriptor no se corresponda con la resolución o la frecuencia de fotogramas que dicho suscriptor ha solicitado.

Advertencia: Cuando un editor anula el modo de escalabilidad con setTargetScalabilityMode() (o la propiedad equivalente en iOS/Windows), los suscriptores que llamen setPreferredResolution() o setPreferredFrameRate() en la transmisión de esa emisora no garantiza que se obtenga la resolución o la frecuencia de fotogramas solicitadas. Por ejemplo, si se solicita una resolución preferida más baja con setPreferredResolution() puede que no surta efecto si el modo elegido por el editor no expone una capa espacial coincidente, y es posible que una frecuencia de fotogramas preferida se asigne a una capa temporal diferente a la esperada. Si tu aplicación depende de que la selección de la resolución o frecuencia de fotogramas preferida por parte del suscriptor funcione de forma predecible, deja el modo de escalabilidad de destino en su valor por defecto.

Uso de la API específico de cada plataforma

Android

El PublisherKit La clase incluye setTargetScalabilityMode() y getTargetScalabilityMode() métodos.

Configuración del modo de escalabilidad deseado

Llame a setTargetScalabilityMode() en una instancia de PublisherKit para configurar el modo de escalabilidad deseado:

publisher.setTargetScalabilityMode("L3T3");

Este método puede invocarse en cualquier momento; no es necesario que haya finalizado la negociación de la ruta de medios. El modo se aplicará una vez que se haya establecido la ruta de medios del enrutador de medios.

El método lanza un OpenTokException si el modo solicitado no es válido (es decir, no es uno de L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3):

try {
    publisher.setTargetScalabilityMode("L3T3");
} catch (OpenTokException e) {
    Log.e(TAG, "Invalid scalability mode: " + e.getMessage());
}
Obtener el modo de escalabilidad deseado

Llame a getTargetScalabilityMode() para recuperar el valor que se había establecido explícitamente. Devuelve null si nunca se ha llamado a la función «setter»:

String mode = publisher.getTargetScalabilityMode();
// "L3T3" or null

Nota: El getter devuelve la intención del usuario, no el modo realmente aplicado. Cuando se negocia un códec que no sea SVC (VP8 o H.264), el modo aplicado puede variar (las capas espaciales se limitan a 1).

Web (JavaScript)

El objeto Publisher incluye setTargetScalabilityMode() y getTargetScalabilityMode() métodos.

Configuración del modo de escalabilidad deseado

Llame a setTargetScalabilityMode() en un objeto Publisher para establecer el modo de escalabilidad de destino. El método acepta una cadena que identifica el modo deseado:

publisher.setTargetScalabilityMode('L3T3');

Este método puede invocarse en cualquier momento; no es necesario que haya finalizado la negociación de la ruta de medios. El modo se aplicará una vez que se haya establecido la ruta de medios del enrutador de medios.

El método genera un error si el modo solicitado no es válido (es decir, si no es uno de L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3):

try {
  publisher.setTargetScalabilityMode('L3T3');
} catch (err) {
  console.error('Invalid scalability mode:', err.message);
}
Obtener el modo de escalabilidad deseado

Llame a getTargetScalabilityMode() para recuperar el valor que se había establecido explícitamente. Devuelve undefined si nunca se ha llamado a la función «setter»:

const mode = publisher.getTargetScalabilityMode();
console.log(mode); // 'L3T3' or undefined

Nota: El getter devuelve la intención del usuario, no el modo realmente aplicado. Cuando se negocia un códec que no sea SVC (VP8 o H.264), el modo aplicado puede variar (las capas espaciales se limitan a 1).

Linux

El SDK de C incluye otc_publisher_set_target_scalability_mode() y otc_publisher_get_target_scalability_mode() funciones.

Configuración del modo de escalabilidad deseado

Llame a otc_publisher_set_target_scalability_mode() Para configurar el modo de escalabilidad deseado para un editor:

otc_status status = otc_publisher_set_target_scalability_mode(publisher, "L3T3");
if (status != OTC_SUCCESS) {
    printf("Failed to set scalability mode\n");
}

Este método puede invocarse en cualquier momento; no es necesario que haya finalizado la negociación de la ruta de medios. El modo se aplicará una vez que se haya establecido la ruta de medios del enrutador de medios.

La función devuelve OTC_INVALID_PARAM si:

  • El puntero del editor es NULL
  • La cadena del modo de escalabilidad es NULL
  • El modo solicitado no es válido (es decir, no es uno de L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3)
Obtener el modo de escalabilidad deseado

Llame a otc_publisher_get_target_scalability_mode() para recuperar el valor que se había establecido explícitamente. Devuelve NULL si nunca se ha llamado a la función «setter»:

const char* mode = otc_publisher_get_target_scalability_mode(publisher);
if (mode != NULL) {
    printf("Target scalability mode: %s\n", mode);
}

Nota: El getter devuelve la intención del usuario, no el modo realmente aplicado. Cuando se negocia un códec que no sea SVC (VP8 o H.264), el modo aplicado puede variar (las capas espaciales se limitan a 1).

iOS (Objective-C)

El OTPublisherKit La clase incluye el targetScalabilityMode propiedad.

Configuración del modo de escalabilidad deseado

Fije el targetScalabilityMode propiedad de una instancia de OTPublisherKit para establecer el modo de escalabilidad de destino:

NSError *error = nil;
[publisher setTargetScalabilityMode:@"L3T3" error:&error];

Se puede llamar al «setter» en cualquier momento; no es necesario que haya finalizado la negociación de la ruta de medios. El modo se aplicará una vez que se haya establecido la ruta de medios del enrutador de medios.

El colocador lanza un OTError si el modo solicitado no es válido (es decir, no es uno de L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3).

Obtener el modo de escalabilidad deseado

Lee el targetScalabilityMode propiedad para recuperar el valor que se había establecido explícitamente. Devuelve nil si nunca se ha llamado a la función «setter»:

NSString *mode = publisher.targetScalabilityMode;
// @"L3T3" or nil

Nota: El getter devuelve la intención del usuario, no el modo realmente aplicado. Cuando se negocia un códec que no sea SVC (VP8 o H.264), el modo aplicado puede variar (las capas espaciales se limitan a 1).

iOS (Swift)

El OTPublisherKit La clase incluye el targetScalabilityMode propiedad.

Configuración del modo de escalabilidad deseado

Fije el targetScalabilityMode propiedad de una instancia de OTPublisherKit para establecer el modo de escalabilidad de destino:

try publisher.setTargetScalabilityMode("L3T3")

Se puede llamar al «setter» en cualquier momento; no es necesario que haya finalizado la negociación de la ruta de medios. El modo se aplicará una vez que se haya establecido la ruta de medios del enrutador de medios.

El colocador lanza un OTError si el modo solicitado no es válido (es decir, no es uno de L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3).

Obtener el modo de escalabilidad deseado

Lee el targetScalabilityMode propiedad para recuperar el valor que se había establecido explícitamente. Devuelve nil si nunca se ha llamado a la función «setter»:

let mode = publisher.targetScalabilityMode
// "L3T3" or nil

Nota: El getter devuelve la intención del usuario, no el modo realmente aplicado. Cuando se negocia un códec que no sea SVC (VP8 o H.264), el modo aplicado puede variar (las capas espaciales se limitan a 1).

Windows

El Publisher La clase incluye el TargetScalabilityMode propiedad.

Configuración del modo de escalabilidad deseado

Fije el TargetScalabilityMode propiedad de una instancia de Publisher para establecer el modo de escalabilidad deseado:

publisher.TargetScalabilityMode = "L3T3";

Se puede llamar al «setter» en cualquier momento; no es necesario que haya finalizado la negociación de la ruta de medios. El modo se aplicará una vez que se haya establecido la ruta de medios del enrutador de medios.

El colocador lanza un OpenTokException si el modo solicitado no es válido (es decir, no es uno de L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3):

try
{
    publisher.TargetScalabilityMode = "L3T3";
}
catch (OpenTokException e)
{
    Console.WriteLine("Invalid scalability mode: " + e.Message);
}
Obtener el modo de escalabilidad deseado

Lee el TargetScalabilityMode propiedad para recuperar el valor que se había establecido explícitamente. Devuelve null si nunca se ha llamado a la función «setter»:

string mode = publisher.TargetScalabilityMode;
// "L3T3" or null

Nota: El getter devuelve la intención del usuario, no el modo realmente aplicado. Cuando se negocia un códec que no sea SVC (VP8 o H.264), el modo aplicado puede variar (las capas espaciales se limitan a 1).

Ideas erróneas habituales y preguntas frecuentes

¿El vídeo escalable es lo mismo que el VP9 SVC?

No. «Vídeo escalable» es el nombre de la función de la Video API de Vonage. El mecanismo técnico depende del códec:

  • VP8 implementa vídeo escalable a través de retransmisión simultánea. El editor envía varias transmisiones independientes.
  • VP9 implementa vídeo escalable a través de VPC. El editor envía un flujo con capas incrustadas.

Ambos mecanismos permiten que OpenTok Media Router adapte la calidad que recibe cada suscriptor. Cuando en la documentación se menciona el «vídeo escalable» sin especificar un códec, se hace referencia a la función en su conjunto.

¿Forzar un códec preferido activa el vídeo escalable?

No. La selección de un códec preferido es independiente del vídeo escalable. La activación del vídeo escalable depende de todos los siguientes factores:

  1. La configuración del proyecto de vídeo escalable (Activado, Desactivado o Automático).
  2. La sesión enrutada.
  3. El códec acordado que admite vídeo escalable (VP8 o VP9, no H.264).
  4. El cliente o navegador del editor que admite vídeo escalable.

¿Por qué Subscriber.setPreferredResolution() ¿No adaptar la calidad?

El lado del abonado setPreferredResolution() y setPreferredFrameRate() son sugerencias para el OpenTok Media Router, no órdenes directas al codificador del editor. El OpenTok Media Router solo puede actuar en función de estas sugerencias cuando está seleccionando activamente entre capas de vídeo escalables para ese suscriptor. Si se cumple alguna de las siguientes condiciones, no hay capas entre las que elegir y las sugerencias no tienen ningún efecto:

  • El vídeo escalable está desactivado a nivel de proyecto o en la transmisión del editor.
  • El códec acordado es el H.264, que no admite vídeo escalable.
  • El cliente del editor no genera capas escalables. Por ejemplo, un editor de Firefox que envía VP9 sin capas SVC.
  • El editor tiene una limitación de CPU o de ancho de banda y no está enviando capas superiores entre las que el enrutador pueda elegir.
  • El editor ha configurado un modo de escalabilidad no predeterminado mediante setTargetScalabilityMode() — La selección de capas del Media Router se basa en la disposición predeterminada, por lo que es posible que las preferencias del abonado no se correspondan con la capa que este espera.
  • La sesión se transmite por retransmisión. En una sesión de retransmisión, el OpenTok Media Router no reenvía las transmisiones, por lo que no es posible realizar la selección de capas. Ten en cuenta que, en las sesiones de retransmisión (P2P), el codificador del emisor adapta su salida directamente en función de las condiciones de red del suscriptor, pero esto no es lo mismo que la selección de capas de vídeo escalable.

Nota: En las sesiones retransmitidas, es posible que algunos SDK sigan aceptando estas llamadas a la API sin generar errores, pero, dado que el OpenTok Media Router no interviene en el reenvío de la transmisión, no es posible respetar las preferencias relativas a la selección de la capa de calidad.

Nota: Las API de resolución y frecuencia de fotogramas del lado del editor, cuando están disponibles en determinados SDK, se comportan de forma diferente. Controlan directamente la resolución y la frecuencia de fotogramas del flujo codificado, y no una indicación de calidad del OpenTok Media Router.

¿Puedo mezclar editores escalables y no escalables en la misma sesión?

Sí. El vídeo escalable se determina por flujo, no por sesión. Una sesión puede incluir simultáneamente emisores que utilicen vídeo escalable y otros que no lo hagan, por ejemplo, emisores H.264 o clientes que emitan con el vídeo escalable desactivado. El OpenTok Media Router gestiona cada flujo de forma independiente.

¿Afecta el vídeo escalable al archivado?

Para Emisión simultánea VP8, el archivador graba utilizando la capa de mayor calidad disponible.

Para VP9 SVCLos archivos individuales almacenan el flujo de cada participante como WebM con codificación VP9 SVC. Los archivos compuestos siempre se transcodifican a H.264/AAC MP4, independientemente del códec de la sesión.

Es posible que la reproducción de archivos WebM en formato VP9 SVC no funcione en todos los reproductores multimedia. Para obtener instrucciones de reproducción y comandos de transcodificación, consulta Notas sobre el archivado con vídeos VP9 en la guía VP9.

Para más información, consulte este artículo de ayuda.