Envio de conteúdo ao vivo do YouTube pelo DASH

Este documento apresenta diretrizes para usar o formato de envio DASH para transmitir dados ao vivo no YouTube de um codificador. O objetivo é ajudar os fornecedores de codificadores a oferecer suporte de entrega de DASH aos produtos deles.

Noções básicas sobre DASH

A lista abaixo lista alguns recursos e atributos importantes do DASH:

  • Com base em padrões abertos.
  • Com base em HTTP. Como resultado, o DASH é compatível com a infraestrutura da Internet e pode transferir firewalls.
  • Suporta alta taxa de bits de transferência O DASH é compatível com várias sessões HTTP simultâneas e entrega de segmentos não sequencial, proporcionando maior resiliência do que os protocolos que dependem de uma única conexão TCP.
  • Entrega segura via HTTPS.
  • Entrega sem perda via HTTP e HTTPS.
  • Agnóstico de codec.
  • Compatível com arquivos MP4 com H264 e AAC, além de WebM com VP8/VP9 e Vorbis/Opus.

Especificações

Requisitos

As subseções a seguir explicam os requisitos para usar o DASH para enviar transmissões ao vivo ao YouTube.

Cronograma

O endpoint DASH do YouTube se comporta como um servidor HTTP passivo, gravando chamadas de método PUT enviadas por um codificador.

  • O endpoint DASH é compatível com conexões TCP simultâneas. É possível reutilizar as conexões de acordo com o HTTP/1.1.
  • Os segmentos de MPD e inicialização devem ser PUT dentro de três segundos do primeiro segmento de mídia. Recomendamos que você inclua o segmento de inicialização na MPD.
  • Cada segmento ou MPD precisa usar uma solicitação PUT separada. O upload de várias partes de vários segmentos não é compatível.
  • As operações PUT para segmentos de mídia podem se sobrepor a tempo para melhorar a largura de banda de upload.
  • Os segmentos podem ser fornecidos em ordem não sequencial dentro de uma janela de tempo de aproximadamente três segundos.
  • Os segmentos de MPD e inicialização precisam ser atualizados pelo menos a cada 60 segundos com availabilityStartTime e startNumber atualizados. Conforme observado acima, o segmento de inicialização pode ser incluído na MPD. Nesse caso, uma solicitação PUT pode atualizar os dois segmentos.

Estrutura do URL

Seu codificador precisa formar PUT URLs anexando uma string ao URL de base do endpoint do YouTube. Você precisa criar o endpoint de processamento do DASH usando a API YouTube Live Streaming.

O codificador pode acessar o URL base do endpoint de maneira programática por meio da API de transmissão ao vivo do YouTube. O URL base também estará visível na IU dos Eventos ao vivo do YouTube se você quiser fornecer o URL manualmente ao codificador.

A string anexada ao URL base pode conter o seguinte conjunto de caracteres ASCII:

  • Letras minúsculas: a-z
  • Letras maiúsculas: de A a Z
  • Dígitos: 0 a 9
  • Caracteres especiais: _ (sublinhado), - (hífen), . (ponto)

URLs de MPD

Além do requisito acima, o URL da MPD precisa terminar com .mpd, permitindo que o servidor do YouTube identifique facilmente a MPD.Outros URLs de segmento não podem terminar com .mpd.

Inicialização e URLs de segmento de mídia

O URL do segmento de inicialização e todos os URLs do segmento de mídia precisam terminar com .mp4 se os dados estiverem em um contêiner ISO BMFF ou com .webm se estiverem em um contêiner WebM.

Conteúdo da MPD

A MPD precisa estar completa e em conformidade com o padrão DASH. Ele precisa conter exatamente um dos elementos a seguir. Esta lista identifica elementos especificamente exigidos pelo YouTube, e o padrão DASH pode identificar elementos adicionais necessários. Os elementos são representados usando a sintaxe XPath e são consistentes com o padrão DASH.

  • /mpd:MPD/attribute::type
  • /mpd:MPD/mpd:Period
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/attribute::mimeType (video/mp4 or video/webm)
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::media
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::initialization
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::startNumber

Observe os seguintes requisitos para valores de elementos:

  • O atributo minimumUpdatePeriod do elemento <MPD> precisa ser definido como um valor igual ou menor que 60 segundos (PT60S).
  • O atributo media do elemento <SegmentTemplate> precisa especificar que os URLs de segmento de mídia são gerados usando $Number$. O atributo startNumber identifica o número que será atribuído ao primeiro segmento de mídia.

