Protocolos de transmisión del reproductor de receptor web

El SDK de receptor web admite tres tipos de protocolos de transmisión en la actualidad:

DASH HTTP en vivo de transmisión y . Transmisión fluida.

En este documento, enumeramos nuestra compatibilidad con cada uno de los protocolos de transmisión. Nota La explicación de las etiquetas admitidas para cada protocolo es bastante abreviada. en comparación con la especificación de protocolo detallada. El objetivo es proporcionar descripción rápida y comprensión de cómo usar cada protocolo y qué funciones del protocolo son compatibles con los dispositivos compatibles con Cast para entregar su de transmisión continua.

Transmisión adaptable y dinámica a través de HTTP (DASH)

ISO especificación detallada de DASH.

DASH es un protocolo de transmisión con tasa de bits adaptable que permite videos de alta calidad transmitir a través de servidores HTTP(S). Un manifiesto, redactado en XML, contiene la mayor parte de la información de metadatos sobre cómo inicializar y descargar el video contenido. Los conceptos clave que admite el reproductor web son <Period>, <AdaptationSet>, <Representation> y <SegmentTemplate> <SegmentList>, <BaseUrl> y <ContentProtection>.

Un manifiesto DASH comienza con una etiqueta raíz <MPD> y, dentro, incluye uno o más etiquetas <Period>, que representan un contenido de transmisión. Las etiquetas <Period> permiten ordenar diferentes piezas de contenido de transmisión y a menudo se usan para separar contenido principal y publicidad contenido de video consecutivos.

Un <AdaptationSet> en <MPD> es un conjunto de representaciones para un tipo de transmisión multimedia, en la mayoría de los casos, video, audio o subtítulos. El más Los mimetipos comúnmente admitidos son "video/mp4", "audio/mp4" y "texto/vtt". Los se pueden incluir <ContentComponent contentType="$TYPE$"> opcionales por debajo de <AdaptationSet>.

Dentro de cada <AdaptationSet>, se debe incluir una lista de etiquetas <Representation> presente, y el reproductor del receptor web usará la información de codecs para inicializar el búfer de origen de ECM y la información de bandwidth en elegir automáticamente la representación o tasa de bits correctas para reproducir.

Para cada <Representation>, los segmentos de medios se describen usando lo siguiente: una <BaseURL> para la representación de un solo segmento, <SegmentList> para la representación una lista de segmentos (similar a HLS) o <SegmentTemplate>.

En el caso de las <SegmentTemplate>, indica cómo el segmento de inicialización y los segmentos de medios se pueden representar mediante plantillas. En el siguiente ejemplo $Number$ indica el número de segmento como está disponible en la CDN. Así que se traduce a seg1.m4s, seg2.m4s, etc. a medida que la reproducción continúa.

<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 una <SegmentTemplate>, es común usar la etiqueta <SegmentTimeline> para indican la longitud de cada segmento y qué segmentos se repiten. Un objeto timescale (unidades para representar un segundo) a menudo se incluyen como parte de los atributos de <SegmentTemplate> para poder calcular el tiempo del segmento según esta unidad. En el siguiente ejemplo, la etiqueta <S> hace referencia a una etiqueta de segmento, El atributo d especifica la longitud del segmento y el atributo r. especifica cuántos segmentos de la misma duración se repiten para que $Time$ puedan calcularse adecuadamente para descargar el segmento de medios, como se especifica en el 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>

A continuación, se muestra un ejemplo de una representación que usa <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 un archivo de un solo segmento, se suele usar <SegmentBase> con bytes de rango de solicitudes para especificar qué parte de un archivo <BaseURL> contiene la y el resto se puede recuperar on demand a medida que la reproducción continúa sucede. Aquí, el rango Initialization especifica el rango de metadatos init y indexRange especifica el índice de los segmentos multimedia. Ten en cuenta que Por el momento, solo admitimos rangos 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>

Independientemente de la representación que se use, si las transmisiones están protegidas, se puede generar La sección <ContentProtection> puede aparecer en <AdaptationSet>, donde un schemeIdUri identifica de forma única el sistema DRM que se usará. Se puede incluir un ID de clave opcional para la encriptación común.

<!-- 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 obtener más información y ejemplos, consulte la especificación de MPEG-DASH. A continuación, se incluye una lista de atributos adicionales de DASH en etiquetas que no se mencionaron anteriormente que admitimos actualmente:

