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 "2016-09-21T23:23:52.066Z". |
#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 mengandalkanDEFAULT=
#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 |
---|---|
<SmoothStreamingMedia> | Tag utama untuk manifes, berisi atribut:
|
<StreamIndex> | 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. |
<QualityLevel> | 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. |
<c> | Elemen Stream Fragment. Berisi:
|
<Protection> | Tag dengan atribut SystemID opsional yang mencantumkan ID sistem DRM yang akan digunakan berdasarkan <SmoothStreamingMedia> . |
<ProtectionHeader> | 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 tagQualityLevel
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.