Protokol Streaming Pemutar Penerima Web

Web Receiver SDK saat ini mendukung tiga jenis protokol streaming:

DASH, HTTP Live Streaming, dan Smooth Streaming.

Dalam dokumen ini, kami mencantumkan dukungan untuk setiap protokol streaming. Perlu diperhatikan Penjelasan tentang tag yang didukung untuk setiap protokol cukup disingkat dibandingkan dengan spesifikasi protokol yang mendetail. Tujuannya adalah untuk memberikan gambaran sekilas dan pemahaman singkat tentang cara menggunakan setiap protokol, serta fitur protokol mana yang didukung pada perangkat yang kompatibel untuk Cast guna memberikan pengalaman streaming.

Streaming Adaptif Dinamis melalui HTTP (DASH)

Spesifikasi mendetail DASH ISO.

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

Manifes DASH dimulai dengan tag <MPD> root dan di dalamnya menyertakan satu atau beberapa tag <Period>, yang mewakili satu konten streaming. Tag <Period> memungkinkan pengurutan konten streaming yang berbeda dan sering digunakan untuk memisahkan konten utama dan iklan atau beberapa konten video berturut-turut.

<AdaptationSet> pada <MPD> adalah kumpulan representasi untuk satu jenis streaming media, pada umumnya video, audio, atau teks. mimetype yang paling umum didukung adalah "video/mp4", "audio/mp4", dan "text/vtt". <ContentComponent contentType="$TYPE$"> opsional dapat disertakan dalam <AdaptationSet>.

Di dalam setiap <AdaptationSet>, daftar tag <Representation> harus ada dan Pemutar Web Receiver menggunakan informasi codecs untuk menginisialisasi buffering sumber MSE dan informasi bandwidth untuk memilih representasi/kecepatan bit yang tepat untuk diputar secara otomatis.

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

Untuk <SegmentTemplate>, hal ini menunjukkan cara segmen inisialisasi dan segmen media dapat direpresentasikan melalui template. Pada contoh di bawah, $Number$ menunjukkan nomor segmen yang tersedia dari CDN. Jadi, diterjemahkan menjadi seg1.m4s, seg2.m4s, dll. saat 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>, penggunaan tag <SegmentTimeline> adalah hal yang umum untuk menunjukkan durasi setiap segmen dan segmen yang berulang. timescale (unit untuk mewakili satu detik) sering kali disertakan sebagai bagian dari atribut <SegmentTemplate> sehingga kami dapat menghitung waktu segmen berdasarkan unit ini. Pada contoh di bawah, tag <S> menandakan tag segmen, atribut d menentukan durasi segmen, dan atribut r menentukan berapa banyak segmen dengan durasi yang sama berulang sehingga $Time$ dapat dihitung dengan benar untuk mendownload segmen media seperti yang 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 permintaan rentang byte untuk menentukan bagian mana dari file <BaseURL> yang berisi indeks, dan sisanya dapat diambil secara on demand saat pemutaran berlanjut atau pencarian terjadi. Di sini, rentang Initialization menentukan rentang metadata init dan indexRange menentukan indeks untuk segmen media. Perlu diperhatikan bahwa saat ini kami hanya mendukung rentang byte yang berurutan.

<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 mana yang digunakan, jika streaming dilindungi, bagian <ContentProtection> dapat muncul di <AdaptationSet>, yang mana schemeIdUri mengidentifikasi sistem DRM yang akan digunakan secara unik. 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 lainnya, 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 memuat ulang manifes.
tipe Atribut tag <MPD>; "dinamis" untuk menunjukkan bahwa ini adalah live stream.
presentationTimeOffset Atribut tag <SegmentBase>; menentukan offset waktu presentasi dari awal periode.
startNumber Menentukan jumlah segmen media pertama dalam presentasi dalam suatu periode. Setelan ini sering digunakan dalam live stream.

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

