Le SDK Web Receiver accepte trois types des protocoles de streaming aujourd’hui:
DASH HTTP en direct Streaming <ph type="x-smartling-placeholder"></ph> Streaming fluide.
Dans ce document, nous indiquons les protocoles de streaming que nous prenons en charge. Remarque l'explication des balises prises en charge pour chaque protocole est assez abrégée par rapport à la spécification détaillée du protocole. L'objectif est de fournir une un aperçu et une compréhension rapide de l’utilisation de chaque protocole et des fonctionnalités du protocole sont compatibles avec les appareils compatibles Cast pour diffuser leur expériences de streaming.
Streaming adaptatif dynamique sur HTTP (DASH)
ISO spécification détaillée de DASH.
DASH est un protocole de streaming à débit adaptatif qui permet de réaliser des vidéos de haute qualité
en continu via des serveurs HTTP(S). Un fichier manifeste, composé en XML, contient
des informations de métadonnées permettant d'initialiser et de télécharger la vidéo
contenus. Les concepts clés compatibles avec le lecteur Web Receiver sont <Period>
,
<AdaptationSet>
, <Representation>
, <SegmentTemplate>
<SegmentList>
, <BaseUrl>
et <ContentProtection>
.
Un fichier manifeste DASH commence par une balise racine <MPD>
et à l'intérieur inclut une ou
autres tags <Period>
, qui représentent un contenu en streaming.
Les balises <Period>
permettent de classer différents éléments de contenu en streaming.
et sont souvent utilisés pour séparer le contenu principal de la publicité ou
plusieurs contenus vidéo consécutifs.
Un <AdaptationSet>
sous <MPD>
est un ensemble de représentations pour
un type de flux multimédia, dans la plupart des cas
de la vidéo, de l'audio ou des sous-titres. Les plus
Les types MIME couramment acceptés sont "video/mp4", "audio/mp4" et "text/vtt". Une
l'option <ContentComponent contentType="$TYPE$">
facultative peut être incluse
moins de <AdaptationSet>
.
À l'intérieur de chaque balise <AdaptationSet>
, une liste de balises <Representation>
doit
et que le lecteur Web Receiver utilise les informations codecs
pour
initialiser le tampon source MSE et les informations bandwidth
pour
qui sélectionne automatiquement
la représentation ou le débit à lire.
Pour chaque <Representation>
, les segments multimédias sont décrits à l'aide de :
une <BaseURL>
pour la représentation d'un seul segment, <SegmentList>
pour
liste de segments (semblable à HLS) ou <SegmentTemplate>
.
Pour un <SegmentTemplate>
, il indique comment le segment d'initialisation et
les segments multimédias peuvent être représentés par des modèles. Dans l'exemple ci-dessous,
$Number$
indique le numéro de segment disponible auprès du CDN. Il est donc
se traduit en seg1.m4s, seg2.m4s, etc. au fur et à mesure que la lecture se poursuit.
<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>
Avec <SegmentTemplate>
, il est courant d'utiliser la balise <SegmentTimeline>
pour :
indiquer la durée de chaque segment
et quels segments se répètent. Un timescale
(unités représentant une seconde) est souvent incluse dans les attributs de
<SegmentTemplate>
afin que nous puissions calculer l'heure du segment en fonction
cette unité. Dans l'exemple ci-dessous, la balise <S>
correspond à une balise de segment, la
L'attribut d
indique la longueur de la section et l'attribut r
spécifie le nombre de segments de même durée qui se répètent, de sorte que $Time$
peut être calculé correctement pour télécharger le segment multimédia, comme indiqué dans
Attribut 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>
Voici un exemple de représentation à l'aide de <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>
Pour un seul fichier de segment, <SegmentBase>
est souvent utilisé avec l'octet
les requêtes de plage pour spécifier quelle partie d'un fichier <BaseURL>
contient
et le reste peut être récupéré à la demande au fur et à mesure que la lecture se poursuit
se produit. Ici, la plage Initialization
spécifie la plage de métadonnées init
et indexRange
spécifie l'index des segments multimédias. Notez que
pour le moment, nous ne prenons en charge
que les plages d'octets consécutifs.
<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>
Quelle que soit la représentation utilisée, si les flux sont protégés,
La section <ContentProtection>
peut apparaître sous <AdaptationSet>
,
où un schemeIdUri
identifie de manière unique le système DRM à utiliser.
Un ID de clé facultatif peut être inclus pour le chiffrement courant.
<!-- 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>
Pour plus d'exemples et de détails, veuillez consulter la spécification MPEG-DASH. Vous trouverez ci-dessous une liste d'attributs DASH supplémentaires pour les balises non mentionnées ci-dessus. actuellement compatibles:
Nom de l'attribut | Fonction d'attribut |
---|---|
mediaPresentationDuration | La durée du contenu vidéo. |
minimumUpdatePeriod | Attribut de la balise <MPD> . spécifie la fréquence
à laquelle nous avons besoin
pour actualiser le fichier manifeste. |
type | Attribut de la balise <MPD> . "dynamique" pour indiquer que
il s'agit d'une diffusion en direct. |
presentationTimeOffset | Attribut de la balise <SegmentBase> ; spécifie
le décalage horaire de présentation
par rapport au début de la période. |
startNumber | Spécifie le numéro du premier segment multimédia d'une présentation dans un période. Elle est souvent utilisée dans les diffusions en direct. |
Nous prenons également en charge la reconnaissance de la zone EMSG dans les fragments MP4 pour DASH et
fournissez une
EmsgEvent
aux développeurs.
Bien que notre lecteur Web Receiver Player actuel soit compatible avec les principaux cas d'utilisation de DASH, Il s'agit d'une liste d'attributs courants que notre mise en œuvre actuelle de DASH ignore ou n'utilise pas. Cela signifie que le fichier manifeste contient elles n'ont aucun impact sur l'expérience de lecture du contenu.
- availabilityStartTime
- segmentAlignment
Diffusion HTTP en direct (HLS)
Découvrez la présentation et les spécifications complètes de la diffusion HTTP en direct cliquez ici.
L'un des points forts du lecteur Web Receiver est sa capacité à prendre en charge lors de la lecture du HLS en MSE. À l'inverse de DASH, où un fichier manifeste est fourni fichier HLS, le HLS envoie la playlist principale contenant la liste de tous les flux de variantes par leur URL respective. La playlist de variantes est la playlist de contenus multimédias. Les deux les principaux tags HLS actuellement pris en charge par le lecteur Web Receiver dans le maître ; playlist sont:
Nom de la balise | Fonctionnalité |
---|---|
#EXT-X-STREAM-INF | Spécifie un débit/un flux de variantes. L'attribut BANDWIDTH est
qui est compatible avec la sélection de streaming à débit adaptatif. La
L'attribut CODECS est vivement recommandé pour initialiser MSE, tel que
en tant que "avc1.42c01e,mp4a.40.2" . Si aucune valeur n'est spécifiée, la casse par défaut est
défini sur profil principal H264 pour la vidéo 3.0 et l'encodage audio "mp4a.40.2"
contenus. |
#EXT-X-MEDIA | Spécifie une playlist de contenus multimédias supplémentaires (dans l'attribut URI ) qui :
représente le contenu. Il s'agit généralement de flux audio alternatifs dans d'autres
le format (son surround 5.1) ou la langue. Un attribut de TYPE
contenant VIDEO , AUDIO ,
SUBTITLES ou CLOSED-CAPTIONS sont autorisés. Paramètre
l'attribut DEFAULT à YES indique que le choix
ce flux alternatif par défaut. |
Voici une liste des tags HLS actuellement compatibles avec le lecteur Web Receiver la playlist de contenus multimédias:
Nom de la balise | Fonctionnalité |
---|---|
#EXTINF | Informations sur le flux, généralement suivies de la durée du segment au format secondes et sur la ligne suivante, l'URL du segment. |
#EXT-X-TARGETDURATION | Durée de chaque segment, en secondes. Cela détermine également la fréquence à laquelle nous télécharger/actualiser le fichier manifeste de la playlist pour une diffusion en direct ; Web Receiver Le lecteur n'accepte pas les durées inférieures à 0,1 s. |
#EXT-X-MEDIA-SEQUENCE | Numéro de séquence (souvent pour une diffusion en direct) dans lequel se trouve le premier segment représente cette playlist. |
#EXT-X-KEY | Informations sur la clé DRM L'attribut METHOD indique la clé
système à utiliser. Aujourd'hui, nous acceptons AES-128 et SAMPLE-AES .
pour en savoir plus. |
#EXT-X-BYTERANGE | Plage d'octets à récupérer pour une URL de segment. |
#EXT-X-DISCONTINUITY | Spécifie une discontinuité entre des segments consécutifs. Cela se voit souvent grâce à l'insertion d'annonces côté serveur, où un segment d'annonce apparaît au milieu de la flux principal. |
#EXT-X-PROGRAM-DATE-TIME | Durée absolue du premier échantillon du segment suivant, par exemple "2016-09-21T23:23:52.066Z". |
#EXT-X-ENDLIST | S'il s'agit d'une VOD ou d'une diffusion en direct |
Pour les diffusions en direct, nous utilisons #EXT-X-PROGRAM-DATE-TIME
et #EXT-X-MEDIA-SEQUENCE
.
comme facteurs clés pour déterminer comment fusionner un fichier manifeste récemment actualisé. Si
présent, le #EXT-X-PROGRAM-DATE-TIME
est utilisé pour correspondre aux segments actualisés.
Sinon, le numéro #EXT-X-MEDIA-SEQUENCE
est utilisé. Notez que, conformément aux
spécification HLS, la comparaison des noms de fichiers n'est pas utilisée pour la mise en correspondance.
Notre implémentation HLS permet de sélectionner un autre flux audio, tel que
Son surround 5.1, comme lecture audio principale Pour ce faire, vous pouvez
avec une balise #EXT-X-MEDIA
avec les autres codecs et en fournissant
le format de segment dans la configuration du flux ;
Le lecteur Web Receiver s'attend à un comportement spécifique selon les spécifications. Par exemple, après une
#EXT-INF
, nous attendons un URI. S'il ne s'agit pas d'un URI, par exemple,
#EXT-X-DISCOUNTINUITY
entraîne l'échec de l'analyse de la playlist.
Toutes les #EXT-X-TARGETDURATION
secondes, nous actualisons la playlist/le fichier manifeste pour obtenir
de nouvelles listes de segments et nous mettons à jour la nouvelle représentation interne de toutes les
au nouveau segment. Chaque fois qu'une recherche est demandée, nous ne la recherchons que
la plage de recherche. Pour les diffusions en direct, la recherche n'est autorisée qu'à partir du début du
la plus récente jusqu'à une durée cible de trois à partir de la fin. Par exemple,
Si vous avez une liste de 10 segments et que vous êtes sur le segment 6, vous pouvez uniquement rechercher
à 7, mais pas à 8.
Compatibilité avec le format de segment
Le SDK CAF prend en charge la lecture de contenus diffusés dans plusieurs formats référencés
dans HlsSegmentFormat
pour l'audio et HlsVideoSegmentFormat
pour les vidéos. Cela inclut la prise en charge
audio empaqueté
comme la lecture AAC et AC3, avec ou sans chiffrement. Champ obligatoire
pour spécifier ces informations dans le MediaInformation
de LoadRequestData
pour décrire correctement votre contenu au lecteur. S'il n'est pas spécifié, le
la configuration par défaut du lecteur tentera de lire le contenu en tant que
Lire en streaming des contenus empaquetés Cette propriété peut être définie à partir de n'importe quel expéditeur dans
les données de requête de chargement (Android,
iOS
et Web)
ou dans le récepteur par le biais
d'intercepteurs de messages.
Consulter l'exemple de code ci-dessous ou l'extrait Chargement de contenu multimédia à l'aide de contentId, contentUrl et entity pour obtenir plus d'informations sur la préparation du contenu dans Web Receiver.
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;
});
Protection du contenu
Comme indiqué dans la section "Balise #EXT-X-KEY
" ci-dessus, le SDK Cast est compatible avec
SAMPLE-AES
ou SAMPLE-AES-CTR
, où un URI de la clé et un vecteur d'initialisation
peut être spécifié:
EXT-X-KEY: METHOD=SAMPLE-AES, \
URI="data:text/plain;base64,XXXXXX", \
IV=0x6df49213a781e338628d0e9c812d328e, \
KEYFORMAT="com.widevine", \
KEYFORMATVERSIONS="1"
Le KEYFORMAT
que nous prenons désormais en charge est Widevine, et l'URI contient un
Informations DRM encodées en BASE64 XXXXXXX
qui, une fois décodées, contiennent l'ID de la clé:
{
"content_id": "MTQ1NjkzNzM1NDgxNA==",
"key_ids": [
"xxxxxxxxxxxxxxxx"
]
}
La version 1 définit les attributs suivants:
Attribut | Exemple | Description |
---|---|---|
KEYFORMATVERSIONS |
"1" |
Cette proposition définit le format de clé version 1 |
KEYFORMAT |
"urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" |
L'UUID est l'UUID Widevine de DASH IF IOP. La même chaîne est utilisée dans la description de la présentation du média avec les flux chiffrés Widevine. |
URI |
"data:text/plain;base64, <base64 encoded PSSH box>" |
URI du flux contenant le type de données et la zone PSSH. |
METHOD |
SAMPLE-AES-CTR |
Indique l'algorithme de chiffrement utilisé pour chiffrer le contenu. Le format EXEMPLE-AES indique que le contenu est chiffré à l'aide de "cbcs". Le format EXEMPLE-AES-CTR indique que le contenu est chiffré à l'aide de l'un des schémas de protection AES-CTR, à savoir "cenc". |
Attributs mis en correspondance avec la description de la présentation du média DASH:
Attribut | Description |
---|---|
KEYFORMAT |
Attribut schemaIdUri de l'élément ContentProtection. |
URI |
Contenu de l'élément cenc:pssh. |
KEYID |
Chaîne hexadécimale de 16 octets codant l'ID de clé qui a le même rôle que default_kid dans MPEG DASH. Si vous utilisez un schéma de clés hiérarchique, il s'agirait de la "racine" . |
Exemple de playlist HLS avec signalisation 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
Vous trouverez ci-dessous la liste des fonctionnalités et tags HLS que nous n'utilisons pas actuellement ou de l'assistance. Leur présence ou leur absence n'ont aucune incidence sur le comportement du streaming.
- L'attribut
RESOLUTION=
dans#EXT-X-STREAM-INF
est ignoré. - L'attribut
AUTOSELECT=
dans#EXT-X-MEDIA
n'est pas utilisé. Nous nous appuyons plutôt surDEFAULT=
#EXT-X-I-FRAME-STREAM-INF
dans la playlist principale est ignoré.#EXT-X-DISCONTINUITY-SEQUENCE
est ignoré.#EXT-X-PLAYLIST-TYPE:EVENT
peut être présent dans une diffusion en direct et#EXT-X-PLAYLIST-TYPE:VOD
peut être présent dans un flux de vidéo à la demande, mais actuellement Le lecteur Web Receiver ne s'appuie que sur l'existence de#EXT-X-ENDLIST
pour déterminer la vidéo à la demande.
Streaming fluide
Le site officiel de Microsoft Spécification du streaming fluide.
La diffusion fluide fournit le protocole de streaming adaptatif et la spécification XML via HTTP (semblable à DASH). À l'inverse de DASH, la fonctionnalité de streaming fluide recommande et seulement le format MPEG-4 pour les segments de médias.
Voici un tableau des tags et attributs les plus courants dans Smooth Streaming qui compatible avec le lecteur Web Receiver. De nombreux concepts sont déjà expliqués la section DASH ci-dessus.
Tag/Attribut | Utilisation |
---|---|
<SmoothStreamingMedia> | La balise principale du fichier manifeste contient les attributs suivants:
<ph type="x-smartling-placeholder">
|
<StreamIndex> | Un ensemble de flux, semblable à l'AdaptationSet de DASH. Il s'agit généralement "text", "video" ou "audio". L'attribut Url contient généralement une URL à l'aide d'informations telles que le débit ou l'heure de début. |
<QualityLevel> | Chaque tag QualityLevel spécifie son débit et un codec FourCC. Le FourCC sont souvent "H264", "AVC1", "AACL", etc. Pour la vidéo, il indique via MaxWidth et MaxHeight. Pour l'audio, il indique (44 100, par exemple) via SamplingRate et le nombre de canaux. |
<c> | Élément de fragment de flux. Contient:
<ph type="x-smartling-placeholder">
|
<Protection> | Une balise avec l'attribut facultatif SystemID indiquant l'identifiant du système DRM à utiliser sous <SmoothStreamingMedia> . |
<ProtectionHeader> | Sous <Protection>, peut contenir un attribut d'ID système et un attribut personnalisé généralement encodées en base64. Pour Widevine, il contient l'identifiant de la clé, c'est-à-dire la clé la longueur, l'ID de l'algorithme, par exemple AESCTR, l'URL d'acquisition de licence (LA_URL) ; LUI_URL (URL de l'interface utilisateur de la licence) et DS_ID (ID de service du domaine). |
Protection du contenu
Pour encoder correctement les ID de système de protection, veuillez utiliser le mappage suivant:
- Grand angle : 'EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED',
- CLEARKEY : '1077EFEC-C0B2-4D02-ACE3-3C1E52E2FB4B',
- MPEG_DASH_MP4PROTECTION: 'URN:MPEG:DASH:MP4PROTECTION:2011'
Pour <ProtectionHeader>
, vous trouverez ci-dessous un exemple avec des données encodées en base64. La
les données décodées sont conformes au même format décodé que celui décrit dans
Prise en charge de la protection du contenu DASH ci-dessus.
<Protection>
<ProtectionHeader SystemID="9a04f079-9840-4286-ab92-e65be0885f95">
$BASE64ENCODED_DATA
</ProtectionHeader>
</Protection>
Vous trouverez ci-dessous un exemple de fichier manifeste de streaming en direct avec une durée de durée du contenu:
<?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>
Dans l'exemple ci-dessus concernant le flux vidéo, le modèle d'URL est le suivant:
QualityLevels({bitrate})/Fragments(video={start time})
Ainsi, les deux premiers segments (en supposant que nous sommes sur le niveau de qualité de l'index 2) seront la valeur suivante, l'heure initiale étant extraite de t="80649401378125" sous la section Video StreamIndex et par incrément de temps de 4 secondes x 1 000 000 par segment:
QualityLevels(2)/Fragments(video=80649401378125) QualityLevels(2)/Fragments(video=80649441378125) ...
Voici une liste des attributs de flux fluides que nous ignorons actuellement et pour lesquels nous avons aucun effet sur les expériences de streaming, qu'elles soient fournies ou non:
- CanSeek et CanPause dans la balise
<SmoothStreamingMedia>
. - Fragments et QualityLevels dans la balise
<StreamIndex>
. Au lieu de cela, nous calculons le nombre de segments et de niveaux de qualité en fonction des informations fournies dans<StreamIndex>
, comme la baliseQualityLevel
réelle et<c>
tags. - BitsPerSample et PacketSize dans
<QualityLevel>
ne sont pas utilisés.
Vérifier le type d'affichage
canDisplayType
de vérification des capacités vidéo et audio du récepteur Web et
afficher en validant les paramètres multimédias transmis et en renvoyant une valeur booléenne. Tout
mais les premiers sont facultatifs. Plus vous incluez de paramètres,
la vérification sera
plus précise.
Sa signature est canDisplayType(<em>mimeType</em>,<em>codecs</em>,<em>width</em>,<em>height</em>,<em>framerate</em>)
Exemples :
Vérifie si le récepteur Web et l'écran sont compatibles avec la vidéo/mp4 type MIME avec le codec, les dimensions et la fréquence d'images spécifiques suivants:
canDisplayType("video/mp4", "avc1.42e015,mp4a.40.5", 1920, 1080, 30)
Vérifie si l'appareil et l'écran Web Receiver sont compatibles avec le format vidéo 4K pour ce codec en spécifiant la largeur de 3 840 et la hauteur de 2 160:
canDisplayType("video/mp4", "hev1.1.2.L150", 3840, 2160)
Vérifie si l'appareil et l'écran Web Receiver sont compatibles avec la technologie HDR10 pour ce codec, les dimensions et la fréquence d'images:
canDisplayType("video/mp4", "hev1.2.6.L150", 3840, 2160, 30)
Vérifie si le récepteur Web et l'écran sont compatibles avec Dolby Vision (DV) pour ce codec, ses dimensions et cette fréquence d'images:
canDisplayType("video/mp4", "dvhe.04.06", 1920, 1080, 30)
DRM
Certains contenus multimédias nécessitent la gestion des droits numériques (DRM). Pour les contenus multimédias
dont la licence DRM (et l'URL de la clé) est stockée dans son fichier manifeste (DASH ou HLS),
le SDK Cast gère ce cas pour vous. Un sous-ensemble de ce contenu nécessite
licenseUrl
nécessaire pour obtenir la clé de déchiffrement. Dans Web Receiver, vous pouvez utiliser
PlaybackConfig
pour définir licenseUrl
si nécessaire.
L'extrait de code suivant montre comment définir les informations de demande de licence
requêtes telles que 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 vous avez intégré l'Assistant Google, certaines informations DRM, telles que
les identifiants nécessaires pour accéder au contenu peuvent être directement liés
un compte Google par le biais de mécanismes
comme OAuth/SSO. Dans ce cas, si le
le contenu multimédia est chargé par commande vocale ou provient du cloud,
setCredentials
est appelé depuis le cloud vers l'appareil Cast, à condition que :
identifiants de connexion. Les applications qui écrivent une application Web Receiver peuvent ensuite utiliser
setCredentials
pour exploiter DRM si nécessaire. Voici un exemple
à l'aide des identifiants
pour construire le média.
Conseil: Consultez également la section Charger des contenus multimédias à l'aide de contentId, contentUrl et entity.
Gestion du canal audio
Lorsque le lecteur Cast charge un contenu multimédia, il configure un seul tampon de source audio. À en même temps, il sélectionne également un codec approprié à utiliser par le tampon, en fonction du type MIME de la piste principale. Un nouveau tampon et un nouveau codec sont configurés:
- lorsque la lecture commence,
- à chaque coupure publicitaire,
- chaque fois que le contenu principal reprend.
Parce que le tampon utilise un seul codec et que le codec est choisi en fonction du titre principal, il arrive que des canaux secondaires filtrées et ne sont pas entendues. Cela peut se produire lorsqu'un programme multimédia piste est en son surround, mais les pistes audio secondaires utilisent un son stéréo. Parce que les pistes secondaires sont souvent utilisées pour proposer du contenu dans des langues, le fait de proposer des contenus multimédias avec un nombre différent de pistes impact important, comme l'incapacité pour un grand nombre de spectateurs d'entendre dans leur langue maternelle.
Les scénarios suivants montrent pourquoi il est important de fournir des où les canaux principaux et secondaires contiennent le même nombre de chaînes:
Scénario 1 : aucun canal n'est disponible dans le flux multimédia Parité principale et secondaire:
- Anglais - Canal AC-3 5.1 (principal)
- suédois - AAC 2-channel
- Français - AAC 2 canaux
- allemand - AAC 2 canaux
Dans ce scénario, si la langue du lecteur est définie sur une autre langue que anglais, l'utilisateur n'entend pas le titre qu'il s'attend à entendre, car tous les pistes bicanaux sont filtrées lors de la lecture. Le seul titre serait le canal principal AC-3 5.1, et ce n'est que lorsque la langue est définie sur Anglais.
Scénario 2 : Flux multimédia avec chaîne Parité principale et secondaire:
- Anglais - Canal AC-3 5.1 (principal)
- suédois - AC-3 5.1 channel
- français - AC-3 canal 5.1
- allemand - Canal AC-3 5.1
Comme les titres de cette diffusion ont tous le même nombre de chaînes, une audience le son quelle que soit la langue sélectionnée.
Gestion du canal audio Shaka
Par défaut, le lecteur Shaka (DASH) utilise un nombre de canaux préféré de deux, comme mesure d'atténuation lorsqu'un contenu multimédia n'est pas assez semblable des pistes audio.
Si la piste principale n'est pas dotée d'un son surround (par exemple, une piste stéréo titre), le lecteur Shaka utilise par défaut deux canaux, et filtre automatiquement toutes les pistes multimédias secondaires qui comportent plus de canaux de distribution.
Vous pouvez aussi configurer le nombre
de canaux audio préféré de Shaka
preferredAudioChannelCount
dans la propriété shakaConfig
cast.framework.PlaybackConfig.
Exemple :
shakaConfig = { "preferredAudioChannelCount": 6 };
Lorsque preferredAudioChannelCount
est défini sur 6, le lecteur Shaka vérifie si
Il est compatible avec les codecs de son surround (AC-3
ou EC-3
).
filtre automatiquement toutes les pistes multimédias qui ne sont pas conformes
le nombre de canaux.