Mengirimkan Konten YouTube Live melalui DASH

Dokumen ini memberikan pedoman untuk menggunakan format Pengiriman Dynamic Adaptive Streaming over HTTP (DASH) untuk melakukan streaming data live di YouTube dari encoder. Alat ini dimaksudkan untuk membantu vendor encoder menambahkan dukungan pengiriman DASH ke produk mereka.

Memahami DASH

Daftar di bawah ini mencantumkan beberapa fitur dan atribut utama DASH:

  • Berdasarkan standar terbuka.
  • Berbasis HTTP. Hasilnya, DASH cocok untuk infrastruktur internet dan dapat melewati firewall.
  • Mendukung kecepatan bit transfer tinggi. DASH mendukung beberapa sesi HTTP secara simultan dan pengiriman segmen tidak sekuensial, sehingga memberikan ketahanan yang lebih besar dibandingkan protokol yang mengandalkan koneksi TCP tunggal.
  • Pengiriman aman melalui HTTPS.
  • Pengiriman lossless 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 penggunaan DASH untuk menayangkan live stream ke YouTube.

Waktu

Endpoint DASH YouTube berperilaku sebagai server HTTP pasif, yang merekam panggilan metode PUT yang dikirim oleh encoder.

  • Titik akhir DASH mendukung koneksi TCP simultan. Anda dapat menggunakan kembali koneksi sesuai HTTP/1.1.
  • Segmen MPD dan Inisialisasi harus berupa PUT dalam waktu 3 detik dari segmen media pertama. (Sebaiknya sertakan segmen Inisialisasi dalam MPD.)
  • Setiap segmen atau MPD harus menggunakan permintaan PUT yang terpisah; upload multi-bagian dari beberapa segmen tidak didukung.
  • Operasi PUT untuk segmen media mungkin tumpang-tindih tepat waktu untuk meningkatkan bandwidth upload.
  • Segmen dapat diberikan secara berurutan dalam jangka waktu sekitar 3 detik.
  • Segmen MPD dan Inisialisasi harus diupdate setidaknya setiap 60 detik dengan availabilityStartTime dan startNumber yang telah diupdate. (Seperti 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 proses transfer DASH menggunakan YouTube Live Streaming API.

Selanjutnya, encoder dapat memperoleh URL dasar endpoint secara terprogram melalui YouTube Live Streaming API. URL dasar juga dapat dilihat di UI Acara Live YouTube jika Anda ingin memberikan URL ke encoder secara manual.

String yang ditambahkan ke URL dasar dapat berisi rangkaian 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 mengidentifikasi MPD dengan mudah.URL segmen lainnya tidak boleh diakhiri dengan .mpd.

Inisialisasi dan URL 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.

Konten MPD

MPD harus lengkap dan sesuai dengan standar DASH. Daftar harus berisi tepat salah satu dari setiap elemen berikut. Daftar ini mengidentifikasi elemen yang secara khusus diperlukan oleh YouTube, dan standar DASH mungkin mengidentifikasi elemen tambahan yang diperlukan. Elemen-elemen tersebut 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 dari 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 dari itu.) Jika segmen Inisialisasi disertakan dalam MPD, URL data: yang berisi segmen tersebut tidak boleh lebih dari 100 KB.

Output encoder

Segmen Inisialisasi dan segmen media harus merupakan streaming file ISO BMFF atau WebM multipleks dengan GOP tertutup (grup gambar).

  • Ukuran GOP sebaiknya sekitar 2 detik dan kurang dari 8 detik.
  • Streaming multipleks harus berisi trek audio dan video.

Praktik terbaik tambahan

Enkripsi

YouTube mendukung enkripsi streaming melalui HTTPS. Kami sangat menyarankan Anda menggunakan fitur ini.

Segmen inisialisasi dalam MPD

Anda dapat merepresentasikan segmen Inisialisasi secara langsung di MPD menggunakan URL data:, sesuai dengan RFC 2397. Hal ini menyederhanakan penyiapan streaming Anda dan mengurangi kemungkinan segmen Inisialisasi tidak sesuai dengan 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 menyampaikan durasi target segmen tersebut di MPD menggunakan dua elemen berikut:

  • /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 dalam faktor 2 dari semua durasi segmen aktual atau performa streaming mungkin menurun.

Perlu diperhatikan bahwa target durasi penyerapan tidak sama dengan potongan durasi live stream yang dihasilkan YouTube. YouTube akan melakukan transcoding dan memotong ulang input, dan durasi target output bergantung pada apakah streaming dioptimalkan untuk kualitas streaming atau latensi.

Percobaan ulang dan backoff eksponensial

Semua permintaan HTTP PUT harus dijalankan dengan waktu tunggu, yang sebaiknya disetel ke nilai 500 milidetik lebih lama dari durasi segmen.

Permintaan PUT segmen media yang gagal, baik karena waktu tunggu habis atau error lainnya, sesuai dengan celah dalam streaming video. Dengan demikian, Anda harus mencoba lagi permintaan tersebut menggunakan backoff eksponensial biner acak:

  1. Setelah kegagalan, tunggu periode acak antara [0 ... 100] milidetik dan coba lagi permintaan tersebut.
  2. Jika permintaan gagal lagi, tunggu periode acak antara [0 ... 200] milidetik dan coba lagi permintaan tersebut.
  3. Jika permintaan gagal lagi, tunggu periode acak antara [0 ... 400] milidetik dan coba lagi permintaan tersebut.
  4. dll.