Meskipun Pemutar Penerima Web kami saat ini mendukung kasus penggunaan DASH utama, berikut adalah daftar atribut umum yang diabaikan atau tidak digunakan oleh penerapan DASH kami saat ini. Artinya, terlepas dari apakah manifes memuatnya atau tidak, peristiwa tersebut 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 keunggulan utama Pemutar Web Receiver adalah kemampuannya untuk mendukung pemutaran HLS di MSE. Berbeda dengan DASH, dengan manifes berada dalam satu file, HLS mengirim playlist master yang berisi daftar semua streaming varian dengan URL masing-masing. Playlist varian adalah playlist media. Dua tag HLS utama yang saat ini didukung oleh Pemutar Penerima Web di playlist master adalah:

Nama Tag Fungsi
#EXT-X-STREAM-INF Menentukan kecepatan bit/aliran varian. Atribut BANDWIDTH diperlukan yang mendukung pemilihan streaming kecepatan bit adaptif. Atribut CODECS sangat direkomendasikan untuk melakukan inisialisasi MSE, seperti "avc1.42c01e,mp4a.40.2". Jika tidak ditentukan, kasus default akan ditetapkan ke video profil utama 3.0 H264 dan konten yang dienkode audio "mp4a.40.2".
#EXT-X-MEDIA Menentukan playlist media tambahan (dalam atribut URI) yang mewakili konten. Ini biasanya merupakan streaming audio alternatif dalam format lain (suara surround 5.1) atau bahasa. Atribut TYPE yang berisi VIDEO, AUDIO, SUBTITLES, atau CLOSED-CAPTIONS diizinkan. Menyetel atribut DEFAULT ke YES akan menunjukkan pemilihan aliran alternatif ini secara default.

Berikut daftar tag HLS yang saat ini didukung oleh Pemutar Web Receiver di playlist media:

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

Untuk live stream, kami menggunakan #EXT-X-PROGRAM-DATE-TIME dan #EXT-X-MEDIA-SEQUENCE sebagai faktor utama untuk menentukan cara menggabungkan manifes yang baru dimuat ulang. Jika ada, #EXT-X-PROGRAM-DATE-TIME akan digunakan untuk mencocokkan segmen yang dimuat ulang. Jika tidak, nomor #EXT-X-MEDIA-SEQUENCE akan digunakan. Perlu diperhatikan bahwa sesuai 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 dilakukan dengan memiliki tag #EXT-X-MEDIA dengan codec alternatif serta menyediakan format segmen dalam konfigurasi streaming.

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

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 baru. Setiap kali sebuah pencarian diminta, kita hanya mencari dalam rentang yang dapat dicari. Untuk live, kami hanya mengizinkan pencarian dari awal daftar terbaru hingga tiga durasi target dari akhir. Jadi, misalnya, jika Anda memiliki daftar 10 segmen, dan Anda berada di segmen 6, Anda hanya dapat mencari hingga 7, tetapi tidak 8.

Dukungan format segmen

CAF SDK mendukung pemutaran konten yang dikirim dalam berbagai format seperti yang dirujuk dalam HlsSegmentFormat untuk audio dan HlsVideoSegmentFormat untuk video. Hal ini mencakup dukungan untuk audio yang dikemas seperti pemutaran AAC dan AC3, baik yang dienkripsi maupun tidak. Anda harus menentukan informasi ini dalam MediaInformation dari LoadRequestData agar dapat mendeskripsikan konten Anda dengan benar kepada pemain. Jika tidak ditentukan, konfigurasi pemutar default akan mencoba memutar konten sebagai konten paket Transport Stream. Properti ini dapat ditetapkan dari pengirim dalam data permintaan pemuatan (Android, iOS, dan Web) atau dalam penerima melalui intersepsi pesan.