Nombre del atributo Función del atributo
mediaPresentationDuration La duración del contenido del video.
minimumUpdatePeriod Atributo de la etiqueta <MPD>. especifica la frecuencia con la que necesitamos para volver a cargar el manifiesto.
tipo Atributo de la etiqueta <MPD>. "dinámico" para indicar que esta es una transmisión en vivo.
presentationTimeOffset Atributo de la etiqueta <SegmentBase>. especifica la tiempo de presentación de las presentaciones con efecto de compensación desde el comienzo del período.
startNumber Especifica el número del primer segmento de medios en una presentación de una período. Este método se suele usar en las transmisiones en vivo.

También se admite el reconocimiento del cuadro EMSG dentro de fragmentos de MP4 para DASH y proporciona un EmsgEvent para los desarrolladores.

Si bien nuestro reproductor web receptor actual admite los principales casos de uso de DASH, aquí es una lista de atributos comunes que nuestra implementación actual de DASH ignora o no usa. Independientemente de si el manifiesto contiene no influyen en la experiencia de reproducción del contenido.

  • availabilityStartTime
  • segmentAlignment

HTTP Live Streaming (HLS)

Se pueden obtener la descripción general y la especificación completa de la transmisión en vivo HTTP. aquí.

Uno de los puntos fuertes del reproductor web receptora es su capacidad de admitir reproducción de HLS en ECM. Es diferente del DASH, en el que un manifiesto se presenta , el HLS envía la playlist principal con una lista de todas las transmisiones de variantes. con su URL respectiva. La playlist de variantes es la playlist de contenido multimedia. Los dos las etiquetas HLS principales que el reproductor web admite actualmente en la instancia principal. playlist son:

Nombre de la etiqueta Funcionalidad
#EXT-X-STREAM-INF Especifica una transmisión de variantes o tasa de bits. El atributo BANDWIDTH tiene las siguientes características: necesaria, que admite la selección de transmisión de tasa de bits adaptable. El Se recomienda el atributo CODECS para inicializar ECM, como como "avc1.42c01e,mp4a.40.2". Si no se especifica, el caso predeterminado es Configurar en H264 el video del perfil principal 3.0 y el audio "mp4a.40.2" codificado contenido.
#EXT-X-MEDIA Especifica la playlist de contenido multimedia adicional (en el atributo URI) que representa el contenido. Suelen ser transmisiones de audio alternativas en otros formato (sonido envolvente 5.1) o idioma. Un atributo de TYPE que contengan VIDEO, AUDIO Se permiten SUBTITLES o CLOSED-CAPTIONS. Parámetro de configuración el atributo DEFAULT a YES indicará que elijas esta transmisión alternativa de forma predeterminada.

A continuación, se muestra una lista de etiquetas HLS que el receptor web admite actualmente en la playlist de contenido multimedia:

Nombre de la etiqueta Funcionalidad
#EXTINF Información de la transmisión, generalmente seguida de la duración del segmento en segundos y, en la línea siguiente, la URL del segmento.
#EXT-X-TARGETDURATION La duración en segundos de cada segmento. Esto también determina con qué frecuencia descargar o actualizar el manifiesto de la playlist para una transmisión en vivo El receptor web El reproductor no admite duraciones inferiores a 0.1 s.
#EXT-X-MEDIA-SEQUENCE El número de secuencia (a menudo, para una transmisión en vivo) en el que que representa esta playlist.
#EXT-X-KEY Información de la clave de DRM. El atributo METHOD nos indica qué clave un sistema de archivos que se use. Hoy admitimos AES-128 y SAMPLE-AES de Google Cloud.
#EXT-X-BYTERANGE El rango de bytes que se recuperará de la URL de un segmento.
#EXT-X-DISCONTINUITY Especifica una discontinuidad entre segmentos consecutivos. Esto suele ocurrir con la inserción de anuncios del servidor donde un segmento de anuncios aparezca en el medio de la comercial.
#EXT-X-PROGRAM-DATE-TIME Tiempo absoluto de la primera muestra del siguiente segmento, por ejemplo &quot;2016-09-21T23:23:52.066Z&quot;.
#EXT-X-ENDLIST Si se trata de un VOD o una transmisión en vivo.

Para la transmisión en vivo, usamos #EXT-X-PROGRAM-DATE-TIME y #EXT-X-MEDIA-SEQUENCE. como factores clave para determinar cómo combinar un manifiesto recién actualizado. Si presente, #EXT-X-PROGRAM-DATE-TIME se usa para hacer coincidir los segmentos actualizados. De lo contrario, se usará el número #EXT-X-MEDIA-SEQUENCE. Ten en cuenta que, según el según la especificación HLS, no usamos la comparación de nombres de archivos para la coincidencia.

