Protocolos de streaming do player receptor da Web

O SDK do receptor da Web oferece suporte a três tipos de protocolos de streaming atuais:

DASH; HTTP Live Streaming e Smooth Streaming.

Neste documento, listamos nosso suporte para cada um dos protocolos de streaming. Observação a explicação das tags suportadas para cada protocolo está bem abreviada em comparação com a especificação detalhada do protocolo. O objetivo é fornecer visão geral e compreensão de como usar cada protocolo e de quais recursos do protocolo são compatíveis com dispositivos compatíveis com Cast para exibir as experiências de streaming.

Dynamic Adaptive Streaming over HTTP (DASH)

da ISO especificação detalhada do DASH (link em inglês).

O DASH é um protocolo de streaming com taxa de bits adaptável que permite vídeos de alta qualidade streaming por meio de servidores HTTP(S). Um manifesto, composto em XML, contém a maior parte das informações de metadados sobre como inicializar e baixar o vídeo conteúdo. Os principais conceitos compatíveis com o player do receptor da Web são <Period>, <AdaptationSet>, <Representation> e <SegmentTemplate>. <SegmentList>, <BaseUrl> e <ContentProtection>.

Um manifesto DASH começa com uma tag raiz <MPD> e, dentro dele, inclui uma ou mais tags <Period>, que representam um conteúdo de streaming. As tags <Period> permitem ordenar diferentes partes do conteúdo de streaming e são frequentemente usados para separar o conteúdo principal e a publicidade ou vários conteúdos de vídeo consecutivos.

Um <AdaptationSet> em <MPD> é um conjunto de representações para um tipo de stream de mídia, na maioria dos casos, vídeo, áudio ou legendas. A maior os tipos MIME comumente aceitos são "video/mp4", "audio/mp4" e "text/vtt". Um opcional <ContentComponent contentType="$TYPE$"> podem ser incluídos abaixo de <AdaptationSet>.

Dentro de cada <AdaptationSet>, deve haver uma lista de tags <Representation>. estar presente, e o player do receptor da Web usa as informações de codecs para inicializa o buffer de origem do MSE e as informações do bandwidth para escolher automaticamente a representação/taxa de bits certa para reproduzir.

Para cada <Representation>, os segmentos de mídia são descritos usando: <BaseURL> para representação de segmento único, <SegmentList> para lista de segmentos (semelhante a HLS) ou <SegmentTemplate>.

Para uma <SegmentTemplate>, ela indica como o segmento de inicialização e os segmentos de mídia podem ser representados por modelos. No exemplo abaixo $Number$ indica o número do segmento conforme disponível a partir da CDN. Então, é traduzido para seg1.m4s, seg2.m4s etc. à medida que a reprodução continua.

<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:ns2="http://www.w3.org/1999/xlink"
  profiles="urn:mpeg:dash:profile:isoff-live:2011,http://dashif.org/guidelines/dash264" type="static"
  publishTime="2016-10-05T22:07:14.859Z" mediaPresentationDuration="P1DT0H0M0.000S" minBufferTime="P0DT0H0M7.500S">
  <Period id="P0">
    <AdaptationSet lang="en" segmentAlignment="true">
      <ContentComponent id="1" contentType="audio"/>
      <SegmentTemplate media="seg$Number$.m4s" initialization="seginit.mp4"
        duration="10000" startNumber="1" timescale="1000" presentationTimeOffset="0"/>
      <Representation id="1" bandwidth="150123" audioSamplingRate="44100"
        mimeType="audio/mp4" codecs="mp4a.40.2" startWithSAP="1">
        <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
        <BaseURL>http://www.google.com/testVideo</BaseURL>
      </Representation>
    </AdaptationSet>
    <AdaptationSet segmentAlignment="true">
      <ContentComponent id="1" contentType="video"/>
      <SegmentTemplate media="seg$Number$.m4s" initialization="seginit.mp4"
        duration="10000" startNumber="1" timescale="1000" presentationTimeOffset="0"/>
      <Representation id="1" bandwidth="212191" width="384" height="208" sar="26:27"
        frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
        <BaseURL>http://www.google.com/testVideo/bitrate1/</BaseURL>
      </Representation>
      <Representation id="1" bandwidth="366954" width="512" height="288" sar="1:1"
        frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
        <BaseURL>http://www.google.com/testVideo/bitrate2/</BaseURL>
      </Representation>
      <Representation id="1" bandwidth="673914" width="640" height="352" sar="44:45"
        frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
        <BaseURL>http://www.google.com/testVideo/bitrate3/</BaseURL>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