Lihat contoh cuplikan kode di bawah atau panduan Memuat media menggunakan contentId, contentUrl, dan entity untuk mengetahui 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 tempat URI ke kunci 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 sekarang kami dukung adalah Widevine, dan URI berisi info DRM berenkode BASE64 XXXXXXX yang jika didekode akan 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 cipher enkripsi yang digunakan saat mengenkripsi konten. CONTOH-AES memberi sinyal bahwa konten dienkripsi menggunakan 'cbcs'. CONTOH-AES-CTR memberi sinyal 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 kunci "root".

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

Berikut adalah daftar fitur dan tag di HLS yang saat ini tidak kami gunakan atau dukung. Kehadiran atau ketidakhadiran penonton 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 di playlist master diabaikan.
  • #EXT-X-DISCONTINUITY-SEQUENCE diabaikan
  • #EXT-X-PLAYLIST-TYPE:EVENT dapat muncul di live stream dan #EXT-X-PLAYLIST-TYPE:VOD dapat muncul di streaming VOD, tetapi saat ini Pemutar Penerima Web kami hanya mengandalkan keberadaan #EXT-X-ENDLIST untuk menentukan video live vs. VOD.

Streaming yang lancar

Spesifikasi Smooth Streaming resmi Microsoft.

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

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

Tag/Atribut Penggunaan
<SmoothStreamingMedia> Tag utama untuk manifes, berisi atribut:
  • TimeScale: Jumlah unit untuk mewakili satu detik, biasanya bertambah 10.000.000.
  • Durasi: Durasi konten dalam skala waktu. Pemutar Penerima Web tidak mendukung durasi yang kurang dari 0,1 detik.
  • IsLive: Apakah manifes adalah media live.
<StreamIndex> Satu set aliran, mirip dengan AdaptationSet DASH. Jenisnya biasanya "text", "video", atau "audio". Atribut URL biasanya berisi URL fragmen template yang menggunakan informasi seperti kecepatan bit atau waktu mulai.
<QualityLevel> Setiap tag QualityLevel menentukan Kecepatan Bit dan codec FourCC-nya. Kode FourCC sering kali berupa 'H264', 'AVC1', 'AACL', dll. Untuk video, kode ini menentukan resolusinya melalui MaxWidth dan MaxHeight. Untuk audio, class ini menentukan frekuensinya (seperti 44100) melalui SamplingRate dan jumlah Saluran.
<c> Elemen Fragmen Streaming. Berisi:
  • d: durasi fragmen.
  • t: Waktu Media fragmen.
<Perlindungan> Tag dengan atribut SystemID opsional yang mencantumkan ID DRM sistem yang akan digunakan dalam tag <SmoothStreamingMedia>.
<ProtectionHeader> Di bagian <Protection>, dapat berisi atribut SystemID dan data kustom, biasanya berenkode Base64. Untuk Widevine, class ini akan berisi ID kunci, panjang kunci, 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',
  • CLEARKEY: '1077EFEC-C0B2-4D02-ACE3-3C1E52E2FB4B',
  • MPEG_DASH_MP4PROTECTION: 'URN:MPEG:DASH:MP4PROTECTION:2011'

Untuk <ProtectionHeader>, berikut adalah contoh dengan data yang dienkode Base64. Saat didekode, data sesuai dengan format dekode yang sama sebagaimana dijelaskan dalam dukungan perlindungan konten DASH di atas.

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

Berikut adalah contoh manifes live streaming Smooth dengan konten berdurasi 3.000 detik:

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

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

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

Jadi, dua segmen pertama (dengan asumsi kita berada di tingkat kualitas indeks 2) adalah sebagai berikut, dengan waktu awal diekstrak dari t="80649401378125" di bagian video StreamIndex dan penambahan waktu 4 detik * 1.000.000 per segmen:

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

Berikut adalah daftar atribut Streaming Lancar yang saat ini kami abaikan dan tidak berpengaruh pada pengalaman streaming, terlepas dari apakah atribut ini disediakan atau tidak:

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

Periksa jenis tampilan

