Protokol Streaming Pemutar Penerima Web

Web Receiver SDK mendukung tiga jenis protokol {i>streaming <i}hari ini:

DASH, HTTP Live Streaming, dan Streaming Lancar.

Dalam dokumen ini, kami mencantumkan dukungan untuk setiap protokol streaming. Catatan penjelasan mengenai {i>tag<i} yang didukung untuk setiap protokol dipersingkat dibandingkan dengan spesifikasi protokol terperinci. Tujuannya adalah untuk menyediakan gambaran singkat dan pemahaman tentang cara menggunakan setiap protokol, dan fitur mana protokol didukung di perangkat yang kompatibel untuk Cast guna mengirimkan pengalaman {i>streaming<i}.

Streaming Adaptif Dinamis melalui HTTP (DASH)

ISO spesifikasi DASH yang lebih mendetail.

DASH adalah protokol streaming kecepatan bit adaptif yang memungkinkan video berkualitas tinggi yang melakukan streaming melalui server HTTP(S). Manifes, yang tersusun dalam XML, berisi sebagian besar informasi metadata tentang cara menginisialisasi dan mendownload video saat ini. Konsep utama yang didukung Web Receiver Player adalah <Period>, <AdaptationSet>, <Representation>, <SegmentTemplate>, <SegmentList>, <BaseUrl>, dan <ContentProtection>.

Manifes DASH dimulai dengan tag <MPD> root dan di dalamnya menyertakan satu atau lebih banyak tag <Period>, yang mewakili satu konten streaming. Tag <Period> memungkinkan pengurutan berbagai bagian konten streaming serta sering digunakan untuk memisahkan konten utama dan iklan atau beberapa konten video secara berurutan.

<AdaptationSet> pada <MPD> adalah kumpulan representasi untuk satu jenis {i>streaming <i}media, dalam banyak kasus, video, audio, atau teks. Paling sering mimetype yang umum didukung adalah "video/mp4", "audio/mp4", dan "text/vtt". Channel <ContentComponent contentType="$TYPE$"> opsional dapat disertakan di bawah <AdaptationSet>.

Di dalam setiap <AdaptationSet>, daftar tag <Representation> harus ditampilkan dan Pemutar Penerima Web menggunakan informasi codecs untuk melakukan inisialisasi buffer sumber MSE dan informasi bandwidth untuk otomatis memilih representasi/kecepatan bit yang tepat untuk dimainkan.

Untuk setiap <Representation>, segmen media dideskripsikan menggunakan <BaseURL> untuk representasi segmen tunggal, <SegmentList> untuk daftar segmen (mirip dengan HLS), atau <SegmentTemplate>.

Untuk <SegmentTemplate>, hal ini menunjukkan bagaimana inisialisasi segmen dan segmen media ini dapat diwakili melalui template. Dalam contoh di bawah ini $Number$ menunjukkan nomor segmen yang tersedia dari CDN. Jadi, dan menerjemahkannya menjadi seg1.m4s, seg2.m4s, dll. ketika pemutaran berlanjut.

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

Untuk <SegmentTemplate>, biasanya tag <SegmentTimeline> digunakan untuk menunjukkan berapa lama setiap segmen dan segmen mana yang berulang. timescale (unit untuk mewakili satu detik) sering disertakan sebagai bagian dari atribut <SegmentTemplate> sehingga kita bisa menghitung waktu segmen berdasarkan unit ini. Dalam contoh di bawah, tag <S> menandakan tag segmen, yaitu Atribut d menentukan durasi segmen dan atribut r menentukan jumlah segmen berulang dengan durasi yang sama sehingga $Time$ dapat dihitung dengan benar untuk mendownload segmen media sebagaimana ditentukan dalam atribut 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>

Untuk representasi menggunakan <SegmentList>, berikut adalah contohnya:

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

Untuk file segmen tunggal, <SegmentBase> sering digunakan dengan byte rentang untuk menentukan bagian mana dari file <BaseURL> yang berisi indeks, dan sisanya dapat diambil sesuai permintaan saat pemutaran berlanjut atau mencari terjadi. Di sini, rentang Initialization menentukan rentang metadata init dan indexRange menentukan indeks untuk segmen media. Perlu diketahui bahwa saat ini kami hanya mendukung rentang byte berturut-turut.

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

