Mengirimkan Konten YouTube Live melalui DASH

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

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 dan startNumber 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$. (Atribut startNumber 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:

  1. Setelah terjadi kegagalan, tunggu jangka waktu acak antara [0 ... 100] milidetik dan coba lagi permintaan tersebut.
  2. Jika permintaan gagal lagi, tunggu selama periode acak antara [0 ... 200] milidetik dan coba lagi permintaan tersebut.
  3. Jika permintaan gagal lagi, tunggu selama periode acak antara [0 ... 400] milidetik dan coba lagi permintaan tersebut.
  4. 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&copy=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&copy=0&file=dash.mpd
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=init.mp4
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media001.mp4
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media002.mp4
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=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&copy=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&copy=0&file=init.webm"
           media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=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&copy=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&copy=0&file=init.mp4"
           media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=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.