Metode canDisplayType memeriksa kemampuan video dan audio perangkat Penerima Web dan tampilan dengan memvalidasi parameter media yang diteruskan, yang menampilkan boolean. Semua parameter, tetapi yang pertama bersifat opsional, semakin banyak parameter yang Anda sertakan, semakin akurat pemeriksaannya.

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 Penerima Web mendukung mimetype video/mp4 dengan codec, dimensi, dan kecepatan frame tertentu:

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

Memeriksa apakah perangkat dan layar Penerima Web 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, dimensi, dan kecepatan frame ini:

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 memiliki lisensi DRM (dan URL kunci) yang disimpan dalam manifesnya (DASH or HLS), Cast SDK akan menangani kasus ini untuk Anda. Subset 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 untuk permintaan lisensi 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 dapat ditautkan langsung ke Akun Google Anda melalui mekanisme seperti OAuth/SSO. Dalam kasus tersebut, jika konten media dimuat melalui suara atau berasal dari cloud, setCredentials akan dipanggil dari cloud ke perangkat Cast dengan memberikan kredensial tersebut. Aplikasi yang menulis aplikasi Penerima Web kemudian dapat menggunakan informasi setCredentials untuk mengoperasikan DRM jika diperlukan. Berikut adalah contoh penggunaan kredensial untuk membuat media.

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

Penanganan saluran audio

Saat pemutar Cast memuat media, pemutar Cast akan menyiapkan satu buffering sumber audio. Pada saat yang sama, kode ini juga memilih codec yang sesuai untuk digunakan oleh buffer, berdasarkan jenis MIME trek utama. Buffer dan codec baru telah disiapkan:

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

Karena buffer menggunakan satu codec, dan karena codec dipilih berdasarkan jalur utama, ada situasi ketika trek sekunder dapat difilter dan tidak terdengar. Hal ini dapat terjadi jika trek utama program media menggunakan suara surround, tetapi trek audio sekunder menggunakan suara stereo. Karena trek sekunder sering digunakan untuk menawarkan konten dalam bahasa alternatif, menyediakan media yang berisi sejumlah trek yang berbeda dapat dampak yang besar, seperti sejumlah besar penonton yang tidak dapat mendengar konten dalam bahasa asli mereka.

Skenario berikut menggambarkan alasan pentingnya menyediakan pemrograman dengan trek utama dan sekunder berisi jumlah saluran yang sama:

Skenario 1 - streaming media yang tidak memiliki kesamaan saluran di jalur utama dan sekunder:

  • bahasa Inggris - AC-3 5.1 channel (utama)
  • swedia - AAC 2 saluran
  • prancis - AAC 2 saluran
  • jerman - 2 saluran AAC

Dalam skenario ini, jika bahasa pemutar disetel ke selain bahasa Inggris, pengguna tidak akan mendengar trek yang ingin didengar, karena semua trek dua saluran difilter selama pemutaran. Satu-satunya trek yang dapat diputar adalah AC-3 5.1-channel utama, dan hanya jika bahasanya disetel ke bahasa Inggris.

Skenario 2 - streaming media dengan paritas saluran di seluruh trek utama dan sekunder:

  • bahasa Inggris - AC-3 5.1 channel (utama)
  • Swedia - AC-3 5.1 saluran
  • prancis - AC-3 5.1 saluran
  • bahasa Jerman - AC-3 5.1 saluran

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

Penanganan saluran audio Shaka

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

Jika trek utama tidak memiliki suara surround (misalnya, trek stereo dua saluran), pemutar Shaka akan menggunakan dua saluran secara default, dan akan otomatis memfilter trek media sekunder yang memiliki lebih dari dua saluran.

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

Contoh:

shakaConfig = { "preferredAudioChannelCount": 6 };

Setelah preferredAudioChannelCount disetel ke 6, Shaka Player akan memeriksa apakah pemain ini dapat mendukung codec suara surround (AC-3 atau EC-3), dan otomatis memfilter trek media apa pun yang tidak sesuai dengan jumlah saluran yang disukai.