Códecs de vídeo

Acerca de los códecs de vídeo compatibles con OpenTok

La plataforma OpenTok utiliza el protocolo WebRTC y los códecs de vídeo en tiempo real compatibles con WebRTC. En concreto, la plataforma OpenTok es compatible con los códecs de vídeo VP8, VP9 y H.264.

Las transmisiones utilizan el códec VP8, que es compatible con todos los clientes, a menos que se establezca un códec preferido para el proyecto al que pertenece la sesión (véase Configuración del códec de vídeo preferido para un proyecto.)

En el amplio ecosistema de dispositivos y navegadores compatibles con OpenTok, existen distintos niveles de compatibilidad con los códecs de vídeo en tiempo real VP8, VP9 y H.264. Algunos terminales son compatibles con todos los códecs de vídeo, mientras que otros solo admiten uno. La elección del códec más adecuado dependerá del tipo de aplicación que estés desarrollando y de los tipos de navegadores y dispositivos que vayan a utilizar tus usuarios finales.

¿Qué es un códec de vídeo?

Un códec de vídeo consta de dos partes: un codificador y un decodificador. Puede codificar (comprimir) los fotogramas de vídeo digital procedentes de una cámara web y convertirlos en un flujo de datos binarios que se puede enviar a través de una red. También puede recibir un flujo de datos binarios y decodificarlo (descomprimirlo) para convertirlo en un flujo de fotogramas de vídeo sin procesar que se pueden mostrar en una pantalla. El mecanismo para codificar y descodificar el vídeo es el estándar del códec y, a efectos de esta página, vamos a hablar de dos de los más 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. Funciona bien a tasas de bits más bajas y es un códec de vídeo consolidado en el contexto de WebRTC. Al tratarse de un códec de software, puede instanciarse tantas veces como sea necesario para la aplicación, dentro de los límites de la memoria y la CPU. El códec VP8 es compatible con el OpenTok Escalable Vídeo función, lo que significa que funciona bien en sesiones con un gran número de usuarios, siempre que se utilicen navegadores y dispositivos compatibles.

El códec de vídeo en tiempo real H.264 está disponible tanto en formato de hardware como de software, dependiendo del dispositivo. Se trata de un códec relativamente nuevo en el contexto de WebRTC, aunque cuenta con una larga trayectoria en la transmisión de películas y vídeos a través de Internet. La compatibilidad con el códec de hardware significa que la CPU principal del dispositivo no tiene que esforzarse tanto para procesar el vídeo, lo que se traduce en una menor carga de la CPU. El número de instancias de hardware depende del dispositivo, siendo iOS el que ofrece mejor compatibilidad. 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 ofrezca un rendimiento tan bueno a velocidades de bits más bajas en comparación con VP8. H.264 no es adecuado para sesiones de gran tamaño, ya que no es compatible con la función «OpenTok Scalable Video».

VP9 frente a VP8

El códec VP9 en tiempo real es un códec relativamente nuevo. Cada vez cuenta con más compatibilidad por parte de los fabricantes de navegadores y de hardware. A pesar de esta creciente compatibilidad, aún no alcanza la omnipresencia de los demás códecs.

El códec VP9, al igual que el VP8, funciona bien a velocidades de bits más bajas que el H.264. Además, el VP9 requiere aún menos ancho de banda que el VP8 para codificar vídeo. Sin embargo, las mejoras en la compresión conllevan una desventaja: la codificación y decodificación requieren más recursos de la CPU que el VP8.

El códec VP9 es compatible con 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 un proyecto

Puedes configurar el códec de vídeo preferido para un proyecto en la página «Proyecto» de tu Account de la Video API. Las opciones válidas son VP8, H264 o VP9, aunque su aplicabilidad puede variar en función del tipo de sesión. Por defecto, todos los proyectos vienen preconfigurados con VP8 como códec de vídeo preferido.

Para los proyectos existentes, ve a la cuadro de mando, selecciona un proyecto, ve a la Configuración del proyecto, Códec de vídeo recomendado sección y haz clic en el enlace que aparece al final de la notificación.

Codec change step 1
In order to change the preferred codec, click the link marked as 'here'.

Espera a que se apliquen los nuevos ajustes.

Codec change step 2
Preferred Video Codec notification after applying changes.

En sesiones enrutadas (sesiones que utilizan el OpenTok Media Router), el editor negociará con el OpenTok Media Router el códec que se va a utilizar, dando prioridad al códec seleccionado por el usuario siempre que el dispositivo lo admita.

En sesiones retransmitidas, en la que los clientes se envían flujos directamente entre sí, el OpenTok Media Router no interviene en la negociación. Cada par de emisor y suscriptor intenta encontrar un códec de vídeo común, dando preferencia al códec seleccionado por el usuario siempre que ambos dispositivos lo admitan.

Como resultado de la negociación, el códec de vídeo utilizado por ambos puede diferir del códec preferido establecido para el proyecto.

Configuración del códec de vídeo preferido a través del SDK

