Protokoły strumieniowego przesyłania danych z odbiornika internetowego

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 &quot;2016-09-21T23:23:52.066Z&quot;.
#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 na DEFAULT=
  • 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
&lt;SmoothStreamingMedia&gt; Główny tag pliku manifestu, który zawiera atrybuty:
  • TimeScale: liczba jednostek reprezentujących 1 sekundę, zwykle przyrostowy 10 000 000.
  • Czas trwania: czas trwania treści w skali czasowej. Internetowy odbiornik nie obsługuje czasów trwania krótszych niż 0,1 s.
  • IsLive: określa, czy plik manifestu jest aktywny.
&lt;StreamIndex&gt; 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.
&lt;QualityLevel&gt; 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.
&lt;c&gt; Element z fragmentem strumienia. Zawiera:
  • d: czas trwania fragmentu.
  • t: czas mediów fragmentu.
&lt;Protection&gt; Tag z opcjonalnym atrybutem SystemID z listą identyfikatora systemu DRM zostanie zastosowane w <SmoothStreamingMedia> .
&lt;ProtectionHeader&gt; 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 tagu QualityLevel 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.