Para uma <SegmentTemplate>, é comum usar a tag <SegmentTimeline> para indicam quanto tempo cada segmento tem e quais segmentos se repetem. Uma timescale (unidades para representar um segundo) é frequentemente incluído como parte dos atributos do <SegmentTemplate> para que possamos calcular o tempo do segmento com base em nesta unidade. No exemplo abaixo, a tag <S> significa uma tag de segmento, a O atributo d especifica o comprimento do segmento e o atributo r especifica quantos segmentos da mesma duração se repetem para que $Time$ pode ser calculado corretamente para fazer o download do segmento de mídia conforme especificado no o atributo media.

<SegmentTemplate>
  timescale="48000"
  initialization="$RepresentationID$-init.dash"
  media="$RepresentationID$-$Time$.dash"
    startNumber="1">
    <SegmentTimeline>
      <S t="0" d="96256" r="2" />
      <S d="95232" />
      <S d="96256" r="2" />
      <S d="95232" />
      <S d="96256" r="2" />
   </SegmentTimeline>
</SegmentTemplate>

Confira um exemplo de representação usando <SegmentList>:

<Representation id="FirstRep" bandwidth="2000000" width="1280"
  height="720">
  <BaseURL>FirstRep/</BaseURL>
  <SegmentList timescale="90000" duration="270000">
     <RepresentationIndex sourceURL="representation-index.sidx"/>
     <SegmentURL media="seg-1.ts"/>
     <SegmentURL media="seg-2.ts"/>
     <SegmentURL media="seg-3.ts"/>
  </SegmentList>
</Representation>

Para um único arquivo de segmento, um <SegmentBase> é frequentemente usado com bytes para especificar qual parte de um arquivo <BaseURL> contém as índice, e o restante pode ser buscado sob demanda enquanto a reprodução continua ou uma busca acontece. Aqui, o intervalo Initialization especifica o intervalo de metadados init. e indexRange especifica o índice dos segmentos de mídia. Observe que no momento só aceitamos intervalos de bytes consecutivos.

<Representation bandwidth="4190760" codecs="avc1.640028"
  height="1080" id="1" mimeType="video/mp4" width="1920">
  <BaseURL>video.mp4<BaseURL>
  <SegmentBase indexRange="674-1149">
    <Initialization range="0-673" />
  </SegmentBase>
</Representation>

Independentemente de qual representação for usada, se os streams estiverem protegidos, uma A seção <ContentProtection> pode aparecer em <AdaptationSet>, em que um schemeIdUri identifica exclusivamente o sistema de DRM a ser usado. Um ID de chave opcional pode ser incluído para criptografia comum.

<!-- Common Encryption -->
<ContentProtection
  schemeIdUri="urn:mpeg:dash:mp4protection:2011"
  value="cenc"
  cenc:default_KID="7D2714D0-552D-41F5-AD56-8DD9592FF891">
</ContentProtection>

<!-- Widevine -->
<ContentProtection
  schemeIdUri="urn:uuid:EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED">
</ContentProtection>

Para mais exemplos e detalhes, consulte a especificação MPEG-DASH. Veja abaixo uma lista de atributos DASH adicionais em tags não mencionadas acima atualmente compatíveis:

Nome do atributo Função de atributo
mediaPresentationDuration A duração do conteúdo do vídeo.
minimumUpdatePeriod Atributo da tag <MPD>. especifica com que frequência precisamos para recarregar o manifesto.
tipo Atributo da tag <MPD>. "dinâmico" para indicar que esta é uma transmissão ao vivo.
presentationTimeOffset Atributo da tag <SegmentBase>; especifica diferença de horário da apresentação em relação ao início do período.
startNumber Especifica o número do primeiro segmento de mídia em uma apresentação em um período Isso é muito usado em transmissões ao vivo.

Também aceitamos o reconhecimento da caixa EMSG dentro de fragmentos MP4 para DASH e fornecem um EmsgEvent aos desenvolvedores.

Embora nosso player de receptor da Web atual ofereça suporte aos principais casos de uso de DASH, aqui é uma lista de atributos comuns que nossa implementação atual de DASH ignora ou não usa. Isso significa que, independentemente de o manifesto conter ou não elas não afetam a experiência de reprodução do conteúdo.

  • availabilityStartTime
  • segmentAlignment

HTTP Live Streaming (HLS)

A visão geral e as especificações completas da transmissão HTTP ao vivo estão disponíveis aqui.

Um dos pontos fortes do player do receptor da Web é sua capacidade de dar suporte reprodução de HLS em MSE. Diferente do DASH, em que um manifesto vem em um único o HLS envia a playlist master com uma lista de todos os streams de variantes pelos respectivos URLs. A playlist de variantes é a de mídia. Os dois as principais tags HLS compatíveis com o player do receptor da Web no playlist são:

Nome da tag Funcionalidade
#EXT-X-STREAM-INF Especifica um stream de taxa de bits/variante. O atributo BANDWIDTH é necessário, que oferece suporte à seleção de streaming de taxa de bits adaptável. A O atributo CODECS é altamente recomendado para inicializar o EQM, como como "avc1.42c01e,mp4a.40.2". Se não for especificado, o padrão será Definido como vídeo H264 do perfil principal 3.0 e áudio "mp4a.40.2" codificado conteúdo.
#EXT-X-MEDIA Especifica a playlist de mídia adicional (no atributo URI) que representa o conteúdo. Geralmente, são fluxos de áudio alternativos em outras (som surround 5.1) ou idioma. Um atributo de TYPE contendo VIDEO, AUDIO, SUBTITLES ou CLOSED-CAPTIONS são permitidos. Ambiente o atributo DEFAULT a YES indica a escolha esse stream alternativo por padrão.

Veja uma lista de tags HLS atualmente compatíveis com o Web Receiver Player a playlist de mídia:

Nome da tag Funcionalidade
#EXTINF Informações da transmissão, geralmente seguidas pela duração do segmento em segundos e, na linha seguinte, o URL do segmento.
#EXT-X-TARGETDURATION Quantos segundos tem a duração de cada segmento. Isso também determina quantas vezes faça o download/atualize o manifesto da playlist de uma transmissão ao vivo; O receptor da Web O player não suporta durações menores que 0,1 segundo.
#EXT-X-MEDIA-SEQUENCE O número de sequência (geralmente em uma transmissão ao vivo) em que o primeiro segmento que esta lista de reprodução representa.
#EXT-X-KEY Informações da chave DRM. O atributo METHOD informa qual chave que um sistema usa. Hoje, oferecemos suporte a AES-128 e SAMPLE-AES ,
#EXT-X-BYTERANGE O intervalo de bytes a buscar para um URL de segmento.
#EXT-X-DISCONTINUITY Especifica uma descontinuidade entre segmentos consecutivos. Isso é muito comum com a inserção de anúncios do lado do servidor, em que um segmento de anúncio aparece no meio do stream principal.
#EXT-X-PROGRAM-DATE-TIME Tempo absoluto da primeira amostra do próximo segmento, por exemplo &quot;2016-09-21T23:23:52.066Z&quot;.
#EXT-X-ENDLIST Não importa se é um VOD ou uma transmissão ao vivo.