Terlepas dari representasi yang digunakan, jika aliran data dilindungi, maka Bagian <ContentProtection> dapat muncul di bagian <AdaptationSet>, dengan schemeIdUri secara unik mengidentifikasi sistem DRM yang akan digunakan. ID kunci opsional dapat disertakan untuk enkripsi umum.

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

Untuk contoh dan detail lebih lanjut, lihat spesifikasi MPEG-DASH. Di bawah ini adalah daftar atribut DASH tambahan pada tag yang tidak disebutkan di atas yang saat ini kami dukung:

Nama Atribut Fungsi Atribut
mediaPresentationDuration Durasi konten video.
minimumUpdatePeriod Atribut tag <MPD>; menentukan seberapa sering kita perlu untuk memuat ulang manifes.
jenis Atribut tag <MPD>; "dinamis" untuk menunjukkan bahwa ini adalah live stream.
presentationTimeOffset Atribut tag <SegmentBase>; menentukan selisih waktu presentasi dari awal periode.
startNumber Menentukan jumlah segmen media pertama dalam presentasi di titik. Elemen ini sering digunakan dalam live stream.

Kami juga mendukung pengenalan kotak EMSG di dalam fragmen MP4 untuk DASH dan sediakan EmsgEvent kepada pengembang.

Meskipun Pemutar Penerima Web kami saat ini mendukung kasus penggunaan DASH utama, di sini adalah daftar atribut umum yang digunakan oleh implementasi DASH kami saat ini diabaikan atau tidak digunakan. Artinya, terlepas dari apakah manifes berisi mereka, perubahan ini tidak berdampak pada pengalaman pemutaran konten.

  • availabilityStartTime
  • segmentAlignment

HTTP Live Streaming (HLS)

Ringkasan dan spesifikasi lengkap live streaming HTTP dapat diperoleh di sini.

Salah satu kekuatan utama Pemutar {i>Web Receiver <i}adalah kemampuannya untuk pemutaran HLS dalam MSE. Berbeda dengan DASH, yang memungkinkan manifes dalam bentuk satu file tersebut, HLS akan mengirimkan playlist master yang berisi daftar semua streaming varian dengan URL-nya masing-masing. Playlist varian adalah playlist media. Dua tag HLS utama yang saat ini didukung Pemutar Web Receiver di master playlist adalah:

Nama Tag Fungsi
#EXT-X-STREAM-INF Menentukan streaming kecepatan bit/varian. Atribut BANDWIDTH memiliki diperlukan yang mendukung pemilihan streaming kecepatan bit adaptif. Tujuan Atribut CODECS sangat direkomendasikan untuk menginisialisasi MSE, seperti sebagai "avc1.42c01e,mp4a.40.2". Jika tidak ditentukan, kasus defaultnya adalah disetel ke video 3.0 profil utama H264 dan audio "mp4a.40.2" yang dienkode saat ini.
#EXT-X-MEDIA Menentukan playlist media tambahan (di atribut URI) yang mewakili kontennya. Ini biasanya adalah streaming audio alternatif di format (suara surround 5.1) atau bahasa. Atribut TYPE yang berisi VIDEO, AUDIO, SUBTITLES, atau CLOSED-CAPTIONS diizinkan. Latar (Setting) atribut DEFAULT ke YES akan menunjukkan pemilihan aliran alternatif ini secara {i>default<i}.

Berikut adalah daftar tag HLS yang saat ini didukung Pemutar Penerima Web playlist media:

Nama Tag Fungsi
#EXTINF Informasi streaming, biasanya diikuti oleh durasi segmen di detik, dan baris berikutnya URL segmen.
#EXT-X-TARGETDURATION Berapa lama setiap segmen dalam detik. Ini juga menentukan seberapa sering kita mendownload/memuat ulang manifes playlist untuk live stream. Penerima Web Pemutar tidak mendukung durasi kurang dari 0,1 detik.
#EXT-X-MEDIA-SEQUENCE Nomor urut (sering kali untuk live stream) yang digunakan segmen pertama dalam diwakili oleh playlist ini.
#EXT-X-KEY Informasi kunci DRM. Atribut METHOD memberi tahu kita kunci apa sistem apa pun untuk digunakan. Saat ini kami mendukung AES-128 dan SAMPLE-AES kami.
#EXT-X-BYTERANGE Rentang byte yang akan diambil untuk URL segmen.
#EXT-X-DISCONTINUITY Menentukan diskontinuitas di antara segmen yang berurutan. Hal ini sering terlihat dengan penyisipan iklan sisi server yang segmen iklannya muncul di tengah feed utama.
#EXT-X-PROGRAM-DATE-TIME Waktu absolut dari sampel pertama dari segmen berikutnya, misalnya &quot;2016-09-21T23:23:52.066Z&quot;.
#EXT-X-ENDLIST Baik berupa VOD maupun live stream.

Untuk live stream, kami menggunakan #EXT-X-PROGRAM-DATE-TIME dan #EXT-X-MEDIA-SEQUENCE sebagai faktor kunci untuk menentukan cara menggabungkan manifes yang baru diperbarui. Jika saat ini, #EXT-X-PROGRAM-DATE-TIME digunakan untuk mencocokkan segmen yang dimuat ulang. Jika tidak, nomor #EXT-X-MEDIA-SEQUENCE akan digunakan. Perhatikan bahwa sesuai dengan spesifikasi HLS, kami tidak menggunakan perbandingan nama file untuk pencocokan.

Implementasi HLS kami mendukung pemilihan streaming audio alternatif, seperti Suara surround 5.1, sebagai pemutaran audio utama. Hal ini dapat dicapai dengan memiliki tag #EXT-X-MEDIA dengan codec alternatif serta memberikan format segmen dalam konfigurasi streaming.

Pemutar Web Receiver mengharapkan perilaku per spesifikasi tertentu. Misalnya, setelah #EXT-INF, kita mengharapkan URI. Jika data itu bukan URI, misalnya #EXT-X-DISCOUNTINUITY akan menyebabkan penguraian playlist gagal.

Setiap #EXT-X-TARGETDURATION detik, kami memuat ulang playlist/manifes untuk mendapatkan daftar segmen baru dan memperbarui representasi internal baru dari semua segmen ke segmen yang baru. Setiap kali pencarian diminta, kami hanya mencari di dalam rentang yang dapat dicari. Untuk live, kami hanya mengizinkan pencarian dari awal daftar terbaru hingga tiga durasi target dari akhir. Sebagai contoh, jika memiliki daftar 10 segmen, dan berada di segmen 6, Anda hanya dapat mencari sampai 7, tetapi bukan 8.

Dukungan format segmen

CAF SDK mendukung pemutaran konten yang ditayangkan dalam berbagai format seperti yang direferensikan di HlsSegmentFormat untuk audio dan HlsVideoSegmentFormat untuk video. Hal ini termasuk dukungan untuk format audio seperti pemutaran AAC dan AC3, baik yang dienkripsi maupun yang tidak. Wajib diisi untuk menentukan informasi ini dalam MediaInformation dari LoadRequestData untuk mendeskripsikan konten Anda ke pemutar dengan tepat. Jika tidak ditentukan, konfigurasi pemutar default akan mencoba memutar konten sebagai Transport Streaming konten paket. Properti ini dapat disetel dari setiap pengirim dalam memuat data permintaan (Android, iOS dan Web) atau di dalam penerima melalui interseptor pesan.

Melihat kode contoh di bawah atau Memuat media menggunakan contentId, contentUrl, dan entity untuk informasi selengkapnya tentang cara menyiapkan konten di Penerima 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;
    });

Perlindungan konten

Seperti yang tercantum di bagian tag #EXT-X-KEY di atas, SDK Cast mendukung SAMPLE-AES atau SAMPLE-AES-CTR dengan URI ke kunci berupa vektor inisialisasi dapat ditentukan:

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

KEYFORMAT yang saat ini kami dukung adalah Widevine, dan URI berisi Info DRM yang dienkode dengan BASE64, XXXXXXX, yang saat didekode berisi ID kunci:

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

