Codecs de vídeo
Sobre os codecs de vídeo compatíveis com o OpenTok
A plataforma OpenTok utiliza o protocolo WebRTC e os codecs de vídeo em tempo real compatíveis com o WebRTC. Mais especificamente, a plataforma OpenTok é compatível com os codecs de vídeo VP8, VP9 e H.264.
As transmissões utilizam o codec VP8, que é compatível com todos os clientes, a menos que você defina um codec preferencial para o projeto ao qual a sessão pertence (consulte Definindo o codec de vídeo preferencial para um projeto.)
No amplo ecossistema de dispositivos e navegadores compatíveis com o OpenTok, há diferentes níveis de suporte aos codecs de vídeo em tempo real VP8, VP9 e H.264. Alguns terminais oferecem suporte a todos os codecs de vídeo, enquanto outros oferecem suporte a apenas um. Dependendo do tipo de aplicação que você estiver desenvolvendo e dos tipos de navegadores e dispositivos que seus usuários finais utilizarão, sua escolha do codec preferencial irá variar.
O que é um codec de vídeo?
Um codec de vídeo é composto por duas partes: um codificador e um decodificador. Ele pode codificar (comprimir) quadros de vídeo digital recebidos de uma webcam, transformando-os em um fluxo de dados binários que pode ser enviado por uma rede. Ele também pode receber um fluxo de dados binários e decodificá-lo (descomprimir) em um fluxo de quadros de vídeo brutos que podem ser exibidos em uma tela. O mecanismo de codificação e decodificação do vídeo é o padrão do codec e, para os fins desta página, vamos falar sobre dois dos mais populares: o VP8 e o H.264.
VP8 x H.264
O codec de vídeo em tempo real VP8 é um codec de software. Ele funciona bem em taxas de bits mais baixas e é um codec de vídeo maduro no contexto do WebRTC. Por ser um codec de software, ele pode ser instanciado quantas vezes forem necessárias pela aplicação, dentro dos limites de memória e CPU. O codec VP8 suporta o OpenTok Escalável Vídeo recurso, o que significa que funciona bem em sessões de grande porte com navegadores e dispositivos compatíveis.
O codec de vídeo em tempo real H.264 está disponível tanto na forma de hardware quanto de software, dependendo do dispositivo. Trata-se de um codec relativamente novo no contexto do WebRTC, embora tenha uma longa história no streaming de filmes e videoclipes pela internet. O suporte ao codec por hardware significa que a CPU principal do dispositivo não precisa se esforçar tanto para processar o vídeo, o que resulta em menor carga na CPU. O número de instâncias de hardware depende do dispositivo, sendo que o iOS oferece o melhor suporte. Como o H.264 é um codec novo para o WebRTC e cada dispositivo pode ter uma implementação diferente, a qualidade pode variar. Assim, o H.264 pode não apresentar um desempenho tão bom em taxas de bits mais baixas quando comparado ao VP8. O H.264 não é adequado para sessões de grande porte, uma vez que não oferece suporte ao recurso OpenTok Scalable Video.
VP9 x VP8
O codec VP9 em tempo real é um codec relativamente novo. Ele está ganhando cada vez mais suporte entre os fornecedores de navegadores e de hardware. Apesar do crescente suporte, ele ainda não tem a mesma difusão que os outros codecs.
O codec VP9, assim como o VP8, funciona bem em taxas de bits mais baixas do que o H.264. Além disso, o VP9 requer ainda menos largura de banda do que o VP8 para codificar vídeo. No entanto, as melhorias na compressão vêm acompanhadas de uma desvantagem: a codificação/decodificação exige mais recursos da CPU do que o VP8.
O codec VP9 oferece suporte a Codificação de Vídeo Escalável em sessões encaminhadas. Para mais informações, consulte Codificação de vídeo escalável VP9 para sessões roteadas.
Definindo o codec de vídeo preferencial para um projeto
Você pode definir o codec de vídeo preferencial para um projeto na página “Projeto” do seu Account da Video API. As opções válidas são VP8, H264, ou VP9, mas a aplicabilidade pode variar dependendo do tipo de sessão. Por padrão, todos os projetos vêm pré-configurados com o VP8 como codec de vídeo preferencial.
Para projetos existentes, acesse o painel de controle, selecione um projeto, vá para o Configurações do projeto, Codec de vídeo preferencial seção e clique no link no final da notificação.