Tamanho do segmento de inicialização

O segmento de inicialização não pode ter mais de 100 KB. Normalmente, um segmento de inicialização é muito menor que isso. Se o segmento de inicialização estiver incluído na MPD, o URL de data:, que contém o segmento, não poderá ter mais de 100 KB.

Saída do codificador

O segmento de inicialização e os segmentos de mídia precisam constituir um fluxo de arquivos ISO BMFF ou WebM multiplexados com GOPs fechados (grupos de imagens).

  • O tamanho do GOP precisa ser de aproximadamente dois segundos e menos de oito segundos.
  • O stream multiplexado precisa ter faixas de áudio e vídeo.

Práticas recomendadas adicionais

Criptografia

O YouTube aceita criptografia de stream via HTTPS. Recomendamos que você use esse recurso.

Segmentos de inicialização em MPD

Você pode representar o segmento de inicialização diretamente na MPD usando um URL data:, de acordo com a RFC 2397 (em inglês). Isso simplifica a configuração da transmissão e reduz a possibilidade de o segmento de inicialização não corresponder ao restante da transmissão.

O XPath desse elemento é:

/mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute:data

Durações do segmento de destino

Para ter um bom desempenho de processamento e uma compensação entre a capacidade de processamento e a latência, a duração dos segmentos de mídia precisa ser entre 1 e 5 segundos.Recomendamos que você comunique a duração desejada desses segmentos na MPD usando estes dois elementos:

  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::duration
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::timescale

A duração calculada desses atributos deve estar dentro de um fator de 2 entre todas as durações de segmento reais ou o desempenho de streaming pode ser afetado.

A duração desejada para o processamento não é igual à duração da parte para a transmissão ao vivo que o YouTube produz. O YouTube transcodifica e divide novamente a entrada, e a duração do destino de saída depende de se um stream está otimizado para qualidade de streaming ou para latência.

Novas tentativas e espera exponencial

Todas as solicitações HTTP PUT devem ser executadas com um tempo limite, recomendamos definir um valor 500 milissegundos maior do que a duração do segmento.

Uma solicitação PUT do segmento de mídia que falha, seja devido ao tempo limite ou outros erros, corresponde a uma lacuna no stream de vídeo. Dessa forma, você precisa repetir qualquer solicitação usando uma espera exponencial binária aleatória:

  1. Após uma falha, aguarde um período aleatório entre [0 ... 100] milissegundos e tente fazer a solicitação novamente.
  2. Se a solicitação falhar novamente, aguarde um período aleatório entre [0 ... 200] milissegundos e tente novamente.
  3. Se a solicitação falhar novamente, aguarde um período aleatório entre [0 ... 400] milissegundos e tente novamente.
  4. etc.

Observe que falhas repetidas precisam ser sinalizadas para o operador do codificador, porque elas correspondem a uma transmissão com falha.

Códigos de resposta HTTP

As seções a seguir explicam os códigos de resposta que o YouTube retorna em resposta aos segmentos enviados pelo DASH.

200 (OK)

Uma resposta HTTP 200 (OK) indica que o servidor do YouTube recebeu uma operação esperada e a processou com sucesso.

202 (Aceito)

Uma resposta HTTP 202 (Aceito) para qualquer operação PUT ou POST indica que a operação foi inesperada e aceita para processamento adiado. No entanto, a operação deferida pode ter sucesso ou falhar, portanto a resposta não garante que o YouTube poderá processar a operação.

Essa resposta ocorre com mais frequência quando um segmento é exibido não sequencialmente. Normalmente, o YouTube pode processar corretamente o segmento aceito depois de receber os segmentos anteriores, e você não precisa reenviar o segmento.

Por exemplo, o YouTube pode retornar uma resposta 202 em qualquer um dos seguintes casos:

  • Um segmento de inicialização é recebido antes da MPD.
  • Os segmentos de mídia são recebidos antes dos segmentos de MPD e inicialização.
  • Um segmento de mídia é recebido antes de um segmento anterior, como o segmento 3 sendo recebido antes do segmento 2.