Perhatikan bahwa kegagalan berulang harus diberi sinyal ke operator encoder karena kegagalan tersebut berkaitan dengan siaran yang gagal.

Kode Respons HTTP

Bagian berikut menjelaskan kode respons yang ditampilkan YouTube sebagai respons terhadap segmen yang dikirimkan melalui DASH.

200 (Oke)

Respons HTTP 200 (OK) menunjukkan bahwa server YouTube telah menerima operasi yang diharapkan dan berhasil menanganinya.

202 (Accepted)

Respons HTTP 202 (Diterima) untuk operasi PUT atau POST apa pun menunjukkan bahwa operasi tidak diharapkan dan diterima untuk pemrosesan yang ditunda. Namun, operasi yang ditangguhkan bisa saja berhasil atau gagal, jadi responsnya tidak menjamin bahwa YouTube akan benar-benar berhasil memproses operasi tersebut.

Respons ini paling sering terjadi ketika segmen dikirimkan secara tidak berurutan. Biasanya, YouTube dapat memproses segmen yang diterima 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 tersebut setelah menerima permintaan POST atau PUT. Misalnya, salah satu situasi ini terjadi adalah saat YouTube menerima dan menerima segmen inisialisasi sebelum menerima MPD, tetapi segmen inisialisasi tersebut ternyata tidak valid. Dalam hal ini, YouTube menerima segmen inisialisasi dan mengembalikan nilai 202, lalu menentukan apakah segmen tersebut valid setelah menerima MPD. Anda dapat menghindari skenario khusus ini dengan menyertakan segmen Inisialisasi dalam MPD.

400 (Permintaan Buruk)

Respons HTTP 400 (Permintaan Buruk) menunjukkan salah satu masalah berikut terjadi:

  • Format URL salah.
  • Postingan terlalu besar (> 10 MB).
  • MPD tidak dapat diuraikan.
  • Segmen Inisialisasi dalam MPD rusak.

401 (Tidak sah)

Respons HTTP 401 (Tidak Sah) menunjukkan bahwa URL dasar untuk endpoint DASH YouTube rusak atau sudah tidak berlaku.

405 (Metode Tidak Diizinkan)

Respons HTTP 405 (Metode Tidak Diizinkan) menunjukkan bahwa permintaan selain POST atau PUT telah dikirim.

409 (Conflict)

Respons HTTP 409 (Konflik) terhadap operasi PUT atau POST apa pun menunjukkan bahwa YouTube tidak dapat memproses permintaan. Misalnya, respons ini mungkin 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 lagi permintaan yang gagal.

500 (Error Server Internal)

Respons HTTP 500 (Error Server Internal) menunjukkan bahwa server tidak dapat memproses permintaan. Untuk error ini, sebaiknya coba lagi permintaan tersebut dengan backoff eksponensial.

Contoh

Urutan URL

Urutan URL di bawah ini menunjukkan serangkaian permintaan PUT yang akan dibuat untuk mengirimkan konten melalui DASH. Urutan tersebut mengasumsikan bahwa URL dasar untuk endpoint DASH YouTube adalah:

http://upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=

Urutan tersebut menunjukkan segmen MPD dan Inisialisasi yang dikirim secara terpisah. Namun, segmen Inisialisasi dapat diwakili 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 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

Contoh MPD berikut memiliki segmen Inisialisasi tersemat di URL data RFC 2397. Sebaiknya sematkan segmen Inisialisasi dengan cara ini, bukan mengirimnya secara terpisah.

Contoh ini sesuai untuk proses transfer WebM (VP8 atau VP9, Opus) ke YouTube. Sebagian besar URL data telah diabaikan 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

Contoh MPD berikut, yang tidak memiliki segmen Inisialisasi tersemat, juga sesuai untuk proses transfer WebM (VP8 atau VP9, Opus) dengan 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 ini adalah tata letak contoh segmen Inisialisasi WebM. Video ini terdiri dari bagian streaming WebM hingga tetapi tidak termasuk cluster pertama.

Media

Berikut ini adalah tata letak contoh segmen media WebM. Aplikasi ini terdiri dari satu cluster WebM. Seperti streaming ISO BMFF, segmen Inisialisasi yang ditambahkan ke serangkaian cluster seharusnya menghasilkan streaming WebM yang valid.

Segmen BMFF ISO

MPD dengan segmen Inisialisasi tersemat

Contoh MPD berikut memiliki segmen Inisialisasi tersemat di URL data RFC 2397. Sebaiknya sematkan segmen Inisialisasi dengan cara ini, bukan mengirimnya secara terpisah.

Contoh ini sesuai untuk penyerapan ISO BMFF (H.264, AAC) ke YouTube. Sebagian besar URL data telah diabaikan 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

Contoh MPD 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 contoh segmen Inisialisasi ISO BMFF multipleks. YouTube tidak selalu menggunakan atom, tetapi ini adalah contoh yang sesuai. Secara khusus, trek audio dan video diwakili.

Media

Diagram berikut menunjukkan tata letak contoh segmen media ISO BMFF multipleks. YouTube tidak selalu menggunakan semua atom, tetapi ini adalah contoh yang sesuai. Secara khusus, trek audio dan video diwakili. Serangkaian segmen ini dapat ditambahkan ke segmen Inisialisasi untuk menghasilkan aliran data BMFF ISO multipleks yang valid dan lengkap.

Keterbatasan yang Telah Diketahui

Penyerapan RTMP dan DASH

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