Dokumen ini memberikan panduan untuk menggunakan format Pengiriman Dynamic Adaptive Streaming over HTTP (DASH) untuk melakukan streaming data live di YouTube dari encoder. Tujuannya adalah untuk membantu vendor encoder menambahkan dukungan pengiriman DASH ke produk mereka.
Memahami DASH
Daftar di bawah mencantumkan beberapa fitur dan atribut utama DASH:
- Berdasarkan standar terbuka.
- Berbasis HTTP. Oleh karena itu, DASH kompatibel dengan infrastruktur internet dan dapat melintasi firewall.
- Mendukung bitrate transfer tinggi. DASH mendukung beberapa sesi HTTP simultan dan pengiriman segmen non-sekuensial, sehingga memberikan ketahanan yang lebih besar daripada protokol yang mengandalkan satu koneksi TCP.
- Penayangan yang aman melalui HTTPS.
- Pengiriman tanpa kehilangan melalui HTTP dan HTTPS.
- Agnostik codec.
- Mendukung MP4 yang berisi H264 dan AAC serta WebM yang berisi VP8/VP9 dan Vorbis/Opus.
Spesifikasi
- DASH dijelaskan dalam ISO/IEC 23009-1:2014 Information technology -- Dynamic adaptive streaming over HTTP (DASH).
- WebM melalui DASH dijelaskan dalam spesifikasi WebM DASH.
Persyaratan
Subbagian berikut menjelaskan persyaratan untuk menggunakan DASH guna mengirimkan live stream ke YouTube.
Waktu
Endpoint DASH YouTube berperilaku sebagai server HTTP pasif, yang merekam panggilan metode PUT yang dikirim oleh encoder.
- Endpoint DASH mendukung koneksi TCP simultan. Anda dapat menggunakan kembali koneksi sesuai dengan HTTP/1.1.
- Segmen MPD dan Inisialisasi harus di-PUT dalam waktu 3 detik setelah segmen media pertama. (Sebaiknya sertakan segmen Inisialisasi dalam MPD.)
- Setiap segmen atau MPD harus menggunakan permintaan PUT terpisah; upload multibagian dari beberapa segmen tidak didukung.
- Operasi PUT untuk segmen media dapat tumpang-tindih dalam waktu untuk meningkatkan bandwidth upload.
- Segmen dapat diberikan dalam urutan non-berurutan dalam jangka waktu sekitar 3 detik.
- Segmen MPD dan Inisialisasi harus diperbarui setidaknya setiap 60 detik dengan
availabilityStartTime
danstartNumber
yang diperbarui. (Seperti yang disebutkan di atas, segmen Inisialisasi dapat disertakan dalam MPD. Dalam hal ini, satu permintaan PUT dapat memperbarui kedua segmen.)
Struktur URL
Encoder Anda harus membentuk URL PUT dengan menambahkan string ke URL dasar endpoint YouTube. Anda perlu membuat endpoint penyerapan DASH menggunakan YouTube Live Streaming API.
Encoder kemudian dapat memperoleh URL dasar endpoint secara terprogram melalui YouTube Live Streaming API. URL dasar juga terlihat di UI Acara Live YouTube jika Anda ingin memberikan URL ke encoder secara manual.
String yang ditambahkan ke URL dasar dapat berisi kumpulan karakter ASCII berikut:
- Huruf kecil: a-z
- Huruf besar: A-Z
- Digit: 0-9
- Karakter khusus: _ (garis bawah), - (tanda hubung), . (titik)
URL MPD
Selain persyaratan di atas, URL MPD harus diakhiri dengan .mpd
, sehingga server YouTube dapat dengan mudah mengidentifikasi MPD. URL segmen lainnya tidak boleh diakhiri dengan .mpd
.
URL inisialisasi dan segmen media
URL segmen Inisialisasi dan semua URL segmen media harus diakhiri dengan .mp4
jika data berada dalam penampung ISO BMFF atau dengan .webm
jika data berada dalam penampung WebM.
Isi MPD
MPD harus lengkap dan sesuai dengan standar DASH. Elemen ini harus berisi tepat satu dari setiap elemen berikut. Daftar ini mengidentifikasi elemen yang secara khusus diperlukan oleh YouTube, dan standar DASH dapat mengidentifikasi elemen tambahan yang diperlukan. Elemen direpresentasikan menggunakan sintaksis XPath dan konsisten dengan standar DASH.
/mpd:MPD/attribute::type
/mpd:MPD/mpd:Period
/mpd:MPD/mpd:Period/mpd:AdaptationSet
/mpd:MPD/mpd:Period/mpd:AdaptationSet/attribute::mimeType (video/mp4 or video/webm)
/mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate
/mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::media
/mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::initialization
/mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::startNumber
Perhatikan persyaratan berikut untuk nilai elemen:
- Atribut
minimumUpdatePeriod
elemen<MPD>
harus disetel ke nilai yang sama dengan atau kurang dari 60 detik (PT60S
). - Atribut
media
elemen<SegmentTemplate>
harus menentukan bahwa URL segmen media dibuat menggunakan$Number$
. (AtributstartNumber
mengidentifikasi nomor yang akan ditetapkan ke segmen media pertama.)
Panjang segmen inisialisasi
Segmen Inisialisasi tidak boleh lebih dari 100 KB. (Biasanya, segmen Inisialisasi jauh lebih kecil daripada itu.) Jika segmen Inisialisasi disertakan dalam MPD, maka URL data:
, yang berisi segmen, tidak boleh lebih dari 100 kb.
Output encoder
Segmen Inisialisasi dan segmen media harus membentuk aliran file ISO BMFF atau WebM yang di-multiplex dengan GOP (kumpulan gambar) tertutup.
- Ukuran GOP harus sekitar 2 detik dan harus kurang dari 8 detik.
- Streaming yang di-multiplex harus berisi trek audio dan video.
Praktik terbaik tambahan
Enkripsi
YouTube mendukung enkripsi streaming melalui HTTPS. Sebaiknya gunakan fitur ini.
Segmen inisialisasi di MPD
Anda dapat merepresentasikan segmen Inisialisasi secara langsung di MPD menggunakan URL data:
, sesuai dengan RFC 2397. Hal ini menyederhanakan penyiapan streaming dan mengurangi kemungkinan segmen Inisialisasi tidak sesuai dengan bagian streaming lainnya.
XPath untuk elemen ini adalah:
/mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute:data
Durasi segmen target
Untuk performa penyerapan yang baik dan kompromi yang baik antara throughput dan latensi, durasi segmen media Anda harus antara 1 dan 5 detik. Sebaiknya Anda mengomunikasikan durasi target segmen tersebut dalam MPD menggunakan dua elemen ini:
/mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::duration
/mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::timescale
Durasi yang dihitung dari atribut tersebut harus berada dalam faktor 2 dari semua durasi segmen aktual atau performa streaming dapat terpengaruh.
Perhatikan bahwa durasi target untuk penyerapan tidak sama dengan durasi chunk untuk live stream yang dihasilkan YouTube. YouTube mentranskode dan membagi ulang input, dan durasi target output bergantung pada apakah streaming dioptimalkan untuk kualitas streaming atau untuk latensi.
Percobaan ulang dan backoff eksponensial
Semua permintaan HTTP PUT harus dilakukan dengan waktu tunggu, yang sebaiknya ditetapkan ke nilai 500 milidetik lebih besar dari durasi segmen.
Permintaan PUT segmen media yang gagal, baik karena waktu tunggu habis atau error lainnya, sesuai dengan jeda dalam streaming video. Oleh karena itu, Anda harus mencoba ulang permintaan tersebut menggunakan backoff eksponensial biner acak:
- Setelah terjadi kegagalan, tunggu jangka waktu acak antara
[0 ... 100]
milidetik dan coba lagi permintaan tersebut. - Jika permintaan gagal lagi, tunggu selama periode acak antara
[0 ... 200]
milidetik dan coba lagi permintaan tersebut. - Jika permintaan gagal lagi, tunggu selama periode acak antara
[0 ... 400]
milidetik dan coba lagi permintaan tersebut. - dll.
Perhatikan bahwa kegagalan berulang harus disinyalkan kepada operator encoder karena sesuai dengan siaran yang gagal.
Kode Respons HTTP
Bagian berikut menjelaskan kode respons yang ditampilkan YouTube sebagai respons terhadap segmen yang dikirimkan melalui DASH.
200 (OK)
Respons HTTP 200 (OK) menunjukkan bahwa server YouTube menerima operasi yang diharapkan dan menanganinya dengan berhasil.
202 (Accepted)
Respons HTTP 202 (Diterima) terhadap operasi PUT atau POST menunjukkan bahwa operasi tersebut tidak terduga dan diterima untuk pemrosesan yang ditangguhkan. Namun, operasi yang ditangguhkan dapat berhasil atau gagal, sehingga respons tidak menjamin bahwa YouTube akan benar-benar dapat berhasil memproses operasi tersebut.
Respons ini paling sering terjadi saat segmen ditayangkan secara tidak berurutan. Biasanya, YouTube dapat memproses segmen yang disetujui dengan benar setelah menerima segmen sebelumnya, dan Anda tidak perlu mengirim ulang segmen tersebut.
Misalnya, YouTube dapat menampilkan respons 202 dalam salah satu kasus berikut:
- Segmen inisialisasi diterima sebelum MPD.
- Segmen media diterima sebelum segmen MPD dan Inisialisasi.
- Segmen media diterima sebelum segmen sebelumnya, seperti segmen 3 diterima sebelum segmen 2.
Namun, respons 202 juga dapat menunjukkan bahwa ID item salah jika YouTube tidak dapat sepenuhnya memvalidasi ID setelah menerima permintaan POST atau PUT. Misalnya, salah satu waktu terjadinya hal ini adalah saat YouTube menerima dan menyetujui segmen inisialisasi sebelum menerima MPD, tetapi segmen inisialisasi ternyata tidak valid. Dalam hal ini, YouTube menerima segmen inisialisasi dan menampilkan 202, lalu menentukan apakah segmen tersebut valid setelah menerima MPD. Anda dapat menghindari skenario khusus ini dengan menyertakan segmen Inisialisasi dalam MPD.
400 (Bad Request)
Respons HTTP 400 (Permintaan Buruk) menunjukkan bahwa salah satu masalah berikut terjadi:
- Format URL salah.
- Postingan terlalu besar (> 10 MB).
- MPD tidak dapat diurai.
- Segmen Inisialisasi di MPD rusak.
401 (Tidak Sah)
Respons HTTP 401 (Tidak Sah) menunjukkan bahwa URL dasar untuk endpoint DASH YouTube rusak atau sudah tidak berlaku.
405 (Method Not Allowed)
Respons HTTP 405 (Method Not Allowed) menunjukkan bahwa permintaan selain POST
atau PUT
dikirim.
409 (Conflict)
Respons HTTP 409 (Konflik) terhadap operasi PUT atau POST menunjukkan bahwa YouTube tidak dapat memproses permintaan. Misalnya, respons ini dapat terjadi jika pemohon telah mengirimkan banyak segmen media, tetapi YouTube masih belum memiliki MPD, segmen Inisialisasi, atau keduanya. Dalam contoh tersebut, encoder perlu mengirim ulang segmen MPD dan Inisialisasi sebelum mencoba ulang permintaan yang gagal.
500 (Error Server Internal)
Respons HTTP 500 (Internal Server Error) menunjukkan bahwa server tidak dapat memproses permintaan. Untuk error ini, sebaiknya coba lagi permintaan dengan backoff eksponensial.
Contoh
Urutan URL
Urutan URL di bawah menunjukkan serangkaian permintaan PUT yang akan dilakukan untuk mengirimkan konten melalui DASH. Urutan ini mengasumsikan bahwa URL dasar untuk endpoint DASH YouTube adalah:
http://upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx©=0&file=
Urutan ini menunjukkan segmen MPD dan Inisialisasi yang dikirim secara terpisah. Namun, segmen Inisialisasi dapat direpresentasikan secara langsung dalam MPD, dan praktik tersebut direkomendasikan. Selain itu, segmen MPD dan Inisialisasi harus diperbarui setidaknya setiap 60 detik. Jadi, pada akhirnya, URL untuk segmen tersebut akan muncul lagi dalam urutan ini, dan kemudian akan diikuti oleh URL untuk segmen media lainnya.
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx©=0&file=dash.mpd PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx©=0&file=init.mp4 PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx©=0&file=media001.mp4 PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx©=0&file=media002.mp4 PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx©=0&file=media003.mp4 ...
Segmen WebM
MPD dengan segmen Inisialisasi tersemat
MPD contoh berikut memiliki segmen Inisialisasi yang disematkan di URL data RFC 2397. Sebaiknya sematkan segmen Inisialisasi dengan cara ini, bukan mengirimkannya secara terpisah.
Contoh ini sesuai untuk penyerapan WebM (VP8 atau VP9, Opus) ke YouTube. Sebagian besar URL data telah dihilangkan agar mudah dibaca:
<?xml version="1.0" encoding="UTF-8"?> <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:dash:schema:mpd:2011" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" type="dynamic" profiles="urn:mpeg:dash:profile:isoff-live:2011" minimumUpdatePeriod="PT60S" minBufferTime="PT12S" availabilityStartTime="2016-04-13T20:52:58" > <Period start="PT0S" id="1"> <AdaptationSet mimeType="video/webm"> <ContentComponent contentType="video" id="1"/> <SegmentTemplate timescale="1000" duration="2000" startNumber="1" initialization="data:video/mp4;base64,AAAAGGZ0eXBpc...AAA" media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx©=0&file=media-$Number%09d$.webm"/> <Representation id="1" width="1920" height="1080"> <SubRepresentation contentComponent="1"/> </Representation> </AdaptationSet> </Period> </MPD>
MPD
MPD contoh berikut, yang tidak memiliki segmen Inisialisasi tersemat, juga sesuai untuk penyerapan WebM (VP8 atau VP9, Opus) ke YouTube:
<?xml version="1.0" encoding="UTF-8"?> <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:dash:schema:mpd:2011" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" type="dynamic" profiles="urn:mpeg:dash:profile:isoff-live:2011" minimumUpdatePeriod="PT60S" minBufferTime="PT12S" availabilityStartTime="2016-04-13T20:52:58" > <Period start="PT0S" id="1"> <AdaptationSet mimeType="video/webm"> <ContentComponent contentType="video" id="1"/> <SegmentTemplate timescale="1000" duration="2000" startNumber="1" initialization="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx©=0&file=init.webm" media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx©=0&file=media-$Number%09d$.webm"/> <Representation id="1" width="1920" height="1080"> <SubRepresentation contentComponent="1"/> </Representation> </AdaptationSet> </Period> </MPD>
Inisialisasi
Berikut menunjukkan tata letak segmen Inisialisasi WebM contoh. Bagian ini terdiri dari bagian streaming WebM hingga, tetapi tidak termasuk, cluster pertama.

