Pakiet SDK odbiornika internetowego obsługuje 3 typy protokołów strumieniowania.
DASH Aktywne HTTP Strumieniowe przesyłanie danych oraz Płynne strumieniowanie.
W tym dokumencie opisujemy obsługiwane protokoły transmisji strumieniowej. Notatka objaśnienie tagów obsługiwanych przez każdy protokół jest dość skrócone w porównaniu ze szczegółową specyfikacją protokołu. Ma to na celu zapewnienie szybko zrozumieć, jak używać poszczególnych protokołów i których funkcji jest obsługiwanych na urządzeniach obsługujących Cast, strumieniowanie danych.
Dynamiczne adaptacyjne strumieniowe przesyłanie danych przez HTTP (DASH)
ISO szczegółową specyfikację DASH.
DASH to protokół strumieniowego przesyłania danych z adaptacyjną szybkością transmisji bitów, który umożliwia odtwarzanie wideo wysokiej jakości.
przez serwery HTTP(S). Plik manifestu w formacie XML zawiera większość
o metadanych dotyczących sposobu inicjowania i pobrania filmu
treści. Główne koncepcje obsługiwane przez odtwarzacz internetowy to <Period>
,
<AdaptationSet>
, <Representation>
, <SegmentTemplate>
,
<SegmentList>
, <BaseUrl>
i <ContentProtection>
.
Plik manifestu DASH zaczyna się od głównego tagu <MPD>
i w środku zawiera jeden lub
więcej tagów <Period>
, które reprezentują jedną transmisję strumieniową.
Tagi <Period>
umożliwiają porządkowanie różnych fragmentów treści przesyłanych strumieniowo
i często służą do oddzielania głównej treści od reklamy lub kilku
następujących po sobie treści wideo.
<AdaptationSet>
poniżej <MPD>
to zbiór reprezentacji dla
jeden rodzaj strumienia multimediów, najczęściej wideo, audio lub napisy. Najbardziej
Powszechnie obsługiwane typy MIME to „video/mp4”, „audio/mp4” i „text/vtt”. An
można uwzględnić opcjonalne pole <ContentComponent contentType="$TYPE$">
poniżej <AdaptationSet>
.
W każdym elemencie <AdaptationSet>
powinna znajdować się lista <Representation>
tagów,
będzie dostępny, a odtwarzacz internetowy użyje informacji codecs
do
zainicjuj bufor źródłowy MSE i informacje bandwidth
, aby
automatycznie wybrać właściwą reprezentację/szybkość transmisji bitów podczas odtwarzania.
W przypadku każdej wartości <Representation>
segmenty multimediów są opisane za pomocą jednej z tych metod:
<BaseURL>
oznacza reprezentację pojedynczego segmentu, <SegmentList>
dla
listy segmentów (podobne do HLS) lub <SegmentTemplate>
.
W przypadku <SegmentTemplate>
wskazuje, jak segment inicjowania
segmenty multimediów mogą być reprezentowane przez szablony. W przykładzie poniżej
$Number$
wskazuje numer segmentu dostępny w sieci CDN. Czyli
zmieni się na seg1.m4s, seg2.m4s itd. w miarę odtwarzania.
<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>
W przypadku <SegmentTemplate>
często używa się tagu <SegmentTimeline>
do
wskazują, jak długie są poszczególne segmenty i które się powtarzają. timescale
(jednostki reprezentujące jedną sekundę) jest często dołączana do atrybutów
<SegmentTemplate>
, abyśmy mogli obliczyć czas segmentu na podstawie
w tej jednostce. W poniższym przykładzie tag <S>
oznacza tag segmentu,
Atrybut d
określa długość segmentu i atrybut r
.
określa liczbę powtórzonych segmentów o tym samym czasie trwania, tak aby $Time$
można obliczyć poprawnie, aby pobrać segment multimediów zgodnie z opisem w
atrybut 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>
Oto przykład reprezentacji właściwości <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>
W plikach z pojedynczym segmentem często używa się właściwości <SegmentBase>
z bajtami.
żądań zakresu, aby określić, która część pliku <BaseURL>
zawiera
a reszta – na żądanie w trakcie odtwarzania
co się dzieje. W tym miejscu zakres Initialization
określa zakres metadanych init
a indexRange
określa indeks segmentów multimediów. Pamiętaj, że
obecnie obsługujemy tylko kolejne zakresy bajtów.
<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>
Niezależnie od tego, jaka reprezentacja zostanie użyta, jeśli strumienie są chronione,
Sekcja <ContentProtection>
może występować pod: <AdaptationSet>
,
w którym schemeIdUri
jednoznacznie identyfikuje system DRM, którego ma użyć.
W celu standardowego szyfrowania możesz dołączyć opcjonalny identyfikator klucza.
<!-- 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>
Więcej przykładów i szczegółów znajdziesz w specyfikacji MPEG-DASH. Poniżej znajduje się lista dodatkowych atrybutów DASH w tagach, które nie zostały wymienione powyżej które obecnie obsługujemy:
Nazwa atrybutu | Funkcja atrybutu |
---|---|
mediaPresentationDuration | Czas trwania treści wideo. |
minimumUpdatePeriod | Atrybut tagu <MPD> ; określa, jak często
, aby ponownie załadować plik manifestu. |
typ | Atrybut tagu <MPD> ; „dynamiczna” wskazuje, że
to jest transmisja na żywo. |
presentationTimeOffset | Atrybut tagu <SegmentBase> ; określa
przesunięcie czasu prezentacji od początku okresu. |
startNumber | Określa numer pierwszego segmentu multimediów w prezentacji w okresu przejściowego. Jest on często używany w transmisjach na żywo. |
Obsługujemy też rozpoznawanie pola EMSG we fragmentach MP4 w przypadku DASH i
podaj
EmsgEvent
.
z myślą o deweloperach.
Choć nasz obecny odtwarzacz internetowy obsługuje główne zastosowania DASH, tutaj to lista typowych atrybutów, których obecna implementacja DASH ignoruje lub nie używa. Oznacza to, że niezależnie od tego, czy plik manifestu zawiera nie mają wpływu na odtwarzanie treści.
- availabilityStartTime
- segmentAlignment
Transmisja na żywo przez HTTP (HLS)
Można uzyskać ogólny obraz i pełną specyfikację transmisji na żywo przez HTTP. tutaj.
Jedną z głównych zalet odbiornika internetowego jest możliwość odtwarzania HLS w MSE. W przeciwieństwie do DASH, gdzie plik manifestu zawiera pojedynczy plik danych, HLS wysyła playlistę reklamy nadrzędnej, która zawiera listę wszystkich strumieni wariantów odpowiednim adresem URL. Playlista wariantów to playlista multimediów. Obie główne tagi HLS, które obecnie odtwarzacz internetowy obsługuje w module nadrzędnym. playlisty to:
Nazwa tagu | Funkcjonalność |
---|---|
#EXT-X-STREAM-INF | Określa szybkość transmisji bitów lub wersję strumienia. Atrybut BANDWIDTH to
wymagany, który obsługuje wybór przesyłania strumieniowego z adaptacyjną szybkością transmisji bitów.
Do inicjowania MSE zdecydowanie zalecany jest atrybut CODECS , taki jak
jako "avc1.42c01e,mp4a.40.2" . Jeśli nie określono tego ustawienia, domyślnie zostanie użyta wielkość liter
ustawiono na profil główny H264 w formacie wideo 3.0 i zakodowany dźwięk "mp4a.40.2"
treści. |
#EXT-X-MEDIA | Określa dodatkową playlistę multimediów (w atrybucie URI ), która
reprezentują treści. Są to zwykle alternatywne strumienie audio w innych
(dźwięk przestrzenny 5.1) lub język. Atrybut „TYPE ”
zawierające VIDEO , AUDIO ,
Dozwolone wartości: SUBTITLES i CLOSED-CAPTIONS . Ustawienie
atrybut DEFAULT do YES wskaże wybór
ten alternatywny strumień. |
Oto lista tagów HLS, w których obecnie odbiornik internetowy obsługuje playlista multimediów:
Nazwa tagu | Funkcjonalność |
---|---|
#EXTINF | Informacje o strumieniu, po których następuje zwykle czas trwania segmentu w w kolejnych sekundach, a w kolejnym wierszu podaj adres URL segmentu. |
#EXT-X-TARGETDURATION | Czas trwania każdego segmentu (w sekundach). Określa również, jak często pobrać lub odświeżyć plik manifestu playlisty transmisji na żywo. Odbiornik internetowy Odtwarzacz nie obsługuje czasów trwania krótszych niż 0,1 s. |
#EXT-X-MEDIA-SEQUENCE | Numer porządkowy (często w przypadku transmisji na żywo), w którym pierwszy segment reprezentowanych przez playlistę. |
#EXT-X-KEY | informacje o kluczu DRM. Atrybut METHOD informuje nas, jaki klucz
systemu. Dziś wspieramy AES-128 i SAMPLE-AES
, |
#EXT-X-BYTERANGE | Zakres bajtów do pobrania dla adresu URL segmentu. |
#EXT-X-DISCONTINUITY | Określa nieciągłość między kolejnymi segmentami. Często widzimy to dzięki funkcji wstawiania reklam po stronie serwera. Segment reklamy pojawia się w środku głównym nurcie. |
#EXT-X-PROGRAM-DATE-TIME | Bezwzględny czas pierwszej próbki następnego segmentu, na przykład "2016-09-21T23:23:52.066Z". |
#EXT-X-ENDLIST | Od tego, czy jest to VOD czy transmisja na żywo. |
W przypadku transmisji na żywo korzystamy z tych kanałów: #EXT-X-PROGRAM-DATE-TIME
i #EXT-X-MEDIA-SEQUENCE
jako kluczowe czynniki decydujące o tym, jak scalić nowo odświeżony plik manifestu. Jeśli
identyfikator #EXT-X-PROGRAM-DATE-TIME
służy do dopasowywania odświeżonych segmentów.
W przeciwnym razie zostanie użyty numer #EXT-X-MEDIA-SEQUENCE
. Pamiętaj, że zgodnie z
Specyfikacja HLS. Do dopasowywania nie używamy porównania nazw plików.
Nasza implementacja HLS obsługuje wybór alternatywnego strumienia audio, np.
dźwięku przestrzennego 5.1 jako głównego odtwarzania dźwięku, Aby to zrobić,
używając tagu #EXT-X-MEDIA
z alternatywnymi kodekami, a także
format segmentu w konfiguracji strumienia.
Odtwarzacz internetowy wymaga określonego działania zgodnego ze specyfikacją. Na przykład po
#EXT-INF
, oczekujemy identyfikatora URI. Jeśli nie jest to identyfikator URI, na przykład
#EXT-X-DISCOUNTINUITY
spowoduje błąd analizy playlisty.
Co #EXT-X-TARGETDURATION
s odświeżamy playlistę lub plik manifestu, aby wyświetlać
nowych list segmentów. Aktualizujemy też nową reprezentację wszystkich
do nowego segmentu. Za każdym razem, gdy żądane jest wyszukiwanie, wyszukujemy tylko w ciągu
zakresu, który można przewijać. W przypadku transmisji na żywo zezwalamy na wyszukiwanie tylko od początku
najnowszą listę do trzech docelowych długości od końca. Na przykład:
jeśli lista zawiera 10 segmentów i jesteś w segmencie 6, możesz przewijać do góry
do 7, ale nie do 8.
Obsługa formatu segmentu
Pakiet SDK CAF obsługuje odtwarzanie treści dostarczanych w różnych formatach zgodnie z wymaganiami
w: HlsSegmentFormat
dla dźwięku i HlsVideoSegmentFormat
dla wideo. Obejmuje to obsługę
spakowany dźwięk
np. odtwarzania w formacie AAC i AC3, zarówno zaszyfrowanej, jak i niezaszyfrowanej. To pole jest wymagane
w sekcji MediaInformation
LoadRequestData
w celu prawidłowego opisania treści w odtwarzaczu. Jeśli go nie podasz,
domyślna konfiguracja odtwarzacza będzie próbowała odtworzyć treści z ustawieniem Transport.
Odtwarzaj treści w pakiecie. Tę właściwość można ustawić od dowolnego nadawcy w
żądanie wczytania danych (Android,
iOS
i Sieć)
lub w odbiorniku za pomocą modułów
przechwytujących wiadomości.
Zapoznaj się z przykładowym kodem Fragment poniżej lub Wczytywanie multimediów za pomocą pola contentId, contentUrl i encji. .
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;
});
Ochrona treści
Zgodnie z informacjami w sekcji dotyczącej tagu #EXT-X-KEY
powyżej pakiet SDK Cast obsługuje
SAMPLE-AES
lub SAMPLE-AES-CTR
, gdzie identyfikator URI klucza jest wektorem inicjującym
można określić:
EXT-X-KEY: METHOD=SAMPLE-AES, \
URI="data:text/plain;base64,XXXXXX", \
IV=0x6df49213a781e338628d0e9c812d328e, \
KEYFORMAT="com.widevine", \
KEYFORMATVERSIONS="1"
Obsługiwany obecnie przez nas obiekt KEYFORMAT
to Widevine, a identyfikator URI zawiera element
Informacje o DRM XXXXXXX
zakodowane w BASE64, które po zdekodowaniu zawierają identyfikator klucza:
{
"content_id": "MTQ1NjkzNzM1NDgxNA==",
"key_ids": [
"xxxxxxxxxxxxxxxx"
]
}
Wersja 1 definiuje te atrybuty:
Atrybut | Przykład | Opis |
---|---|---|
KEYFORMATVERSIONS |
"1" |
Ta oferta pakietowa definiuje wersję 1 formatu klucza |
KEYFORMAT |
"urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" |
Identyfikator UUID to identyfikator UUID Widevine z DASH IF IOP. Ten sam dokładny ciąg jest używany w MPD w strumieniach zaszyfrowanych przez Widevine. |
URI |
"data:text/plain;base64, <base64 encoded PSSH box>" |
Identyfikator URI strumienia zawierającego typ danych i pole PSSH. |
METHOD |
SAMPLE-AES-CTR |
Wskazuje mechanizm szyfrowania używany podczas szyfrowania treści. SAMPLE-AES sygnalizuje, że treść jest szyfrowana przy użyciu parametru „cbcs”. SAMPLE-AES-CTR sygnalizuje, że treści są szyfrowane przy użyciu jednego ze schematów zabezpieczeń AES-CTR, czyli „cenc”. |
Atrybuty zmapowane na MPD DASH:
Atrybut | Opis |
---|---|
KEYFORMAT |
Atrybut schemaIdUri elementu ContentProtection. |
URI |
Zawartość elementu cenc:pssh. |
KEYID |
16-bajtowy ciąg szesnastkowy kodujący identyfikator klucza, który ma tę samą rolę co default_kid w MPEG DASH. W przypadku hierarchicznego schematu kluczy byłby to „root” . |
Przykładowa playlista HLS z sygnałem 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
Poniżej znajduje się lista funkcji i tagów HLS, których obecnie nie używamy lub . Ich obecność lub nieobecność nie ma wpływu na działanie transmisji na żywo.
- Atrybut
RESOLUTION=
w obiekcie#EXT-X-STREAM-INF
jest ignorowany. - Atrybut
AUTOSELECT=
w#EXT-X-MEDIA
nie jest używany. Zamiast tego polegamy naDEFAULT=
- Element
#EXT-X-I-FRAME-STREAM-INF
na playliście reklamy nadrzędnej jest ignorowany. - Element
#EXT-X-DISCONTINUITY-SEQUENCE
jest ignorowany #EXT-X-PLAYLIST-TYPE:EVENT
może brać udział w transmisji na żywo,#EXT-X-PLAYLIST-TYPE:VOD
może być obecna w strumieniu VOD, ale obecnie nasze Odtwarzacz internetowy wymaga jedynie istnienia dodatku#EXT-X-ENDLIST
do porównanie transmisji na żywo i transmisji na żywo filmy na żądanie.
Płynne strumieniowanie
Oficjalna aplikacja Microsoft Specyfikacja sprawnego przesyłania strumieniowego.
Płynne strumieniowanie zapewnia protokół strumieniowego przesyłania danych adaptacyjnych i specyfikację XML przez HTTP (podobnie jak DASH). W odróżnieniu od DASH zalecenia „Płynne strumieniowanie” tylko w formacie MPEG-4 dla segmentów multimedialnych.
W tej tabeli znajdziesz najczęściej używane tagi i atrybuty w funkcji płynnego przesyłania, które który jest obecnie obsługiwany przez odtwarzacz internetowy. Wiele pojęć zostało już wyjaśnionych w sekcji DASH powyżej.
Tag/atrybut | Wykorzystanie |
---|---|
<SmoothStreamingMedia> | Główny tag pliku manifestu, który zawiera atrybuty:
|
<StreamIndex> | Jeden zestaw strumieni podobny do zestawu AdaptationSet w formacie DASH. Typowy typ to „text”, „video” lub „audio”. Atrybut url zazwyczaj zawiera szablon Fragment adresu URL z zastosowaniem informacji takich jak szybkość transmisji bitów lub czas rozpoczęcia. |
<QualityLevel> | Każdy tag QualityLevel określa szybkość transmisji bitów i kodek FourCC. FourCC często mają postać „H264”, „AVC1”, „AACL” itd. W przypadku filmów wideo w maksymalnych rozdzielczościach MaxWidth i MaxHeight. W przypadku reklam audio określa on częstotliwości (np. 44100) przy użyciu częstotliwości próbkowania i liczby kanałów. |
<c> | Element z fragmentem strumienia. Zawiera:
|
<Protection> | Tag z opcjonalnym atrybutem SystemID z listą identyfikatora systemu DRM zostanie zastosowane w <SmoothStreamingMedia> . |
<ProtectionHeader> | Atrybut <Protection> w sekcji <Protection> może zawierać atrybut SystemID i custom danych, zwykle w kodowaniu Base64. W przypadku Widevine zawiera identyfikator klucza długość, identyfikator algorytmu, np. AESCTR, LA_URL (adres URL pozyskania licencji) LUI_URL (adres URL interfejsu użytkownika licencji) oraz DS_ID (identyfikator usługi domeny). |
Ochrona treści
Aby prawidłowo zakodować identyfikatory systemu ochrony, użyj tego mapowania:
- WIDEVINE: 'EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED',
- CLEARKEY: '1077EFEC-C0B2-4D02-ACE3-3C1E52E2FB4B',
- MPEG_DASH_MP4PROTECTION: 'URN:MPEG:DASH:MP4PROTECTION:2011'
Poniżej znajdziesz przykład użycia danych z kodem Base64 w przypadku <ProtectionHeader>
.
danych po zdekodowaniu mają taki sam format jak
Pomoc dotycząca ochrony treści DASH.
<Protection>
<ProtectionHeader SystemID="9a04f079-9840-4286-ab92-e65be0885f95">
$BASE64ENCODED_DATA
</ProtectionHeader>
</Protection>
Poniżej znajdziesz przykładowy plik manifestu płynnej transmisji na żywo o długości 3000 sekund czas trwania treści:
<?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>
W powyższym przykładzie strumienia wideo szablon URL wygląda tak:
QualityLevels({bitrate})/Fragments(video={start time})
Pierwsze 2 segmenty (przy założeniu, że mamy indeks jakości na poziomie 2.) następujący z początkowym czasem wyodrębnionym z t="80649401378125" pod StreamIndex filmu i przyrost czasu o 4 sekundy * 1 000 000 na segment:
QualityLevels(2)/Fragments(video=80649401378125) QualityLevels(2)/Fragments(video=80649441378125) ...
Oto lista atrybutów Smooth Streaming, które obecnie ignorujemy i które są nie mają wpływu na strumieniowanie danych niezależnie od tego, czy są one dostępne:
- CanSeek, CanPause w tagu
<SmoothStreamingMedia>
. - Fragmenty, QualityLevels w tagu
<StreamIndex>
. Zamiast tego obliczamy: liczbę segmentów i liczbę poziomów jakości z uwzględnieniem informacji. podawane w elemencie<StreamIndex>
, np. w rzeczywistym taguQualityLevel
i tagu Tagi:<c>
. - BitsPerSample i PacketSize w
<QualityLevel>
nie są używane.
Sprawdź typ wyświetlania
canDisplayType
sprawdza możliwości wideo i audio odbiornika internetowego oraz
weryfikacji parametrów mediów i zwróceniu wartości logicznej. Wszystkie
, ale pierwsze z nich są opcjonalne – im więcej parametrów określisz,
będzie dokładniejsze.
Jego podpis to canDisplayType(<em>mimeType</em>,<em>codecs</em>,<em>width</em>,<em>height</em>,<em>framerate</em>)
Przykłady:
Sprawdza, czy odbiornik internetowy i wyświetlacz obsługują wideo/mp4 typ MIME z tym kodekiem, wymiarami i liczbą klatek na sekundę:
canDisplayType("video/mp4", "avc1.42e015,mp4a.40.5", 1920, 1080, 30)
Sprawdza, czy odbiornik internetowy i wyświetlacz obsługują format wideo 4K na ten kodek, określając szerokość 3840 i wysokość 2160:
canDisplayType("video/mp4", "hev1.1.2.L150", 3840, 2160)
Sprawdza, czy odbiornik internetowy i wyświetlacz obsługują HDR10 w przypadku tego kodeka. wymiary i liczbę klatek.
canDisplayType("video/mp4", "hev1.2.6.L150", 3840, 2160, 30)
Sprawdza, czy odbiornik internetowy i wyświetlacz obsługują Dolby Vision (DV) ten kodek, wymiary i liczbę klatek:
canDisplayType("video/mp4", "dvhe.04.06", 1920, 1080, 30)
DRM
Niektóre treści multimedialne wymagają zarządzania prawami cyfrowymi (DRM). Treści multimedialne
które ma licencję DRM (i adres URL klucza) zapisaną w pliku manifestu (DASH lub HLS);
pakiet Cast SDK zajmie się tym za Ciebie. Część tych treści wymaga elementu
licenseUrl
który jest potrzebny do uzyskania klucza do odszyfrowywania. W odbiorniku internetowym możesz używać
PlaybackConfig
, aby odpowiednio ustawić licenseUrl
.
Fragment kodu poniżej pokazuje, jak skonfigurować żądanie informacji o licencji
żądań, takich jak 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;
});
Jeśli korzystasz z integracji z Asystentem Google, niektóre informacje dotyczące DRM, takie jak
dane logowania potrzebne do uzyskania dostępu do treści mogą być powiązane bezpośrednio z
konta Google za pomocą mechanizmów takich jak OAuth/SSO. W takich przypadkach, jeśli
treści multimedialne są ładowane za pomocą głosu lub pobierane z chmury,
Funkcja setCredentials
jest wywoływana z chmury do urządzenia przesyłającego pod warunkiem, że:
dane logowania. Aplikacje tworzące aplikację odbiornika internetowego mogą następnie używać
setCredentials
informacje potrzebne do obsługi DRM. Oto przykład
za pomocą danych logowania do utworzenia nośnika.
Wskazówka: zobacz też Wczytywanie multimediów za pomocą ContentId, contentUrl i encji.
Obsługa kanałów audio
Gdy odtwarzacz Cast wczytuje multimedia, konfiguruje się pojedynczy bufor źródła dźwięku. Na jednocześnie wybiera odpowiedni kodek do użycia przez bufor. według typu MIME ścieżki głównej. Skonfigurujesz nowy bufor i kodek:
- po rozpoczęciu odtwarzania,
- w każdej przerwie na reklamę,
- za każdym razem, gdy wznowiona jest główna zawartość.
Ponieważ bufor używa jednego kodeka i jest on wybrany zgodnie ze ścieżką główną, zdarzają się sytuacje, w których ścieżki dodatkowe mogą być odfiltrowanych i nie usłyszeć. Może się tak zdarzyć, gdy głównym celem programu jest dźwięk przestrzenny, a dodatkowe ścieżki audio używają dźwięku stereo. Ponieważ utwory dodatkowe są często wykorzystywane jako alternatywne treści, w różnych językach, multimedia zawierające różną liczbę ścieżek mogą mieć mają znaczący wpływ, na przykład przez dużą liczbę widzów, którzy nie słyszą, treści w ich ojczystym języku.
Poniższe scenariusze ilustrują, dlaczego tak ważne jest, by zaprogramować gdzie ścieżka główna i dodatkowa zawierają taką samą liczbę kanałów:
Scenariusz 1 – strumień multimediów nie ma kanału spójność między ścieżkami podstawowymi i dodatkowymi:
- angielski – kanał AC-3 5.1 (podstawowy)
- szwedzki – 2-kanałowy AAC
- francuski – 2-kanałowy AAC
- niemiecki – 2-kanałowy AAC
W tym scenariuszu, jeśli język gracza jest inny niż angielski, użytkownik nie słyszy utworu, którego spodziewał się usłyszeć, ponieważ wszystkie są odfiltrowywane podczas odtwarzania. Jedyny utwór, można było odtworzyć tylko na głównym kanale 5.1 AC-3, a potem tylko wtedy, gdy język jest ustawiony na angielski.
Scenariusz 2 – strumień multimediów z kanałem spójność między ścieżkami podstawowymi i dodatkowymi:
- angielski – kanał AC-3 5.1 (podstawowy)
- szwedzki – kanał AC-3 5.1
- francuski – kanał AC-3 5.1
- niemiecki – kanał AC-3 5.1
Wszystkie ścieżki audio zawierają tę samą liczbę kanałów, usłyszysz ścieżkę niezależnie od wybranego języka.
Obsługa kanałów audio Shaka
Odtwarzacz Shaka (DASH) domyślnie ustawia preferowaną liczbę kanałów na dwa. środek łagodzenia skutków zetknięcia z mediami o niespójności w obszarze ścieżek audio.
Jeśli główna ścieżka audio nie jest dźwiękiem przestrzennym (na przykład dwukanałowy dźwięk stereo, track), odtwarzacz Shaka domyślnie ustawi 2 kanały i automatycznie odfiltrowuje dodatkowe ścieżki multimedialne, które zawierają więcej niż 2 pliki kanałów.
Preferowaną przez Shakę liczbę kanałów audio można też skonfigurować za pomocą ustawienia
preferredAudioChannelCount
we właściwości shakaConfig
w
cast.framework.PlaybackConfig.
Na przykład:
shakaConfig = { "preferredAudioChannelCount": 6 };
Gdy preferredAudioChannelCount
ma wartość 6, odtwarzacz Shaka sprawdza, czy
obsługuje kodeki dźwięku przestrzennego (AC-3
lub EC-3
),
automatycznie odfiltrowuje wszystkie ścieżki multimedialne, które nie są zgodne z preferowanymi
liczby kanałów.