Nuestra implementación de HLS admite la selección de una transmisión de audio alternativa, como Sonido envolvente 5.1 como reproducción de audio principal Esto se puede lograr tener una etiqueta #EXT-X-MEDIA con los códecs alternativos y proporcionar el formato del segmento en la configuración de la transmisión.

El reproductor web espera un comportamiento determinado según las especificaciones. Por ejemplo, luego de un #EXT-INF, esperamos un URI. Si no es un URI, como un #EXT-X-DISCOUNTINUITY hará que falle el análisis de la playlist.

Cada #EXT-X-TARGETDURATION segundos, volvemos a cargar la playlist o el manifiesto para obtener nuevas listas de segmentos y actualizamos la nueva representación interna de todos los al nuevo segmento. Cada vez que se solicita un salto, solo lo hacemos dentro de el rango que admite búsquedas. Para las transmisiones en vivo, solo permitimos la búsqueda desde el principio de la más reciente hasta una duración objetivo de tres desde el final. Por ejemplo, Si tienes una lista de 10 segmentos y estás en el segmento 6, solo puedes buscar en 7, pero no en 8.

Compatibilidad con el formato de segmentos

El SDK de CAF admite la reproducción de contenido que se publica en varios formatos, como se indica en HlsSegmentFormat para audio y HlsVideoSegmentFormat para los videos. Esto incluye la compatibilidad con audio empaquetado como la reproducción en AAC y AC3, tanto encriptada como no encriptada. Es obligatorio para especificar esta información en el MediaInformation de la LoadRequestData para describir correctamente tu contenido al reproductor. Si no se especifica, el la configuración predeterminada del reproductor intentará reproducir el contenido como de transporte Reproduce contenido empaquetado. Esta propiedad se puede configurar desde cualquiera de los remitentes en la cargar datos de solicitudes (para Android, iOS y Web) o dentro del receptor a través de interceptores de mensajes.

Consulta el código de muestra a continuación o el mensaje Carga de medios con contentId, contentUrl y entidad para obtener más información sobre cómo preparar contenido en el receptor 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;
    });

Protección de contenido

Como se indicó en la sección anterior de etiquetas #EXT-X-KEY, el SDK de Cast admite SAMPLE-AES o SAMPLE-AES-CTR, en el que un URI para la clave es un vector de inicialización pueden especificarse:

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

El KEYFORMAT compatible ahora es Widevine, y el URI contiene un Información de DRM codificada en BASE64 XXXXXXX que, cuando se decodifica, contiene el ID de la clave:

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

La versión 1 define los siguientes atributos:

Atributo Ejemplo Descripción
KEYFORMATVERSIONS "1" Esta propuesta define el formato de clave versión 1
KEYFORMAT "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" El UUID es el UUID de Widevine de DASH IF IOP. Se usa la misma cadena en la MPD con transmisiones encriptadas de Widevine.
URI "data:text/plain;base64, <base64 encoded PSSH box>" El URI de la transmisión que contiene el tipo de datos y el cuadro PSSH.
METHOD SAMPLE-AES-CTR Indica el algoritmo de cifrado de encriptación que se usó para encriptar el contenido. SAMPLE-AES indica que el contenido está encriptado con “cbcs”. SAMPLE-AES-CTR indica que el contenido está encriptado con uno de los esquemas de protección de AES-CTR, denominado “cenc”.

Atributos asignados a la MPD de DASH:

Atributo Descripción
KEYFORMAT Atributo schemaIdUri del elemento ContentProtection.
URI El contenido del elemento cenc:pssh.
KEYID Es una cadena hexadecimal de 16 bytes que codifica el ID de clave que tiene el mismo rol que default_kid en MPEG DASH. Si se usa un esquema de claves jerárquico, esta será la “raíz” .

Ejemplo de playlist de HLS con indicador 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

A continuación, se muestra una lista de funciones y etiquetas en HLS que actualmente no usamos o y asistencia. Su presencia o ausencia no afectan el comportamiento de transmisión.

  • Se ignora el atributo RESOLUTION= de #EXT-X-STREAM-INF.
  • No se usa el atributo AUTOSELECT= en #EXT-X-MEDIA. En cambio, confiamos en DEFAULT=
  • Se ignorará #EXT-X-I-FRAME-STREAM-INF en la playlist principal.
  • Se ignora #EXT-X-DISCONTINUITY-SEQUENCE.
  • #EXT-X-PLAYLIST-TYPE:EVENT puede estar presente en una transmisión en vivo y #EXT-X-PLAYLIST-TYPE:VOD puede estar presente en una transmisión de VOD, pero actualmente El reproductor web receptor solo depende de la existencia de #EXT-X-ENDLIST para determinar en vivo vs. VOD

Transmisión fluida