No entanto, uma resposta 202 também poderá indicar que o identificador de item está incorreto se o YouTube não puder validar totalmente o identificador após o recebimento da solicitação POST ou PUT. Por exemplo, uma das vezes que isso ocorre é quando o YouTube recebe e aceita um segmento de inicialização antes de receber a MPD, mas o segmento se torna inválido. Nesse caso, o YouTube aceita o segmento de inicialização e retorna o 202. Em seguida, ele determina se o segmento é válido quando recebe a MPD. Para evitar esse cenário específico, inclua o segmento de inicialização na MPD.

400 (Solicitação inválida)

Uma resposta HTTP 400 (Solicitação inválida) indica um dos seguintes problemas:

  • O URL não está correto
  • A postagem é muito grande (> 10 MB)
  • Não foi possível analisar a MPD
  • O segmento de inicialização na MPD está corrompido

401 (Não autorizado)

Uma resposta HTTP 401 (Não autorizado) indica que o URL de base do endpoint DASH do YouTube está corrompido ou expirou.

405 (Método não permitido)

Uma resposta HTTP 405 (Método não permitido) indica que uma solicitação diferente de POST ou PUT foi enviada.

409 (Conflito)

Uma resposta HTTP 409 (Conflito) para qualquer operação PUT ou POST indica que o YouTube não pode processar a solicitação. Por exemplo, essa resposta poderá ocorrer se o solicitante enviar vários segmentos de mídia, mas o YouTube ainda não tiver a MPD, o segmento de inicialização ou ambos. Nesse exemplo, o codificador precisa transmitir novamente os segmentos de MPD e de inicialização antes de tentar novamente a solicitação com falha.

500 (Erro interno do servidor)

Uma resposta HTTP 500 (Erro interno do servidor) indica que o servidor não conseguiu processar a solicitação. Para esse erro, recomendamos que você tente fazer a solicitação novamente com espera exponencial.

Exemplos

Sequência de URLs

A sequência de URL abaixo mostra uma série de solicitações PUT que seriam feitas para entregar conteúdo via DASH. A sequência presume que o URL base do endpoint DASH do YouTube é:

http://upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=

A sequência mostra os segmentos de MPD e inicialização enviados separadamente. No entanto, o segmento de inicialização pode ser representado diretamente na MPD, e essa prática é recomendada. Além disso, os segmentos de MPD e inicialização devem ser atualizados pelo menos a cada 60 segundos. Por fim, os URLs para esses segmentos seriam encontrados novamente nessa sequência e depois seriam seguidos por URLs para mais segmentos de mídia.

PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=dash.mpd
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=init.mp4
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media001.mp4
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media002.mp4
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media003.mp4
...

Segmentos WebM

MPD com segmento de inicialização incorporado

A amostra de MPD a seguir tem um segmento de inicialização incorporado em um URL de dados RFC 2397. Recomendamos que você incorpore o segmento de inicialização dessa maneira, em vez de enviá-lo separadamente.

Este exemplo é compatível com a ingestão de WebM (VP8 ou VP9, Opus) no YouTube. A maioria do URL de dados foi ocultada para facilitar a leitura:

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns="urn:mpeg:dash:schema:mpd:2011"
     xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd"
     type="dynamic" 
     profiles="urn:mpeg:dash:profile:isoff-live:2011" 
     minimumUpdatePeriod="PT60S"
     minBufferTime="PT12S"
     availabilityStartTime="2016-04-13T20:52:58" >
  <Period start="PT0S" id="1">
    <AdaptationSet mimeType="video/webm">
      <ContentComponent contentType="video" id="1"/>
      <SegmentTemplate timescale="1000"
           duration="2000"
           startNumber="1"
           initialization="data:video/mp4;base64,AAAAGGZ0eXBpc...AAA"
           media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media-$Number%09d$.webm"/>
      <Representation id="1" width="1920" height="1080">
        <SubRepresentation contentComponent="1"/>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

MPD

A amostra de MPD a seguir, que não tem um segmento de inicialização incorporado, também está em conformidade para a ingestão do WebM (VP8 ou VP9, Opus) no YouTube:

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns="urn:mpeg:dash:schema:mpd:2011"
     xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd"
     type="dynamic" 
     profiles="urn:mpeg:dash:profile:isoff-live:2011" 
     minimumUpdatePeriod="PT60S"
     minBufferTime="PT12S"
     availabilityStartTime="2016-04-13T20:52:58" >
  <Period start="PT0S" id="1">
    <AdaptationSet mimeType="video/webm">
      <ContentComponent contentType="video" id="1"/>
      <SegmentTemplate timescale="1000"
           duration="2000"
           startNumber="1"
           initialization="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=init.webm"
           media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media-$Number%09d$.webm"/>
      <Representation id="1" width="1920" height="1080">
        <SubRepresentation contentComponent="1"/>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