Para a transmissão ao vivo, usamos #EXT-X-PROGRAM-DATE-TIME e #EXT-X-MEDIA-SEQUENCE. como os principais fatores para determinar como mesclar um manifesto recém-atualizado. Se presente, o #EXT-X-PROGRAM-DATE-TIME é usado para corresponder aos segmentos atualizados. Caso contrário, o número #EXT-X-MEDIA-SEQUENCE será usado. De acordo com o especificação HLS, não usamos a comparação de nomes de arquivos para correspondência.

Nossa implementação de HLS permite selecionar um stream de áudio alternativo, como Som surround 5.1, como a reprodução de áudio principal. Para isso, uma tag #EXT-X-MEDIA com os codecs alternativos, além de fornecer o formato do segmento na configuração do stream

O player do receptor da Web espera determinado comportamento de acordo com a especificação. Por exemplo, depois que um #EXT-INF, esperamos um URI. Se não for um URI, por exemplo, um #EXT-X-DISCOUNTINUITY vai causar uma falha na análise da playlist.

A cada #EXT-X-TARGETDURATION segundos, recarregamos a playlist/manifesto para novas listas de segmentos e atualizaremos a nova representação interna de todos os para o novo. Sempre que uma busca é solicitada, buscamos apenas dentro de o intervalo pesquisável. Para transmissões ao vivo, permitimos a busca somente a partir do início do lista mais recente até uma duração de três metas do final. Por exemplo, se você tiver uma lista de 10 segmentos e estiver no segmento 6, poderá buscar somente como 7, mas não 8.

Suporte ao formato do segmento

O SDK do CAF oferece suporte à reprodução de conteúdo enviado em vários formatos, conforme mencionado. em HlsSegmentFormat para áudio e HlsVideoSegmentFormat para vídeo. Isso inclui suporte para pacote de áudio como reprodução AAC e AC3, com ou sem criptografia. É obrigatório para especificar essas informações no MediaInformation do LoadRequestData para descrever corretamente seu conteúdo ao player. Se não for especificado, o configuração padrão do player tentará reproduzir o conteúdo como Transport Transmitir conteúdo empacotado. Essa propriedade pode ser definida por qualquer um dos remetentes no dados de solicitação de carregamento (Android, iOS e Web) ou dentro do destinatário por interceptadores de mensagens.

Conferir o exemplo de código snippet abaixo ou Como carregar mídia usando contentId, contentUrl e entity para mais informações sobre como preparar conteúdo no receptor da Web.

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      ...
      // Specify segment format for an HLS stream playing CMAF packaged content.
      loadRequestData.media.contentType = 'application/x-mpegurl';
      loadRequestData.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.FMP4;
      loadRequestData.media.hlsVideoSegmentFormat = cast.framework.messages.HlsVideoSegmentFormat.FMP4;
      ...
      return loadRequestData;
    });

Proteção de conteúdo

Conforme listado na seção de tag #EXT-X-KEY acima, o SDK do Cast é compatível com SAMPLE-AES ou SAMPLE-AES-CTR, em que um URI para a chave um vetor de inicialização podem ser especificadas:

EXT-X-KEY: METHOD=SAMPLE-AES, \
URI="data:text/plain;base64,XXXXXX", \
IV=0x6df49213a781e338628d0e9c812d328e, \
KEYFORMAT="com.widevine", \
KEYFORMATVERSIONS="1"

O KEYFORMAT com suporte agora é Widevine, e o URI contém um Informações de DRM codificadas em BASE64 XXXXXXX que, quando decodificadas, contêm o ID da chave:

{
   "content_id": "MTQ1NjkzNzM1NDgxNA==",
   "key_ids": [
      "xxxxxxxxxxxxxxxx"
   ]
}

A versão 1 define os seguintes atributos:

Atributo Exemplo Descrição
KEYFORMATVERSIONS "1" Esta proposta define a versão 1 do formato chave
KEYFORMAT "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" O UUID é o UUID de Widevine de DASH IF IOP. A mesma string é usada na MPD com streams criptografados Widevine.
URI "data:text/plain;base64, <base64 encoded PSSH box>" URI do fluxo que contém o tipo de dados e a caixa PSSH.
METHOD SAMPLE-AES-CTR Indica a cifra usada ao criptografar o conteúdo. O SAMPLE-AES sinaliza que o conteúdo está criptografado usando "cbcs". SAMPLE-AES-CTR indica que o conteúdo é criptografado usando um dos esquemas de proteção AES-CTR, ou seja, "cenc".

Atributos mapeados para DASH MPD:

Atributo Descrição
KEYFORMAT O atributo schemeIdUri do elemento ContentProtection.
URI O conteúdo do elemento cenc:pssh.
KEYID String hexadecimal de 16 bytes que codifica o ID da chave, que tem a mesma função que o default_kid no MPEG DASH. Se estiver usando um esquema de chaves hierárquicas, este seria o "raiz" de dados.

Exemplo de playlist HLS com sinalização V2:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:2
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MAP:URI="init_segment.mp4"
#EXTINF:1.001,
output_video-1.mp4
#EXT-X-DISCONTINUITY
#EXT-X-KEY:METHOD=SAMPLE-AES,URI="data:text/plain;base64,AAAAPXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAB0aDXdpZGV2aW5lX3Rlc3QiDHRlc3QgY29udGVudA==",KEYID=0x112233445566778899001122334455,KEYFORMAT="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed",KEYFORMATVERSION="1"
#EXTINF:1.001,
output_video-2.mp4
#EXTINF:0.734,
output_video-3.mp4
#EXT-X-ENDLIST

Confira abaixo uma lista de recursos e tags em HLS que não usamos ou suporte. A presença ou ausência deles não afeta o comportamento do streaming.

  • O atributo RESOLUTION= em #EXT-X-STREAM-INF é ignorado.
  • O atributo AUTOSELECT= em #EXT-X-MEDIA não é usado. Em vez disso, contamos com DEFAULT=
  • #EXT-X-I-FRAME-STREAM-INF na playlist master foi ignorado.
  • #EXT-X-DISCONTINUITY-SEQUENCE foi ignorado
  • #EXT-X-PLAYLIST-TYPE:EVENT pode estar presente em uma transmissão ao vivo e #EXT-X-PLAYLIST-TYPE:VOD podem estar presentes em um stream de VOD, mas atualmente nosso O player do receptor da Web depende apenas da existência de #EXT-X-ENDLIST para determinar transmissões ao vivo x VOD.

Streaming sem falhas

Oficial da Microsoft Especificações de Smooth Streaming.

O streaming suave fornece protocolo de streaming adaptável e especificação XML por HTTP (semelhante ao DASH). Diferente do DASH, o Smooth Streaming recomenda apenas pacotes MPEG-4 para os segmentos de mídia.

Esta é uma tabela das tags e dos atributos mais comuns no Smooth Streaming que que o Web Receiver Player suporta atualmente. Muitos conceitos já foram explicados na seção DASH acima.

Tag/atributo Uso
&lt;SmoothStreamingMedia&gt; Tag principal do manifesto, contém atributos de:
  • TimeScale: número de unidades para representar um segundo, normalmente incremento de 10.000.000.
  • Duração: duração do conteúdo em escala temporal. O player do receptor da Web não aceitam durações menores que 0,1 segundo.
  • IsLive: indica se o manifesto é uma mídia ativa.
&lt;StreamIndex&gt; Um conjunto de streams, semelhante ao AdaptationSet do DASH. O tipo geralmente é "texto", "vídeo" ou "áudio". O atributo Url geralmente contém um URL URL de fragmento usando informações como taxa de bits ou horário de início.
&lt;QualityLevel&gt; Cada tag QualityLevel especifica sua taxa de bits e um codec FourCC. O FourCC normalmente são "H264", "AVC1", "AACL" etc. Para vídeos, ele especifica seu por meio de MaxWidth e MaxHeight. Para áudio, especifica seu (como 44100) por meio da taxa de amostragem e do número de canais.
&lt;c&gt; Elemento de fragmento de stream. Contém:
  • d: a duração de um fragmento.
  • t: tempo de mídia do fragmento.