Para consultar una guía completa que abarca todos los modos, el comportamiento en la negociación y la verificación, véase el API de códecs de vídeo preferidos por los editores guía.

La API «Publisher Preferred Video Codec» te ofrece un control muy preciso sobre cómo se establecen las prioridades de los códecs de vídeo durante la negociación de la sesión. Con esta API, puedes:

  • Especifica una lista personalizada de prioridades 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 limita los códecs que se pueden negociar. Aunque se establezca una lista de preferencias, se podrán seguir utilizando otros códecs si es necesario, pero se tendrán en cuenta 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 de 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 de 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);

SDK de React Native

Modo manual: especifique una lista de prioridad ordenada de códecs:

class App extends Component {
  constructor(props) {
    super(props);

    this.publisherProperties = {
      preferredVideoCodecs: ['vp9', 'vp8']
    };

    this.publisherEventHandlers = {
      streamCreated: event => {
        console.log('Publisher stream created!', event);
      },
      streamDestroyed: event => {
        console.log('Publisher stream destroyed!', event);
      }
    };
  }

  render() {
    return (
      <OTSession apiKey="your-api-key" sessionId="your-session-id" token="your-session-token">
        <OTPublisher
          properties={this.publisherProperties}
          eventHandlers={this.publisherEventHandlers}
          style={{ height: 100, width: 100 }}
        />
      </OTSession>
    );
  }
}

Modo automático: deja que el SDK elija la prioridad automáticamente:

class App extends Component {
  constructor(props) {
    super(props);

    this.publisherProperties = {
      preferredVideoCodecs: 'automatic'
    };

    this.publisherEventHandlers = {
      streamCreated: event => {
        console.log('Publisher stream created!', event);
      },
      streamDestroyed: event => {
        console.log('Publisher stream destroyed!', event);
      }
    };
  }

  render() {
    return (
      <OTSession apiKey="your-api-key" sessionId="your-session-id" token="your-session-token">
        <OTPublisher
          properties={this.publisherProperties}
          eventHandlers={this.publisherEventHandlers}
          style={{ height: 100, width: 100 }}
        />
      </OTSession>
    );
  }
}

Es importante tener en cuenta que el códec de vídeo final podría diferir del códec preferido en función del resultado de la fase de negociación.

Compatibilidad con códecs de OpenTok

En las siguientes tablas se enumeran las capacidades de los códecs de vídeo en tiempo real de los terminales OpenTok compatibles. Ten en cuenta que casi todos los dispositivos son compatibles con el decodificador H.264 para películas en streaming; sin embargo, las tablas que figuran a continuación se centran en las capacidades de los códecs de vídeo en tiempo real (codificación y decodificación) de los dispositivos.

Navegadores de escritorio VP8 H.264 VP9
Chrome
Firefox
Safari Sí 1 Sí 2
Borde
1 VP8 está disponible en Safari 12.1 o posterior, que viene incluido en macOS 10.14.4 y también está disponible para macOS 10.13.6 y 10.12.6.
2 VP9 está disponible en Safari 15 y versiones posteriores, y solo es compatible con dispositivos que cuenten con decodificación por hardware (como el MacBook Pro con chip M3).
Navegadores móviles VP8 H.264 VP9
Chrome en Android Primera parte
Firefox para Android
Safari móvil Sí 2 Sí 3
Chrome/Firefox en iOS Sí 4
WebView para Android Parte 5
WebView en iOS Sí 6 Sí 7
1. Chrome para Android solo es compatible con H.264 en dispositivos que incorporen los chipsets Qualcomm y Exynos, y requiere Chrome 65 o una versión posterior.
2 VP8 está disponible en Safari en iOS 12.2 o posterior.
3 VP9 está disponible en Safari 15 y versiones posteriores, y solo es compatible con dispositivos que cuenten con decodificación por hardware (como el iPhone 15 Pro).
4 VP9 está disponible en iOS 17 y versiones posteriores, y solo es compatible con dispositivos que cuenten con decodificación por hardware (como el iPhone 15 Pro).
5. WebView para Android solo es compatible con H.264 en dispositivos que incorporen los chipsets Qualcomm y Exynos, y requiere Chrome 65 o una versión posterior.
6 VP8 está disponible en iOS 12.2 o posterior.
7 VP9 está disponible en iOS 15 y versiones posteriores, y solo es compatible con dispositivos que cuenten con decodificación por hardware (como el iPhone 15 Pro).
SDK nativos VP8 H.264 VP9 **
SDK de iOS (2.12+)
SDK de Android (2.13+) Sí para la mayoría de los dispositivos *
SDK de Windows (2.13+)
SDK para Linux No
SDK de macOS 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 la versión 2.27 o superior de los SDK del cliente nativo de OpenTok (para Android, iOS, macOS, Linux y Windows).
*** Para que sea compatible con H264, se necesita la versión 2.29 o superior del Client SDK del cliente OpenTok para macOS.

Compatibilidad con códecs en los terminales de OpenTok