Versi 1 menentukan atribut berikut:

Atribut Contoh Deskripsi
KEYFORMATVERSIONS "1" Proposal ini menentukan format kunci versi 1
KEYFORMAT "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" UUID adalah UUID Widevine dari DASH IF IOP. String yang sama persis digunakan dalam MPD dengan streaming terenkripsi Widevine.
URI "data:text/plain;base64, <base64 encoded PSSH box>" URI aliran data yang berisi jenis data dan kotak PSSH.
METHOD SAMPLE-AES-CTR Menunjukkan penyandian enkripsi yang digunakan saat mengenkripsi konten. SAMPLE-AES menunjukkan bahwa konten dienkripsi menggunakan 'cbcs'. SAMPLE-AES-CTR menunjukkan bahwa konten dienkripsi menggunakan salah satu skema perlindungan AES-CTR, yaitu 'cenc'.

Atribut yang dipetakan ke DASH MPD:

Atribut Deskripsi
KEYFORMAT Atribut schemaIdUri elemen ContentProtection.
URI Konten elemen cenc:pssh.
KEYID String heksadesimal 16 byte yang mengenkode ID kunci yang memiliki peran yang sama dengan default_kid di MPEG DASH. Jika menggunakan skema kunci hierarkis, ini akan menjadi "{i>root<i}" tombol.

Contoh Playlist HLS dengan Sinyal 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

Di bawah ini adalah daftar fitur dan tag di HLS yang saat ini tidak kami gunakan atau dukungan teknis IT. Kehadiran atau ketidakhadiran mereka tidak memengaruhi perilaku streaming.

  • Atribut RESOLUTION= di #EXT-X-STREAM-INF diabaikan.
  • Atribut AUTOSELECT= di #EXT-X-MEDIA tidak digunakan. Sebagai gantinya, kita mengandalkan DEFAULT=
  • #EXT-X-I-FRAME-STREAM-INF dalam playlist master diabaikan.
  • #EXT-X-DISCONTINUITY-SEQUENCE diabaikan
  • #EXT-X-PLAYLIST-TYPE:EVENT dapat muncul dalam live stream dan #EXT-X-PLAYLIST-TYPE:VOD dapat ditampilkan di streaming VOD, tetapi saat ini Pemutar Penerima Web hanya mengandalkan keberadaan #EXT-X-ENDLIST untuk menentukan perbandingan langsung VOD.

Streaming yang lancar

Layanan resmi Microsoft Spesifikasi Smooth Streaming.

Streaming lancar menyediakan protokol streaming adaptif dan spesifikasi XML melalui HTTP (mirip dengan DASH). Berbeda dari DASH, Smooth Streaming merekomendasikan hanya kemasan MPEG-4 untuk segmen media.

Berikut adalah tabel tag dan atribut paling umum dalam Smooth Streaming yang yang didukung oleh Pemutar Penerima Web saat ini. Banyak konsep yang telah dijelaskan dalam bagian DASH di atas.

Tag/Atribut Penggunaan
&lt;SmoothStreamingMedia&gt; Tag utama untuk manifes, berisi atribut:
  • Skala Waktu: Jumlah unit untuk mewakili satu detik, biasanya berupa kenaikan 10.000.000.
  • Durasi: Panjang konten dalam skala waktu. Pemutar Penerima Web melakukan tidak mendukung durasi yang kurang dari 0,1 detik.
  • IsLive: Apakah manifes adalah media live.
&lt;StreamIndex&gt; Satu kumpulan aliran data, mirip dengan AdaptationSet DASH. Jenis ini biasanya "text", "video", atau "audio". Atribut URL biasanya berisi template URL fragmen menggunakan informasi seperti kecepatan bit atau waktu mulai.
&lt;QualityLevel&gt; Setiap tag QualityLevel menentukan Kecepatan Bit dan codec FourCC-nya. FourCC kode biasanya 'H264', 'AVC1', 'AACL' dll. Untuk video, kode ini menentukan resolusi melalui MaxWidth dan MaxHeight. Untuk audio, ini menentukan (seperti 44100) melalui SamplingRate dan jumlah Saluran.
&lt;c&gt; Elemen Stream Fragment. Berisi:
  • d: durasi fragmen.
  • t: Waktu Media fragmen.