Media
Berikut menunjukkan tata letak segmen media WebM contoh. Cluster ini terdiri dari satu cluster WebM. Seperti halnya streaming ISO BMFF, segmen Inisialisasi yang ditambahkan ke serangkaian cluster akan menghasilkan streaming WebM yang valid.

Segmen ISO BMFF
MPD dengan segmen Inisialisasi tersemat
MPD contoh berikut memiliki segmen Inisialisasi yang disematkan di URL data RFC 2397. Sebaiknya sematkan segmen Inisialisasi dengan cara ini, bukan mengirimkannya secara terpisah.
Contoh ini sesuai untuk penyerapan ISO BMFF (H.264, AAC) ke YouTube. Sebagian besar URL data telah dihilangkan agar mudah dibaca:
<?xml version="1.0" encoding="UTF-8"?> <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:dash:schema:mpd:2011" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" type="dynamic" minimumUpdatePeriod="PT30S" availabilityStartTime="2016-05-04T20:47:25" minBufferTime="PT12S" profiles="urn:mpeg:dash:profile:isoff-live:2011"> <Period start="PT0S" id="1"> <AdaptationSet mimeType="video/mp4" codecs="avc1.4d401e,mp4a.40.2"> <ContentComponent contentType="video" id="1"/> <ContentComponent contentType="audio" id="2"/> <SegmentTemplate timescale="600" media="/dash_upload?cid=ug50-xg26-cbc1-2p0h&staging=1©=0&file=media$Number%09d$.mp4" initialization="data:video/mp4;base64,AAAAGGZ0eXBpc281AA...AA" duration="306" startNumber="1"/> <Representation id="1" width="640" height="360" bandwidth="526952"> <SubRepresentation contentComponent="1" bandwidth="526952" codecs="avc1.4d401e"/> <SubRepresentation contentComponent="2" bandwidth="125584" codecs="mp4a.40.2"/> </Representation> </AdaptationSet> </Period> </MPD>
MPD
MPD contoh berikut, yang tidak memiliki segmen Inisialisasi tersemat, juga sesuai untuk penyerapan ISO BMFF (H.264, AAC) ke YouTube:
<?xml version="1.0" encoding="UTF-8"?> <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:dash:schema:mpd:2011" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" type="dynamic" profiles="urn:mpeg:dash:profile:isoff-live:2011" minimumUpdatePeriod="PT60S" minBufferTime="PT12S" availabilityStartTime="2016-04-13T20:51:31" > <Period start="PT0S" id="1"> <AdaptationSet mimeType="video/mp4" codecs="avc1.4d401e,mp4a.40.2"> <ContentComponent contentType="video" id="1"/> <ContentComponent contentType="audio" id="2"/> <SegmentTemplate timescale="600" duration="1200" startNumber="1" initialization="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx©=0&file=init.mp4" media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx©=0&file=media$Number%09d$.mp4"/> <Representation id="1" width="640" height="360" bandwidth="526952"> <SubRepresentation contentComponent="1" bandwidth="526952" codecs="avc1.4d401e"/> <SubRepresentation contentComponent="2" bandwidth="125584" codecs="mp4a.40.2"/> </Representation> </AdaptationSet> </Period> </MPD>
Inisialisasi
Diagram berikut menunjukkan tata letak segmen Inisialisasi BMFF ISO yang di-multiplexing contoh. YouTube tidak harus menggunakan atom, tetapi ini adalah contoh yang sesuai. Secara khusus, trek audio dan video ditampilkan.

Media
Diagram berikut menunjukkan tata letak segmen media ISO BMFF yang di-multiplexing. YouTube tidak harus menggunakan semua atom, tetapi ini adalah contoh yang sesuai. Secara khusus, trek audio dan video ditampilkan. Serangkaian segmen ini dapat ditambahkan ke segmen Inisialisasi untuk menghasilkan aliran ISO BMFF yang valid dan lengkap.

Keterbatasan yang Diketahui
Penyerapan RTMP dan DASH
Anda tidak dapat menggabungkan penyerapan RTMP dan DASH ke YouTube. Hal ini berlaku untuk beralih di antara keduanya selama siaran serta menggunakan salah satunya sebagai metode penyerapan utama dan yang lainnya untuk penyerapan cadangan.