Códec/Punto final Chrome Android Chrome Firefox Safari Borde WebView para Android WebView en iOS SDK para iOS SDK de Android SDK de Windows SDK de 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 y versiones posteriores (ordenador y iOS) y con WebView en iOS 15 y versiones posteriores, pero solo en dispositivos compatibles con codificación por hardware, como el MacBook M3 y el iPhone 15 Pro. *** Para obtener más información, consulta esta documentación. Firefox es compatible con VP9, pero no con el vídeo escalable. La compatibilidad con el vídeo escalable, tanto a nivel de hardware como de software, no está disponible en todos los dispositivos.

Detección de la compatibilidad con códecs en los clientes

No todos los dispositivos Android son compatibles con el códec H.264, y las versiones anteriores de Safari no son compatibles con VP8. OpenTok.js y el SDK de OpenTok para Android incluyen métodos para comprobar los códecs compatibles disponibles para el cliente.

Detección de los códecs compatibles en el navegador (OpenTok.js)

OT.getSupportedCodecs() El método devuelve una Promise que, en caso de éxito, se resuelve con un objeto que tiene dos propiedades: videoDecoders, un array de códecs de vídeo compatibles para la decodificación, y videoEncoders, un array 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

MediaUtils.SupportedCodecs.getSupportedCodecs(context) devuelve un MediaUtils.CodecsAdmitidos objeto que tiene dos propiedades: videoDecoders, un ArrayList de códecs de vídeo compatibles (definidos por el MediaUtils.VideoCodecType (clase) para la decodificación, y videoEncoders, una ArrayList de códecs de vídeo compatibles (definidos por la clase MediaUtils.VideoCodecType) 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 que hay que tener en cuenta a la hora de elegir el códec de vídeo en tiempo real que más te convenga

Interoperabilidad

El principal problema de interoperabilidad se da en los dispositivos Android, las versiones antiguas de Safari y Linux. VP8 funciona en todos los dispositivos Android, tanto en Chrome para Android como en el SDK de OpenTok para Android, pero la compatibilidad con el códec H.264 en Android no es generalizada. Las versiones antiguas de Safari no son compatibles con el códec VP8. El SDK para Linux no es compatible con H.264.

Tamaño de la sesión

Los códecs H.264, VP8 y VP9 pueden funcionar bien en terminales para sesiones pequeñas (por ejemplo, de uno a tres participantes). Sin embargo, dado que H.264 no es compatible con el vídeo escalable, no recomendamos este códec para sesiones grandes.

Calidad de vídeo

Dado que en casi todos los terminales se utiliza la misma implementación del códec de vídeo VP8, la calidad es prácticamente la misma. VP8 funciona bien con velocidades de bits más bajas. Además, OpenTok Scalable Video está disponible con VP8. Scalable Video mejora significativamente la calidad del vídeo en sesiones con un mayor número de participantes.

La calidad del H.264 varía según el dispositivo, ya que su implementación difiere de uno a otro. Además, hemos observado diferencias de calidad en función de la versión del sistema operativo que se utilice en el dispositivo. Por lo general, la calidad del H.264 a velocidades de bits más bajas no es tan buena como la del VP8.

El formato H.264 funciona bien en los dispositivos iOS, ya que estos ofrecen una buena compatibilidad con la aceleración por hardware de H.264. Esto reduce la carga de la CPU y mejora la duración de la batería.

VP9 ofrece una calidad de vídeo superior a la de VP8 cuando se utiliza con la misma tasa de bits. No obstante, estas mejoras en la calidad pueden suponer una mayor carga para la CPU que VP8.

Ejemplos de situaciones

A continuación se indican los códecs de vídeo recomendados para algunos casos prácticos:

  • En las sesiones de OpenTok con dos o tres participantes en las que la interoperabilidad con versiones anteriores de Safari sea fundamental, utiliza el códec de vídeo H.264.

  • En las sesiones de OpenTok con dos o tres participantes en las que solo intervengan dispositivos iOS, utiliza el códec de vídeo H.264 para aprovechar la aceleración por hardware.

  • Los seminarios web y las sesiones en aulas grandes deben utilizar el códec VP8 para aprovechar la función de vídeo escalable de OpenTok.

  • En las sesiones de OpenTok en las que es fundamental que sean compatibles con todos los dispositivos Android, utiliza el códec VP8.

  • En las sesiones de OpenTok con dos participantes, te recomendamos que utilices el códec de vídeo VP9.

Problemas conocidos

Interconexión VP9 y SIP

VP9 no es compatible en sesiones que incluyan SIP participantes. Si se configura VP9 como códec de vídeo preferido para el proyecto, los participantes SIP no podrán recibir vídeo, aunque sí podrán seguir enviándolo. Utiliza VP8 o H.264 en su lugar para las sesiones que utilicen SIP Interconnect.

Los participantes de WebRTC reciben el vídeo publicado por los participantes de SIP en formato VP8, independientemente del códec de vídeo preferido que se haya establecido para el proyecto.