Informe oficial de Microsoft Especificaciones de Smooth Streaming.

La transmisión fluida proporciona un protocolo de transmisión adaptable y especificación XML a través de HTTP (similar a DASH). A diferencia del DASH, Smooth Streaming recomienda solo empaquetado MPEG-4 para los segmentos de medios.

Esta es una tabla con las etiquetas y los atributos más comunes de Smooth Streaming que el reproductor web receptor compatible actualmente. Muchos conceptos ya se explican en la sección anterior de DASH.

Etiqueta o atributo Uso
&lt;SmoothStreamingMedia&gt; Es la etiqueta principal del manifiesto que contiene los siguientes atributos:
  • TimeScale: Número de unidades para representar un segundo (por lo general, un incremento de 10,000,000.
  • Duración: Es la duración del contenido en una escala de tiempo. El reproductor web receptora no admiten duraciones inferiores a 0.1 s
  • IsLive: Indica si el manifiesto es un medio en vivo.
&lt;StreamIndex&gt; Un conjunto de transmisiones, similar al AdaptationSet de DASH. El tipo suele ser "texto", "video" o "audio". Por lo general, el atributo URL contiene una URL URL del fragmento con información como la tasa de bits o la hora de inicio.
&lt;QualityLevel&gt; Cada etiqueta de QualityLevel especifica su tasa de bits y un códec de FourCC. Las FourCC suelen ser “H264”, “AVC1”, “AACL”, etc. En el caso de los videos, especifica su de resolución mediante MaxWidth y MaxHeight. En el caso del audio, especifica su (como 44,100) mediante SamplingRate y la cantidad de canales.
&lt;c&gt; Elemento de fragmento de transmisión. Contiene:
  • d: duración de un fragmento.
  • t: Tiempo multimedia del fragmento.
&lt;Protection&gt; Una etiqueta con el atributo opcional SystemID que incluye el ID del sistema DRM para usar en <SmoothStreamingMedia> etiqueta.
&lt;ProtectionHeader&gt; En <Protection>, puede contener un atributo de SystemID y personalizado datos codificados en Base64. Para Widevine, contendrá el ID de la clave, la clave la longitud, el ID del algoritmo, como AESCTR, la LA_URL (URL de adquisición de licencia), LUI_URL (URL de la interfaz de usuario de la licencia) y DS_ID (ID del servicio del dominio).

Protección de contenido

Para codificar correctamente los IDs del sistema de protección, usa la siguiente asignación:

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

Para <ProtectionHeader>, a continuación se muestra un ejemplo con datos codificados en Base64. El cuando los datos se decodifican, se ajustan al mismo formato decodificado que se describe en el Compatibilidad con la protección de contenido DASH mencionada anteriormente.

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

A continuación, se muestra un ejemplo de un manifiesto de transmisión en vivo con fluidez de 3,000 segundos duración del contenido:

<?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>

En el ejemplo anterior para la transmisión de video por Internet, la plantilla de URL es:

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

Así que los primeros dos segmentos (suponiendo que estamos en el nivel de calidad del índice 2) serán lo siguiente, con el tiempo inicial extraído de t="80649401378125" debajo de StreamIndex de video y el incremento de tiempo de 4 segundos * 10000000 por segmento:

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

Esta es una lista de atributos de Smooth Streaming que actualmente ignoramos y tenemos Esto no influye en las experiencias de transmisión, independientemente de si se proporcionan o no:

  • CanSeek y CanPause en la etiqueta <SmoothStreamingMedia>.
  • Segmentos y QualityLevels en la etiqueta <StreamIndex>. En cambio, calculamos la cantidad de segmentos y de niveles de calidad basados en la información proporcionadas dentro de <StreamIndex>, como la etiqueta QualityLevel real y el Etiquetas <c>.
  • No se usa BitsPerSample y PacketSize en <QualityLevel>.

Verificar tipo de pantalla

La canDisplayType de métodos para comprobar las capacidades de video y audio del dispositivo receptor web y para mostrar validando los parámetros de medios que se pasaron y mostrando un valor booleano. Todo de parámetros, pero el primero es opcional. Cuantos más parámetros incluyas, más más precisa será la verificación.

Su firma es canDisplayType(<em>mimeType</em>,<em>codecs</em>,<em>width</em>,<em>height</em>,<em>framerate</em>)

Ejemplos:

Comprueba si el dispositivo y la pantalla del receptor web admiten la transmisión de video/mp4 MIME con este códec, dimensiones y velocidad de fotogramas en particular:

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

Comprueba si el dispositivo y la pantalla del receptor web admiten el formato de video 4K para este códec especificando el ancho de 3840 y la altura de 2160:

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

Comprueba si el dispositivo y la pantalla del receptor web admiten HDR10 para este códec. dimensiones y velocidad de fotogramas:

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

Comprueba si el dispositivo y la pantalla receptor web admiten Dolby Vision (DV) para este códec, dimensiones y velocidad de fotogramas:

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

DRM

Cierto contenido multimedia requiere administración de derechos digitales (DRM). Para contenido multimedia que tenga la licencia de DRM (y la URL de la clave) almacenada en su manifiesto (DASH o HLS), el SDK de Cast se encarga de este caso por ti. Un subconjunto de ese contenido requiere un licenseUrl necesario para obtener la clave de desencriptación. En el receptor web, puedes usar PlaybackConfig para configurar licenseUrl según sea necesario.

En el siguiente fragmento de código, se muestra cómo puedes configurar la información de solicitud para la licencia solicitudes, 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;
});