Inicialização

Veja a seguir o layout de um segmento de amostra de inicialização do WebM. Ele consiste na parte do stream WebM até, mas não incluindo o primeiro cluster.

Mídia

Veja abaixo o layout de um segmento de mídia de amostra da WebM. Ele consiste em um único cluster WebM. Assim como em um stream BMFF ISO, o segmento de inicialização anexado a uma série de clusters precisa produzir um stream WebM válido.

Segmentos BMFF ISO

MPD com segmento de inicialização incorporado

A amostra de MPD a seguir tem um segmento de inicialização incorporado em um URL de dados RFC 2397. Recomendamos que você incorpore o segmento de inicialização dessa maneira, em vez de enviá-lo separadamente.

Este exemplo é compatível com a ingestão de BMFF ISO (H.264, AAC) para o YouTube. A maioria do URL de dados foi ocultada para facilitar a leitura:

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="urn:mpeg:dash:schema:mpd:2011"   
    xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" 
    type="dynamic"
    minimumUpdatePeriod="PT30S" 
    availabilityStartTime="2016-05-04T20:47:25" 
    minBufferTime="PT12S" 
    profiles="urn:mpeg:dash:profile:isoff-live:2011">
  <Period start="PT0S" id="1">
    <AdaptationSet mimeType="video/mp4" codecs="avc1.4d401e,mp4a.40.2">
      <ContentComponent contentType="video" id="1"/>
      <ContentComponent contentType="audio" id="2"/>
      <SegmentTemplate timescale="600"
             media="/dash_upload?cid=ug50-xg26-cbc1-2p0h&staging=1&copy=0&file=media$Number%09d$.mp4"
             initialization="data:video/mp4;base64,AAAAGGZ0eXBpc281AA...AA"
             duration="306"
             startNumber="1"/>
      <Representation id="1" width="640" height="360" bandwidth="526952">
        <SubRepresentation contentComponent="1" bandwidth="526952" 
codecs="avc1.4d401e"/>
        <SubRepresentation contentComponent="2" bandwidth="125584" codecs="mp4a.40.2"/>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

MPD

O exemplo de MPD a seguir, que não tem um segmento de inicialização incorporado, também está em conformidade com o processamento ISO BMFF (H.264, AAC) para o YouTube:

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns="urn:mpeg:dash:schema:mpd:2011"
     xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd"
     type="dynamic"
     profiles="urn:mpeg:dash:profile:isoff-live:2011"
     minimumUpdatePeriod="PT60S" 
     minBufferTime="PT12S"
     availabilityStartTime="2016-04-13T20:51:31" >
  <Period start="PT0S" id="1">
    <AdaptationSet mimeType="video/mp4" codecs="avc1.4d401e,mp4a.40.2">
      <ContentComponent contentType="video" id="1"/>
      <ContentComponent contentType="audio" id="2"/>
      <SegmentTemplate timescale="600"
           duration="1200"
           startNumber="1"
           initialization="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=init.mp4"
           media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media$Number%09d$.mp4"/>
      <Representation id="1" width="640" height="360" bandwidth="526952">
        <SubRepresentation contentComponent="1" bandwidth="526952" codecs="avc1.4d401e"/>
        <SubRepresentation contentComponent="2" bandwidth="125584" codecs="mp4a.40.2"/>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

Inicialização

O diagrama a seguir mostra o layout de um segmento de amostra ISO BMFF multiplexado de amostra. O YouTube não usa necessariamente os átomos, mas este é um exemplo de conformidade. Especificamente, as faixas de áudio e vídeo são representadas.

Mídia

O diagrama a seguir mostra o layout de um segmento de mídia de amostra ISO BMFF multiplexado. O YouTube não usa necessariamente todos os átomos, mas este é um exemplo de conformidade. Especificamente, as faixas de áudio e vídeo são representadas. Uma série desses segmentos pode ser anexada a um segmento de inicialização para produzir um stream BMFF ISO válido e multiplexado.

Limitações conhecidas

Ingestões de RTMP e DASH

Não é possível combinar processamentos RTMP e DASH com o YouTube.Isso se aplica a alternar entre os dois métodos durante uma transmissão, assim como a usar um como método de processamento principal e o outro para a de backup.