&lt;Protection&gt; Uma tag com o atributo opcional SystemID que lista o ID do sistema. DRM para usar em <SmoothStreamingMedia> tag.
&lt;ProtectionHeader&gt; Em <Protection>, pode conter um atributo de SystemID e uma geralmente codificados em Base64. Para Widevine, ele conterá o ID da chave, a chave comprimento, o ID do algoritmo, como AESCTR, LA_URL (URL de aquisição da licença), LUI_URL (URL da interface do usuário da licença) e DS_ID (ID de serviço de domínio).

Proteção de conteúdo

Para codificar corretamente os IDs do sistema de proteção, use o mapeamento abaixo:

  • WIDEVINE: "EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED",
  • CLEARKEY: '1077EFEC-C0B2-4D02-ACE3-3C1E52E2FB4B',
  • MPEG_DASH_MP4PROTECTION: "URN:MPEG:DASH:MP4PROTECTION:2011"

Para <ProtectionHeader>, confira abaixo um exemplo com dados codificados em Base64. A os dados, quando decodificados, estão em conformidade com o mesmo formato decodificado, conforme descrito nas Suporte à proteção de conteúdo do DASH acima.

<Protection>
  <ProtectionHeader SystemID="9a04f079-9840-4286-ab92-e65be0885f95">
    $BASE64ENCODED_DATA
  </ProtectionHeader>
</Protection>

Confira abaixo um exemplo de manifesto de transmissão ao vivo Smooth com 3.000 segundos duração do conteúdo:

<?xml version="1.0"?>
  <SmoothStreamingMedia MajorVersion="2" MinorVersion="0" Duration="3000000000"
    TimeScale="10000000" IsLive="TRUE" LookAheadFragmentCount="2" DVRWindowLength="600000000" CanSeek="TRUE" CanPause="TRUE">
    <StreamIndex Type="text" Name="textstream301_swe" Language="swe" Subtype="CAPT" Chunks="0"
      TimeScale="10000000" Url="QualityLevels({bitrate})/Fragments(textstream301_swe={start time})">
      <QualityLevel Index="0" Bitrate="20000" CodecPrivateData="" FourCC="DFXP"/>
        <c d="40000000" t="80649382288125"/>
        <c d="39980000"/>
        <c d="40020000"/>
    </StreamIndex>
    <Protection>
      <ProtectionHeader> SystemID="$BASE64ENCODEDDRMDATA$"</ProtectionHeader>
    </Protection>
    <StreamIndex Type="audio" Name="audio101_eng" Language="eng" Subtype="AACL" Chunks="0"
      TimeScale="10000000" Url="QualityLevels({bitrate})/Fragments(audio101_eng={start time})">
      <QualityLevel Index="0" Bitrate="128000" CodecPrivateData="1290" FourCC="AACL" AudioTag="255"
        Channels="2" SamplingRate="32000" BitsPerSample="16" PacketSize="4"/>
      <c d="40000000" t="80649401327500"/>
      <c d="40000000"/>
      <c d="40000000"/>
    </StreamIndex>
    <StreamIndex Type="video" Name="video" Subtype="AVC1" Chunks="0" TimeScale="10000000"
      Url="QualityLevels({bitrate})/Fragments(video={start time})">
      <QualityLevel Index="0" Bitrate="400000" CodecPrivateData="000000016742E01596540C0EFCB808140000000168CE3880"
        FourCC="AVC1" MaxWidth="384" MaxHeight="216"/>
      <QualityLevel Index="1" Bitrate="800000" CodecPrivateData="00000001674D401E965281004B6020500000000168EF3880"
        FourCC="AVC1" MaxWidth="512" MaxHeight="288"/>
      <QualityLevel Index="2" Bitrate="1600000" CodecPrivateData="00000001674D401E965281B07BCDE020500000000168EF3880"
        FourCC="AVC1" MaxWidth="854" MaxHeight="480"/>
      <QualityLevel Index="3" Bitrate="2200000" CodecPrivateData="00000001674D401F96528080093602050000000168EF3880"
        FourCC="AVC1" MaxWidth="1024" MaxHeight="576"/>
      <c d="40000000" t="80649401378125"/>
      <c d="40000000"/>
      <c d="40000000"/>
    </StreamIndex>
  </SmoothStreamingMedia>