&lt;Protection&gt; Tag dengan atribut SystemID opsional yang mencantumkan ID sistem DRM yang akan digunakan berdasarkan <SmoothStreamingMedia> .
&lt;ProtectionHeader&gt; Di bagian <Protection>, dapat berisi atribut SystemID dan custom data, biasanya berenkode Base64. Untuk Widevine, akan berisi id kunci, kunci panjang, ID algoritme, seperti AESCTR, LA_URL (URL akuisisi lisensi), LUI_URL (URL antarmuka pengguna lisensi), dan DS_ID (ID layanan domain).

Perlindungan konten

Untuk mengenkode ID sistem perlindungan dengan benar, gunakan pemetaan di bawah:

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

Untuk <ProtectionHeader>, berikut adalah contoh dengan data yang dienkode Base64. Tujuan data, jika didekode, akan sesuai dengan format hasil dekode yang sama seperti Dukungan perlindungan konten DASH di atas.

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

Di bawah ini adalah contoh manifes Smooth streaming live dengan durasi 3000 detik durasi konten:

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

Dalam contoh untuk streaming video di atas, template URL-nya adalah:

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

Jadi dua segmen pertama (dengan asumsi kita berada di indeks 2 tingkat kualitas) akan menjadi berikut ini, dengan waktu awal diekstrak dari t="80649401378125" di bawah video StreamIndex dan penambahan waktu 4 detik * 10000000 per segmen:

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

Berikut adalah daftar atribut Smooth Streaming yang saat ini kami abaikan dan miliki tidak akan memengaruhi pengalaman streaming, terlepas dari apakah pengalaman tersebut diberikan:

  • CanSeek, CanPause di tag <SmoothStreamingMedia>.
  • Chunks, KualitasLevels di tag <StreamIndex>. Sebagai gantinya, kita menghitung jumlah segmen dan jumlah tingkat kualitas berdasarkan informasi disediakan di dalam <StreamIndex> seperti tag QualityLevel yang sebenarnya dan tag <c>.
  • BitsPerSample, PacketSize di <QualityLevel> tidak digunakan.

Periksa jenis layar

canDisplayType pemeriksaan metode untuk kemampuan video dan audio dari perangkat Penerima Web dan ditampilkan dengan memvalidasi parameter media yang diteruskan, dengan menampilkan boolean. Semua tapi yang pertama bersifat opsional — semakin banyak parameter yang disertakan, pemeriksaan yang lebih tepat.

Tanda tangannya adalah canDisplayType(<em>mimeType</em>,<em>codecs</em>,<em>width</em>,<em>height</em>,<em>framerate</em>)

Contoh:

Memeriksa apakah perangkat dan layar Web Receiver mendukung video/mp4 mimetype dengan codec, dimensi, dan kecepatan frame khusus ini:

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

Memeriksa apakah perangkat dan tampilan Web Receiver mendukung format video 4K untuk codec ini dengan menentukan lebar 3840 dan tinggi 2160:

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

Memeriksa apakah perangkat dan layar Penerima Web mendukung HDR10 untuk codec ini, dimensi, dan frekuensi gambar:

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

Memeriksa apakah perangkat dan layar Penerima Web mendukung Dolby Vision (DV) untuk codec, dimensi, dan kecepatan frame ini:

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

DRM

Beberapa konten media memerlukan Manajemen Hak Digital (DRM). Untuk konten media yang menyimpan lisensi DRM-nya (dan URL kuncinya) dalam manifesnya (DASH atau HLS), SDK Cast akan menangani kasus ini. Sebagian konten tersebut memerlukan licenseUrl yang diperlukan untuk mendapatkan kunci dekripsi. Di Penerima Web, Anda dapat menggunakan PlaybackConfig untuk menyetel licenseUrl sesuai kebutuhan.

Cuplikan kode berikut menunjukkan cara menetapkan informasi permintaan lisensi permintaan, seperti 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;
});