Aguarde até que as novas configurações sejam aplicadas.

Em sessões encaminhadas (sessões que utilizam o OpenTok Media Router), o editor negociará com o OpenTok Media Router o codec a ser utilizado, priorizando o codec selecionado pelo usuário, desde que seja compatível com o dispositivo.
Em sessões retransmitidas, em que os clientes enviam fluxos diretamente uns aos outros, o OpenTok Media Router não participa da negociação. Cada par de emissor-assinante tenta encontrar um codec de vídeo em comum, dando preferência ao codec selecionado pelo usuário quando ele for compatível com ambos os dispositivos.
Como resultado da negociação, o codec de vídeo utilizado pelos dois pode diferir do codec preferencial definido para o projeto.
Como definir o codec de vídeo preferencial por meio do SDK
Para obter um guia completo que abranja todos os modos, comportamentos de negociação e verificação, consulte o API de codec de vídeo preferido pelo editor guia.
A API Publisher Preferred Video Codec oferece controle detalhado sobre como os codecs de vídeo são priorizados durante a negociação da sessão. Com essa API, você pode:
- Especifique uma lista personalizada de prioridades de codecs para influenciar a negociação.
- Delegue a priorização ao SDK no modo automático.
- Se você não definir nada, use os valores padrão das configurações do seu projeto.
Observação: Esta API não restringe quais codecs podem ser negociados. Mesmo que você defina uma lista de preferências, outros codecs ainda poderão ser usados, se necessário, mas serão considerados com prioridade menor.
SDK da 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 do 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 do 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 do 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 e 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 do React Native
Modo manual: especifique uma lista ordenada de prioridades dos codecs:
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: deixe que o SDK escolha a prioridade automaticamente:
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>
);
}
}
É importante entender que o codec de vídeo final pode diferir do codec preferido, dependendo do resultado da fase de negociação.
Cobertura de codecs do OpenTok
As tabelas a seguir listam os recursos de codecs de vídeo em tempo real dos terminais OpenTok compatíveis. Observe que quase todos os dispositivos oferecem suporte ao decodificador H.264 para filmes transmitidos, porém as tabelas abaixo se concentram nos recursos de codecs de vídeo em tempo real (codificação e decodificação) dos dispositivos.
| Navegadores para computador | VP8 | H.264 | VP9 |
|---|---|---|---|
| Chrome | Sim | Sim | Sim |
| Firefox | Sim | Sim | Sim |
| Safári | Sim 1 | Sim | Sim 2 |
| Borda | Sim | Sim | Sim |
| 1 O VP8 está disponível no Safari 12.1 ou versões posteriores, que vem instalado no macOS 10.14.4 e também está disponível para o macOS 10.13.6 e 10.12.6. | |||
| O VP9 2 está disponível no Safari 15 e versões posteriores e só é compatível com dispositivos que possuam decodificação por hardware (como o MacBook Pro M3). |
| Navegadores móveis | VP8 | H.264 | VP9 |
|---|---|---|---|
| Chrome no Android | Sim | Parte 1 | Sim |
| Firefox no Android | Sim | Sim | Sim |
| Safari para celular | Sim 2 | Sim | Sim 3 |
| Chrome/Firefox no iOS | Sim | Sim | Sim 4 |
| WebView para Android | Sim | Parte 5 | Sim |
| WebView no iOS | Sim 6 | Sim | Sim 7 |
| 1 O Chrome no Android é compatível com H.264 apenas em dispositivos que possuam os chipsets Qualcomm e Exynos e exijam o Chrome 65 ou versão superior | |||
| 2 O VP8 está disponível no Safari no iOS 12.2 ou versões posteriores. | |||
| O VP9 3 está disponível no Safari 15 e versões posteriores e só é compatível com dispositivos que possuam decodificação por hardware (como o iPhone 15 Pro). | |||
| O VP9 4 está disponível no iOS 17 e versões posteriores e só é compatível com dispositivos que possuam decodificação por hardware (como o iPhone 15 Pro). | |||
| 5 O WebView do Android oferece suporte ao H.264 apenas em dispositivos que possuam os chipsets Qualcomm e Exynos e exigem o Chrome 65 ou versão superior | |||
| 6 O VP8 está disponível no iOS 12.2 ou versões posteriores. | |||
| O 7 VP9 está disponível no iOS 15 ou versões posteriores e só é compatível com dispositivos que possuam decodificação por hardware (como o iPhone 15 Pro). |
| SDKs nativos | VP8 | H.264 | VP9 ** |
|---|---|---|---|
| SDK do iOS (2.12+) | Sim | Sim | Sim |
| SDK do Android (2.13+) | Sim | Sim, para a maioria dos dispositivos * | Sim |
| SDK do Windows (2.13+) | Sim | Sim | Sim |
| SDK do Linux | Sim | Não | Sim |
| SDK do macOS | Sim | Sim *** | Sim |
| * O H.264 por hardware é compatível com dispositivos que possuem os chipsets Qualcomm e Exynos, além de um subconjunto de chipsets HiSilicon e MediaTek. O recurso de fallback para o H.264 por software é compatível com o Android M ou versões posteriores. | |||
| ** O suporte ao VP9 requer a versão 2.27 ou superior dos SDKs do cliente nativo do OpenTok (para Android, iOS, macOS, Linux e Windows). | |||
| *** O suporte a H264 requer a versão 2.29 ou superior do Client SDK do OpenTok para macOS. |
Suporte a recursos de codec nos terminais da OpenTok
| Codec/Ponto final | Chrome | Android Chrome | Firefox | Safári | Borda | WebView para Android | WebView no iOS | SDK do iOS | SDK do Android | SDK do Windows | SDK do macOS | SDK do Linux |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| VP8 | ||||||||||||
| H.264 | 75% (*) | 75% (*) | 99% (*) | |||||||||
| VP9 | (**) | (**) | ||||||||||
| Vídeo escalável VP8 | ||||||||||||
| Vídeo escalável H.264 | ||||||||||||
| Vídeo escalável VP9 | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) | (***) |
* Porcentagem de dispositivos Android compatíveis com o codec ** O VP9 é compatível com o Safari 15+ (versão para desktop e iOS) e com o WebView no iOS 15+, mas apenas em dispositivos compatíveis com codificação por hardware, como o MacBook M3 e o iPhone 15 Pro. *** Para mais informações, consulte esta documentação. O VP9 é compatível com o Firefox, mas o vídeo escalável não é. A compatibilidade com vídeo escalável, tanto por hardware quanto por software, não está disponível em todos os dispositivos.
Detecção da compatibilidade com codecs nos clientes
Nem todos os dispositivos Android são compatíveis com o codec H.264, e as versões mais antigas do Safari não são compatíveis com o VP8. O OpenTok.js e o SDK do OpenTok para Android incluem métodos para verificar os codecs compatíveis disponíveis para o cliente.
Detecção de codecs compatíveis no navegador (OpenTok.js)
OT.getSupportedCodecs() O método retorna uma Promise que é resolvida (em caso de sucesso) com um objeto que possui duas propriedades: videoDecoders, uma matriz de codecs de vídeo compatíveis para decodificação, e videoEncoders, uma matriz de codecs de vídeo compatíveis para codificação.
O exemplo a seguir obtém a lista de codecs compatíveis para codificação e decodificação de fluxos 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);
}
})();
Como detectar codecs compatíveis usando o SDK do Android
MediaUtils.SupportedCodecs.getSupportedCodecs(context) retorna um MediaUtils.CodecsCompatíveis objeto que possui duas propriedades: videoDecoders, um ArrayList de codecs de vídeo compatíveis (definidos pelo MediaUtils.VideoCodecType (classe) para decodificação e videoEncoders, uma ArrayList de codecs de vídeo compatíveis (definidos pela classe MediaUtils.VideoCodecType) para codificação.
O exemplo a seguir obtém a lista de codecs compatíveis para codificação e decodificação de fluxos 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 serem considerados ao escolher seu codec de vídeo em tempo real preferido
Interoperabilidade
O principal conflito de interoperabilidade envolve dispositivos Android, versões mais antigas do Safari e o Linux. O VP8 funciona em todos os dispositivos Android, tanto no Chrome para Android quanto no SDK do OpenTok para Android, mas o suporte ao codec H.264 no Android não é universal. As versões mais antigas do Safari não oferecem suporte ao codec VP8. O SDK para Linux não oferece suporte ao H.264.
Tamanho da sessão
Os codecs H.264, VP8 e VP9 podem funcionar bem para terminais em sessões pequenas (por exemplo, de um a três participantes). No entanto, como o H.264 não oferece suporte ao Scalable Video, não recomendamos esse codec para sessões grandes.
Qualidade do vídeo
Como a mesma implementação do codec de vídeo VP8 é usada em quase todos os terminais, a qualidade é praticamente a mesma. O VP8 funciona bem em taxas de bits mais baixas. Além disso, o OpenTok Scalable Video está disponível com o VP8. O Scalable Video melhora significativamente a qualidade do vídeo em sessões com maior número de participantes.
A qualidade do H.264 varia de acordo com o dispositivo, uma vez que a implementação do H.264 difere de um para outro. Além disso, observamos diferenças na qualidade dependendo da versão do sistema operacional em execução no dispositivo. A qualidade do H.264 em taxas de bits mais baixas geralmente não é tão boa quanto a do VP8.
O H.264 funciona bem em dispositivos iOS, pois eles oferecem um bom suporte à aceleração de hardware para o H.264. Isso reduz a carga na CPU e aumenta a duração da bateria.
O VP9 oferece melhor qualidade de vídeo do que o VP8 quando operado com a mesma taxa de bits. No entanto, essas melhorias de qualidade podem exigir uma carga maior na CPU do que o VP8.
Exemplos de cenários
Aqui estão os codecs de vídeo recomendados para uso em alguns cenários de exemplo:
-
Em sessões do OpenTok com dois ou três participantes, nas quais a interoperabilidade com versões mais antigas do Safari é fundamental, utilize o codec de vídeo H.264.
-
Em sessões do OpenTok com dois ou três participantes, nas quais apenas dispositivos iOS estejam envolvidos, utilize o codec de vídeo H.264 para aproveitar a aceleração de hardware.
-
Os webinars e as sessões em salas de aula grandes devem utilizar o codec VP8 para aproveitar os benefícios do recurso de vídeo escalável do OpenTok.
-
Nas sessões do OpenTok em que a compatibilidade com todos os dispositivos Android é fundamental, utilize o codec VP8.
-
Em sessões do OpenTok com dois participantes, considere usar o codec de vídeo VP9.
Problemas conhecidos
Interconexão VP9 e SIP
O VP9 não é compatível em sessões que incluam SIP participantes. Se o VP9 for definido como o codec de vídeo preferencial para o projeto, os participantes SIP não poderão receber vídeo, embora ainda possam enviá-lo. Use o VP8 ou o H.264 para sessões que utilizem a interconexão SIP.
Os participantes do WebRTC recebem o vídeo publicado pelos participantes do SIP no formato VP8, independentemente do codec de vídeo preferencial definido para o projeto.