No exemplo de stream de vídeo acima, o modelo de URL é:

QualityLevels({bitrate})/Fragments(video={start time})

Assim, os dois primeiros segmentos (supondo que estejamos no nível de qualidade do índice 2) serão a seguir, com tempo inicial extraído de t="80649401378125" na seção StreamIndex de vídeo e o incremento de tempo de 4 segundos * 10.000.000 por segmento:

QualityLevels(2)/Fragments(video=80649401378125)
QualityLevels(2)/Fragments(video=80649441378125)
...

Aqui está uma lista dos atributos de Smooth Streaming que ignoramos e temos atualmente. nenhum efeito nas experiências de streaming, independentemente de serem fornecidas:

  • CanSeek e CanPause na tag <SmoothStreamingMedia>.
  • Chunks e QualityLevels na tag <StreamIndex>. Em vez disso, calculamos o número de segmentos e o número de níveis de qualidade com base em informações fornecidos no <StreamIndex>, como a tag QualityLevel real e o <c>.
  • BitsPerSample e PacketSize em <QualityLevel> não são usados.
.

Verificar o tipo de visor

O canDisplayType verifica os recursos de vídeo e áudio do dispositivo receptor da Web e exibição validando os parâmetros de mídia passados, retornando um booleano. Todos , mas o primeiro é opcional. Quanto mais parâmetros incluir, mais precisa será a verificação.

Sua assinatura é canDisplayType(<em>mimeType</em>,<em>codecs</em>,<em>width</em>,<em>height</em>,<em>framerate</em>)

Exemplos:

Verifica se o dispositivo receptor da Web e a tela são compatíveis com arquivos de vídeo/mp4 mimetype com este codec, dimensões e frame rate específicos:

canDisplayType("video/mp4", "avc1.42e015,mp4a.40.5", 1920, 1080, 30)

Verifica se o dispositivo receptor da Web e a tela oferecem suporte ao formato de vídeo 4K para este codec especificando a largura de 3840 e a altura de 2160:

canDisplayType("video/mp4", "hev1.1.2.L150", 3840, 2160)

Verifica se o dispositivo receptor da Web e a tela oferecem suporte a HDR10 para o codec e frame rate:

canDisplayType("video/mp4", "hev1.2.6.L150", 3840, 2160, 30)

Verifica se o dispositivo e a tela receptores da Web oferecem suporte a Dolby Vision (DV) para codec, dimensões e frame rate:

canDisplayType("video/mp4", "dvhe.04.06", 1920, 1080, 30)

DRM

Alguns conteúdos de mídia exigem o Gerenciamento de direitos digitais (DRM). Para conteúdo de mídia com a licença de DRM (e o URL da chave) armazenada no manifesto (DASH ou HLS), o SDK do Cast lida com esse caso para você. Um subconjunto desse conteúdo requer uma licenseUrl que é necessária para conseguir a chave de descriptografia. No receptor da Web, é possível usar PlaybackConfig para definir o licenseUrl conforme necessário.

O snippet de código a seguir mostra como definir informações de solicitação de licença solicitações, como withCredentials:

const context = cast.framework.CastReceiverContext.getInstance();
const playbackConfig = new cast.framework.PlaybackConfig();
// Customize the license url for playback
playbackConfig.licenseUrl = 'http://widevine/yourLicenseServer';
playbackConfig.protectionSystem = cast.framework.ContentProtection.WIDEVINE;
playbackConfig.licenseRequestHandler = requestInfo => {
  requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});

