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 "2016-09-21T23:23:52.066Z". |
#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 enDEFAULT=
- 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 |
---|---|
<SmoothStreamingMedia> | Es la etiqueta principal del manifiesto que contiene los siguientes atributos:
|
<StreamIndex> | 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. |
<QualityLevel> | 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. |
<c> | Elemento de fragmento de transmisión. Contiene:
|
<Protection> | Una etiqueta con el atributo opcional SystemID que incluye el ID del sistema DRM para usar en <SmoothStreamingMedia> etiqueta. |
<ProtectionHeader> | 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 etiquetaQualityLevel
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.