Jika Anda memiliki integrasi Asisten Google, beberapa informasi DRM seperti kredensial yang diperlukan untuk konten itu mungkin ditautkan langsung ke Akun Google melalui mekanisme seperti OAuth/SSO. Dalam kasus tersebut, jika yang dimuat melalui suara atau berasal dari {i>cloud<i}, setCredentials dipanggil dari cloud ke perangkat Cast dengan kondisi memiliki kredensial yang lengkap. Aplikasi yang menulis aplikasi Penerima Web kemudian dapat menggunakan Informasi setCredentials untuk mengoperasikan DRM sesuai kebutuhan. Berikut adalah contoh menggunakan kredensial tersebut untuk membangun media.

Tips: Lihat juga Memuat media menggunakan contentId, contentUrl, dan entity.

Penanganan saluran audio

Saat pemutar Cast memuat media, pemutar video akan menyiapkan buffer sumber audio tunggal. Di pada saat yang sama, ia juga memilih {i> codec<i} yang sesuai untuk digunakan oleh {i>buffer<i}, berdasarkan jenis MIME dari jalur utama. Buffer dan codec baru disiapkan:

  • saat pemutaran dimulai,
  • setiap jeda iklan, dan
  • setiap kali konten utama dilanjutkan.

Karena {i>buffer<i} menggunakan satu codec, dan karena codec dipilih berdasarkan jalur utama, ada situasi di mana jalur sekunder mungkin disaring dan tidak didengar. Hal ini bisa terjadi jika program media dalam suara surround, tetapi trek audio sekunder menggunakan suara stereo. Karena trek sekunder sering digunakan untuk menawarkan konten sebagai alternatif bahasa, menyediakan media yang berisi jumlah lagu yang berbeda dapat memiliki dampak yang besar, seperti sejumlah besar penonton tidak dapat mendengar konten dalam bahasa asli mereka.

Skenario berikut mengilustrasikan mengapa penting untuk menyediakan dengan jalur primer dan sekunder berisi jumlah channel yang sama:

Skenario 1 - streaming media tidak memiliki saluran paritas di jalur primer dan sekunder:

  • bahasa inggris - channel AC-3 5.1 (primary)
  • swedia - AAC 2 saluran
  • Prancis - AAC 2 saluran
  • jerman - AAC 2 saluran

Dalam skenario ini, jika bahasa pemain diatur ke selain bahasa Inggris, pengguna tidak mendengar lagu yang mereka harapkan, karena semua trek dua saluran difilter selama pemutaran. Satu-satunya lagu yang dapat dimainkan menjadi saluran 5.1 AC-3 utama, dan kemudian hanya ketika bahasa disetel ke bahasa Inggris.

Skenario 2 - streaming media dengan saluran paritas di jalur primer dan sekunder:

  • bahasa inggris - channel AC-3 5.1 (primary)
  • swedia - AC-3 5.1 saluran
  • prancis - AC-3 5.1 channel
  • jerman - AC-3 5.1 saluran

Karena semua lagu streaming ini memiliki jumlah channel yang sama, audiens harus akan mendengar trek terlepas dari bahasa yang dipilih.

Penanganan channel audio Shaka

Pemutar Shaka (DASH) secara default memiliki jumlah saluran pilihan sebanyak dua, sebagai tindakan mitigasi saat menghadapi media yang tidak memiliki paritas di seluruh trek audio.

Jika trek utama bukan suara surround (misalnya, stereo dua saluran lagu), maka pemutar Shaka akan menjadi {i>default<i} untuk dua saluran, dan akan secara otomatis memfilter trek media sekunder apa pun yang memiliki lebih dari dua saluran TV Anda.

Jumlah saluran audio pilihan Shaka juga dapat dikonfigurasi dengan menyetel preferredAudioChannelCount di properti shakaConfig di cast.framework.PlaybackConfig.

Contoh:

shakaConfig = { "preferredAudioChannelCount": 6 };

Dengan preferredAudioChannelCount disetel ke 6, Shaka Player akan memeriksa apakah dan dapat mendukung codec suara surround (AC-3 atau EC-3), dan otomatis menyaring setiap trek media yang tidak sesuai dengan jumlah channel.