Si tienes una integración con Asistente de Google, parte de la información de DRM, como es posible que las credenciales necesarias para el contenido se vinculen directamente a tu Cuenta de Google con mecanismos como OAuth/SSO En esos casos, si el contenido multimedia se carga a través de la voz o proviene de la nube, una Se invoca setCredentials desde la nube al dispositivo de transmisión siempre que se cumpla lo siguiente: credenciales. Las aplicaciones que escriben una app de receptor web pueden usar la Información de setCredentials para operar la DRM según sea necesario. Este es un ejemplo de usando la credencial para construir los medios.

Sugerencia: Consulta también Cómo cargar contenido multimedia con contentId, contentUrl y entidad.

Manejo de canales de audio

Cuando el reproductor de transmisión carga contenido multimedia, configura un solo búfer de fuente de audio. En Al mismo tiempo, también selecciona un códec adecuado para que use el búfer, según el tipo de MIME de la pista principal. Se configuraron un nuevo búfer y códec:

  • cuando comienza la reproducción,
  • en cada pausa publicitaria
  • cada vez que se reanuda el contenido principal.

Debido a que el búfer usa un solo códec y a que se elige el códec basadas en la pista principal, hay situaciones en las que las pistas secundarias se filtró y no se escuchó. Esto puede ocurrir cuando el perfil tiene sonido envolvente, pero las pistas de audio secundarias usan sonido estéreo. Porque las pistas secundarias se usan frecuentemente para ofrecer contenido en idiomas, proporcionar medios con diferentes cantidades de pistas puede tener una un impacto significativo, como que muchos usuarios no pueden escuchar contenido en su idioma nativo.

Las siguientes situaciones ilustran por qué es importante proporcionar donde las pistas principales y secundarias contienen la misma cantidad de canales:

Situación 1: Falta un canal de transmisión de medios paridad entre los segmentos primarios y secundarios:

  • inglés: canal AC-3 5.1 (principal)
  • sueco: AAC de 2 canales
  • francés: AAC de 2 canales
  • alemán (AAC de 2 canales)

En este caso, si el idioma del jugador no está configurado inglés, el usuario no escucha la pista que espera escuchar, porque todos las pistas de dos canales se filtran durante la reproducción. La única pista que en el canal principal de AC-3 de 5.1 y, luego, solo cuando esté configurado en inglés.

Situación 2: transmisión de medios con el canal paridad entre los segmentos primarios y secundarios:

  • inglés: canal AC-3 5.1 (principal)
  • sueco: canal AC-3 5.1
  • francés - canal AC-3 5.1
  • alemán: canal AC-3 5.1

Como todas las pistas de esta transmisión tienen la misma cantidad de canales, un público escuchará una pista independientemente del idioma seleccionado.

Manejo de canales de audio de Shaka

El reproductor Shaka (DASH) utiliza de forma predeterminada un recuento de canales preferido de dos, como medida de mitigación cuando se encuentran medios que carecen de paridad entre los pistas de audio.

Si la pista principal no tiene sonido envolvente (por ejemplo, un sonido estéreo de dos canales) pista), el reproductor de Shaka mostrará de forma predeterminada dos canales y filtrar automáticamente las pistas de medios secundarias que tengan más de dos canales.

El número preferido de canales de audio de Shaka también se puede configurar el preferredAudioChannelCount en la propiedad shakaConfig en cast.framework.PlaybackConfig.

Por ejemplo:

shakaConfig = { "preferredAudioChannelCount": 6 };

Con el preferredAudioChannelCount establecido en 6, el reproductor de Shaka comprueba si puede admitir códecs de sonido envolvente (AC-3 o EC-3). filtra automáticamente las pistas multimedia que no se ajustan a la cantidad de canales.