Códecs de vídeo
La plataforma de Vonage aprovecha el protocolo WebRTC y los códecs de vídeo en tiempo real compatibles con WebRTC. En concreto, la plataforma de Vonage admite el VP8, VP9y H.264.
Las secuencias utilizan el códec VP8, que se admite en todos los clientes, a menos que se establezca un códec preferido para la aplicación a la que pertenece la sesión (véase Configuración del códec de vídeo preferido para una aplicación.)
En el amplio ecosistema de dispositivos y navegadores compatibles hay distintos niveles de apoyo a la VP8, VP9 y códecs de vídeo en tiempo real H.264.
Algunos terminales admiten todos los códecs de vídeo y otros sólo uno. Dependiendo del tipo de aplicación que estés creando y de los tipos de navegadores y dispositivos que vayan a utilizar tus usuarios finales, la elección del códec preferido cambiará.
¿Qué es un códec de vídeo?
Un códec de vídeo consta de dos partes: un codificador y un descodificador. Puede codificar (comprimir) los fotogramas de vídeo digital entrantes de una webcam en un flujo de datos binarios que pueden enviarse a través de una red.
También puede ingerir un flujo de datos binarios y descodificarlo (descomprimirlo) en un flujo de fotogramas de vídeo sin procesar que pueden visualizarse en una pantalla.
El mecanismo para codificar y descodificar el vídeo es el estándar del códec y para el propósito de esta página vamos a hablar de dos populares, VP8 y H.264.
VP8 frente a H.264
El códec de vídeo en tiempo real VP8 es un códec de software. Puede funcionar bien a tasas de bits más bajas y es un códec de vídeo maduro en el contexto de WebRTC.
Como códec de software, puede instanciarse tantas veces como necesite la aplicación dentro de los límites de memoria y CPU. El códec VP8 es compatible con Vídeo escalable lo que significa que funciona bien en sesiones grandes con navegadores y dispositivos compatibles.
El códec de vídeo en tiempo real H.264 está disponible en forma de hardware y software según el dispositivo.
Se trata de un códec relativamente nuevo en el contexto de WebRTC, aunque tiene una larga historia en la transmisión de películas y videoclips por Internet.
La compatibilidad con códecs de hardware significa que la CPU central del dispositivo no tiene que trabajar tanto para procesar el vídeo, lo que reduce la carga de la CPU.
El número de instancias de hardware depende del dispositivo, siendo iOS el que mejor soporte tiene.
Dado que H.264 es un códec nuevo para WebRTC y que cada dispositivo puede tener una implementación diferente, la calidad puede variar.
Por ello, es posible que H.264 no funcione tan bien a tasas de bits más bajas en comparación con VP8. H.264 no es adecuado para sesiones de gran tamaño, ya que no admite la función de vídeo escalable.
VP9 frente a VP8
En VP9 El códec en tiempo real es relativamente nuevo. Cada vez cuenta con más apoyo entre los navegadores y los proveedores de hardware. A pesar de su creciente apoyo, aún carece de la ubicuidad de los demás códecs.
El códec VP9, al igual que VP8, funciona bien a tasas de bits más bajas que H.264. Además, VP9 requiere incluso menos ancho de banda que VP8 para codificar vídeo. Sin embargo, las mejoras en la compresión tienen una contrapartida: la codificación/decodificación requiere más CPU que VP8.
El códec VP9 admite Codificación de vídeo escalable en sesiones enrutadas. Para más información Codificación de vídeo escalable VP9 para sesiones enrutadas.
Configuración del códec de vídeo preferido para una aplicación
Puede establecer el códec de vídeo preferido para una aplicación en el menú Panel de Vonage seleccionando Applications, luego navegando a Video Capabilities, y finalmente accediendo a la sección Advanced Settings. Las opciones válidas son VP8, H264 o VP9pero la aplicabilidad puede variar en función del tipo de sesión. Por defecto, todos los proyectos están preconfigurados con VP8 como códec de vídeo preferido.
En sesiones enrutadas (sesiones que usan el Media Router), el OpenTok Media Router), el editor negociará con el OpenTok Media Router el códec a usar, priorizando el códec seleccionado por el usuario cuando sea soportado por el dispositivo.
En sesiones retransmitidasen el que los clientes se envían flujos directamente entre sí, el enrutador multimedia de OpenTok no interviene en la negociación. Cada par de publicación-suscripción intenta encontrar un códec de vídeo común, prefiriendo el códec seleccionado por el usuario cuando ambos dispositivos lo admiten.
Como resultado de la negociación, el códec de vídeo utilizado por la pareja puede diferir del códec preferido para el proyecto.
Configuración del códec de vídeo preferido a través del SDK
La API de códecs de vídeo preferidos por el editor le ofrece un control detallado sobre cómo códecs de vídeo durante la negociación de la sesión. Con esta API, puede:
- Especifique una lista de prioridad personalizada de códecs para influir en la negociación.
- Delegar la priorización al SDK en modo automático.
- Confíe en los valores predeterminados de la configuración de su proyecto si no establece nada.
Nota: Esta API no restringe los códecs que se pueden negociar. Incluso
si establece una lista de preferencias, se pueden seguir utilizando otros códecs si es necesario, pero
se considerarán con menor prioridad.
SDK web
export type VideoCodec = 'vp8' | 'vp9' | 'h264';
export type PreferredVideoCodecs = 'automatic' | [VideoCodec, ...VideoCodec[]];
// Default (omitted)
OT.initPublisher('div', {});
// Automatic mode
OT.initPublisher('div', {
preferredVideoCodecs: 'automatic'
});
// Manual priority order
OT.initPublisher('div', {
preferredVideoCodecs: ['vp9', 'vp8']
});
// Invalid usage (empty list)
OT.initPublisher('div', {
preferredVideoCodecs: []
}, function (err) {
if (err) {
console.error(err.name); // 'OT_INVALID_PARAMETER'
console.error(err.message); // 'preferredVideoCodecs must be "automatic" or a non-empty array of valid codec strings'
}
});
SDK para iOS
// Manual mode
OTVideoCodecPreference *pref = [OTVideoCodecPreference manualWithCodecs:@[
@(OTVideoCodecTypeVP9),
@(OTVideoCodecTypeH264),
@(OTVideoCodecTypeVP8)
]];
OTPublisherKitSettings *settings = [[OTPublisherKitSettings alloc] init];
settings.videoCodecPreference = pref;
// Automatic mode
OTVideoCodecPreference *pref = [OTVideoCodecPreference automatic];
OTPublisherKitSettings *settings = [[OTPublisherKitSettings alloc] init];
settings.videoCodecPreference = pref;
SDK para Android
// Manual mode
PublisherKit.PreferredVideoCodecs preferredVideoCodecs =
PublisherKit.PreferredVideoCodecs.manual(
new ArrayList<PublisherKit.PreferredVideoCodecs.Codec>(
List.of(PublisherKit.PreferredVideoCodecs.Codec.VP9,
PublisherKit.PreferredVideoCodecs.Codec.H264)));
Publisher publisher = new Publisher.Builder(MainActivity.this)
.preferredVideoCodecs(preferredVideoCodecs)
.build();
// Automatic mode
PublisherKit.PreferredVideoCodecs preferredVideoCodecs =
PublisherKit.PreferredVideoCodecs.automatic();
Publisher publisher = new Publisher.Builder(MainActivity.this)
.preferredVideoCodecs(preferredVideoCodecs)
.build();
SDK para Windows
// Manual mode
var pref = new PreferredVideoCodecs(new List<PreferredVideoCodecs.Codec> {
PreferredVideoCodecs.Codec.VP9,
PreferredVideoCodecs.Codec.H264,
PreferredVideoCodecs.Codec.VP8
});
builder.PreferredVideoCodecs = pref;
// Automatic mode
builder.PreferredVideoCodecs = PreferredVideoCodecs.Automatic();
// Default (uses project settings)
builder.PreferredVideoCodecs = null;
// Invalid (throws)
try {
builder.PreferredVideoCodecs = new PreferredVideoCodecs(new List<PreferredVideoCodecs.Codec>());
} catch (ArgumentException ex) {
// "Must specify at least one codec"
}
SDK para Linux y macOS
// Manual mode: specify an ordered priority list of codecs
otc_publisher_settings* publisher_settings = otc_publisher_settings_new();
otc_video_codec_type codecs[] = {
OTC_VIDEO_CODEC_VP9,
OTC_VIDEO_CODEC_H264,
OTC_VIDEO_CODEC_VP8
};
otc_status status = otc_publisher_settings_set_preferred_video_codecs(
publisher_settings,
codecs,
sizeof(codecs) / sizeof(codecs[0])
);
otc_publisher_callbacks publisher_callbacks = {0};
struct otc_publisher* publisher =
otc_publisher_new_with_settings(&publisher_callbacks, publisher_settings);
// Done with settings object
otc_publisher_settings_delete(publisher_settings);
// Automatic mode: let the SDK choose priority automatically
otc_publisher_settings* publisher_settings = otc_publisher_settings_new();
otc_status status = otc_publisher_settings_set_preferred_video_codecs_automatic(
publisher_settings
);
otc_publisher_callbacks publisher_callbacks = {0};
struct otc_publisher* publisher =
otc_publisher_new_with_settings(&publisher_callbacks, publisher_settings);
// Done with settings object
otc_publisher_settings_delete(publisher_settings);
Es importante entender que el códec de vídeo final podría variar del códec preferido en función del resultado de la fase de negociación.
Cobertura de códecs
En las tablas siguientes se enumeran las capacidades de los códecs de vídeo en tiempo real de los terminales compatibles.
Ten en cuenta que casi todos los dispositivos son compatibles con el descodificador H.264 para la transmisión de películas, pero las tablas siguientes se centran en las capacidades del códec de vídeo en tiempo real (codificación y descodificación) de los dispositivos.
| Navegadores de escritorio | VP8 | H.264 | VP9 |
|---|---|---|---|
| Cromo | Sí | Sí | Sí |
| Firefox | Sí | Sí | Sí |
| Safari | Sí¹ | Sí | Sí² |
| Borde | Sí | Sí | Sí |
¹ VP8 está disponible en Safari 12.1+, que se entrega en macOS 10.14.4 y también está disponible para macOS 10.13.6 y 10.12.6.
² VP9 está disponible en Safari 15+ y sólo se admite en dispositivos con descodificación por hardware (como el Macbook Pro M3).
| Navegadores móviles | VP8 | H.264 | VP9 |
|---|---|---|---|
| Chrome en Android | Sí | Parcial¹ | Sí |
| Firefox en Android | Sí | Sí | Sí |
| Safari móvil | Sí² | Sí | Sí³ |
| Chrome/Firefox en iOS | - | - | Sí⁴ |
| WebView Android | Sí | Parcial⁵ | Sí |
| WebView en iOS | Sí⁶ | Sí | Sí⁷ |
¹ Chrome en Android sólo es compatible con H.264 en dispositivos que contengan los chipsets Qualcomm y Exynos y requieran Chrome 65 o superior.
² VP8 está disponible en Safari en iOS 12.2+.
VP9 está disponible en Safari 15+ y sólo se admite en dispositivos con descodificación por hardware (como el iPhone 15 Pro).
⁴ VP9 está disponible en iOS 17+ y solo es compatible con dispositivos con descodificación por hardware (como el iPhone 15 Pro).
⁵ WebView Android solo es compatible con H.264 en dispositivos que contengan los chipsets Qualcomm y Exynos y requieran Chrome 65 o superior.
⁶ VP8 está disponible en iOS 12.2+.
⁷ VP9 está disponible en iOS 15+ y solo es compatible con dispositivos con descodificación por hardware (como el iPhone 15 Pro).
| SDK nativos | VP8 | H.264 | VP9 ** |
|---|---|---|---|
| SDK de iOS (2.12+) | Sí | Sí | Sí |
| SDK de Android (2.13+) | Sí | Sí para la mayoría de los dispositivos * | Sí |
| SDK de Windows (2.13+) | Sí | Sí | Sí |
| SDK para Linux | Sí | No | Sí |
| SDK para macOS | Sí | Sí | Sí |
* Hardware H.264 es compatible con dispositivos que contengan los chipsets Qualcomm y Exynos, además de un subconjunto de chipsets HiSilicon y MediaTek. La migración a H.264 por software es compatible con Android M o superior.
** La compatibilidad con VP9 requiere 2.27+ de los SDK de cliente nativo de Vonage Video (para Android, iOS, macOS, Linux y Windows).
Nota: La compatibilidad con H264 requiere la versión 2.29+ de Vonage Client SDK para macOS.
Compatibilidad de códecs en todos los terminales
| Códec/Punto final | Cromo | Android Chrome | Firefox | Safari | Borde | WebView Android | WebView en iOS | SDK para iOS | SDK para Android | SDK para Windows | SDK para macOS | SDK para Linux |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| VP8 | ||||||||||||
| H.264 | 75% (*) | 75% (*) | 99% (*) | |||||||||
| VP9 | (**) | (**) | ||||||||||
| Vídeo escalable VP8 | ||||||||||||
| Vídeo escalable H.264 | ||||||||||||
| Vídeo escalable VP9 | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) |
* Porcentaje de dispositivos Android compatibles con el códec
** VP9 es compatible con Safari 15+ (escritorio e iOS) y WebView en iOS 15+, pero sólo en dispositivos compatibles con codificación por hardware, como el Macbook M3 y el iPhone 15 Pro.
*** VP9 es compatible con Firefox, pero el vídeo escalable no lo es. El vídeo escalable por hardware y software no es compatible con todos los dispositivos.
Detección del soporte de códecs en los clientes
No todos los dispositivos Android soportan el códec H.264, y las versiones antiguas de Safari no soportan VP8. OpenTok.js y el SDK de Android incluyen métodos para comprobar los códecs compatibles disponibles para el cliente.
Detección de códecs compatibles en el navegador
En OT.getSupportedCodecs() devuelve una Promise que se resuelve (en caso de éxito) con un objeto que tiene dos propiedades: videoDecodersun conjunto de códecs de vídeo compatibles para la descodificación, y videoEncodersun conjunto de códecs de vídeo compatibles para la codificación.
El siguiente ejemplo obtiene la lista de codecs soportados para codificar y decodificar flujos de vídeo:
(async () => {
try {
const supportedCodecs = await OT.getSupportedCodecs();
if (supportedCodecs.videoEncoders.indexOf('H264') < 0 && supportedCodecs.videoDecoders.indexOf('H264') < 0) {
// They do not support encoding or decoding H264 let's tell them to use a different browser
}
} catch(err) {
console.log(err);
}
})();
Detección de los códecs compatibles mediante el SDK de Android
En MediaUtils.SupportedCodecs.getSupportedCodecs(context) devuelve un MediaUtils.SupportedCodecs que tiene dos propiedades: videoDecoders, an ArrayList de los códecs de vídeo admitidos (definidos por el MediaUtils.VideoCodecTypclase e) para la descodificación, y videoEncoders, an ArrayList de los códecs de vídeo admitidos (definidos por el MediaUtils.VideoCodecType class) para la codificación.
El siguiente ejemplo obtiene la lista de codecs soportados para codificar y decodificar flujos de vídeo:
MediaUtils.SupportedCodecs supportedCodecs =
MediaUtils.SupportedCodecs.getSupportedCodecs(context);
if (supportedCodecs.videoEncoders.indexOf(MediaUtils.VideoCodecType.VIDEO_CODEC_H264) < 0
&& supportedCodecs.videoDecoders.indexOf(MediaUtils.VideoCodecType.VIDEO_CODEC_H264) < 0)
{
// The device does not support encoding or decoding H264.
}
Aspectos a tener en cuenta al seleccionar el códec de vídeo en tiempo real preferido
Interoperabilidad
El principal conflicto de interoperabilidad gira en torno a los dispositivos Android, las versiones antiguas de Safari y Linux. VP8 funciona en todos los dispositivos Android, tanto en Android Chrome como en el SDK de Android, pero la compatibilidad con el códec H.264 en Android no es omnipresente. Las versiones antiguas de Safari no son compatibles con el códec VP8. El SDK de Linux no es compatible con H.264.
Tamaño de la sesión
H.264, VP8 y VP9 puede funcionar bien para puntos finales en sesiones pequeñas (por ejemplo, de uno a tres participantes). Sin embargo, como H.264 no es compatible con Scalable Video, no recomendamos utilizar este códec para sesiones grandes.
Calidad de vídeo
Dado que en casi todos los extremos se utiliza la misma implementación de códec de vídeo VP8, la calidad es más o menos la misma. VP8 funciona bien a tasas de bits más bajas.
Además, Scalable Video está disponible con VP8. Scalable Video mejora significativamente la calidad de vídeo en sesiones de mayor tamaño.
La calidad de H.264 variará según el dispositivo, ya que la implementación de H.264 varía.
Además, hemos encontrado diferencias de calidad en función de la versión del sistema operativo que se ejecute en el dispositivo. La calidad de H.264 a tasas de bits más bajas no suele ser tan buena como la de VP8.
H.264 funciona bien en dispositivos iOS ya que tienen un buen soporte para la aceleración de hardware H.264. Esto reduce la carga de la CPU y mejora la duración de la batería.
VP9 ofrece una mejor calidad de vídeo que VP8 cuando funciona a la misma tasa de bits. Sin embargo, las mejoras de calidad pueden requerir una mayor carga de la CPU que VP8.
Ejemplos
A continuación se indican los códecs de vídeo recomendados en algunos ejemplos:
- En sesiones con 2-3 participantes en las que la interoperabilidad con versiones anteriores de Safari sea crítica, utiliza el códec de vídeo H.264.
- En sesiones con 2-3 participantes en las que sólo haya dispositivos iOS, utilice el códec de vídeo H.264 para aprovechar la aceleración por hardware.
- Los seminarios web y las sesiones de aula grande deben utilizar el códec VP8 para aprovechar la función de vídeo escalable.
- En las sesiones en las que la compatibilidad con todos los dispositivos Android sea fundamental, utilice el códec VP8.