// Update playback config licenseUrl according to provided value in load request.
context.getPlayerManager().setMediaPlaybackInfoHandler((loadRequest, playbackConfig) => {
  if (loadRequest.media.customData && loadRequest.media.customData.licenseUrl) {
    playbackConfig.licenseUrl = loadRequest.media.customData.licenseUrl;
  }
  return playbackConfig;
});

Se você tiver uma integração com o Google Assistente, algumas das informações de DRM, como as credenciais necessárias para o conteúdo podem estar vinculadas diretamente ao seu Conta do Google por mecanismos como OAuth/SSO. Nesses casos, se o conteúdo de mídia é carregado por voz ou vem da nuvem, setCredentials é invocado da nuvem para o dispositivo de transmissão, desde que esse credenciais. Os aplicativos que escrevem um aplicativo receptor da Web podem usar o setCredentials para operar o DRM conforme necessário. Aqui está um exemplo usando a credencial para criar a mídia.

Dica: consulte também Como carregar mídia usando contentId, contentUrl e entity.

Gerenciamento de canais de áudio

Quando o player de transmissão carrega mídia, ele configura um único buffer de origem de áudio. Em ao mesmo tempo, ele também seleciona um codec apropriado para ser usado pelo buffer com base no tipo MIME da faixa principal. Um novo buffer e codec novos são configurados:

  • quando a reprodução começar,
  • em cada intervalo de anúncio, e
  • sempre que o conteúdo principal for retomado.

Como o buffer usa um único codec e o codec é escolhido com base na faixa principal, há situações em que faixas secundárias podem ser filtradas e não ouvidas. Isso pode acontecer quando o sistema principal a faixa está em som surround, mas as secundárias usam som estéreo. Como as faixas secundárias costumam ser usadas para oferecer conteúdo em versões idiomas, fornecer mídia com diferentes números de faixas pode ter um impacto substancial, como um grande número de espectadores não conseguir ouvir conteúdo no idioma nativo deles.

Os cenários a seguir ilustram por que é importante fornecer recursos em que as faixas primária e secundária contêm o mesmo número de canais:

Cenário 1: fluxo de mídia sem canal paridade entre faixas primárias e secundárias:

  • Inglês: canal AC-3 5.1 (principal)
  • sueco - AAC 2 canais
  • francês - AAC 2 canais
  • alemão - AAC 2 canais

Nesse caso, se o idioma do player estiver definido como algo diferente em inglês, o usuário não ouve a faixa que espera ouvir, porque todas as faixas de dois canais são filtradas durante a reprodução. A única faixa que poderia ser reproduzida seria o canal 5.1 AC-3 principal e somente quando o está definido como inglês.

Cenário 2: stream de mídia com canal paridade entre faixas primárias e secundárias:

  • Inglês: canal AC-3 5.1 (principal)
  • sueco - canal AC-3 5.1
  • francês - AC-3 5.1 canal
  • alemão - canal AC-3 5.1

Como todas as faixas desta transmissão têm o mesmo número de canais, o público ouvirá uma faixa independentemente do idioma selecionado.

Processamento de canais de áudio Shaka

O player Shaka (DASH) tem como padrão uma contagem de canais preferencial de dois, como de mitigação ao encontrar mídia que não tem paridade em todo o conteúdo faixas de áudio.

Se a faixa principal não for som surround (por exemplo, um som estéreo de dois canais faixa), o player Shaka usará dois canais como padrão e filtrar automaticamente quaisquer faixas de mídia secundárias que tenham mais de duas canais.

O número preferido de canais de áudio da Shaka também pode ser definido definindo o preferredAudioChannelCount na propriedade shakaConfig em cast.framework.PlaybackConfig.

Exemplo:

shakaConfig = { "preferredAudioChannelCount": 6 };

Com preferredAudioChannelCount definido como 6, o Shaka Player verifica se Ele é compatível com os codecs de som surround (AC-3 ou EC-3) e filtra automaticamente todas as faixas de mídia que não estão em conformidade com as número de canais.