Mengirimkan Konten YouTube Live melalui DASH

Dokumen ini memberikan panduan tentang cara menggunakan format Penayangan DASH untuk melakukan streaming data langsung di YouTube dari encoder. Hal ini dimaksudkan untuk membantu vendor encoder menambahkan dukungan pengiriman DASH ke produk mereka.

Memahami DASH

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

  • Berdasarkan standar terbuka.
  • Berbasis HTTP. Hasilnya, DASH ramah infrastruktur internet dan dapat melintasi firewall.
  • Mendukung kecepatan bit transfer tinggi. DASH mendukung beberapa sesi HTTP simultan dan pengiriman segmen non-urutan, yang memberikan ketahanan yang lebih besar daripada protokol yang mengandalkan satu koneksi TCP.
  • Pengiriman yang aman melalui HTTPS.
  • Pengiriman tanpa kerugian melalui HTTP dan HTTPS.
  • Tidak ada codec.
  • Mendukung MP4 yang berisi H264 dan AAC serta WebM yang berisi VP8/VP9 dan Vorbis/Opus.

Spesifikasi

Persyaratan

Sub-bagian 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.

  • Endpoint DASH mendukung koneksi TCP simultan. Anda dapat menggunakan kembali koneksi sesuai HTTP/1.1.
  • Segmen MPD dan Inisialisasi harus PUT dalam waktu 3 detik dari segmen media pertama. (Sebaiknya Anda menyertakan segmen Inisialisasi dalam MPD.)
  • Setiap segmen atau MPD harus menggunakan permintaan PUT terpisah; upload multi-bagian dari beberapa segmen tidak didukung.
  • Operasi PUT untuk segmen media mungkin tumpang-tindih waktunya untuk meningkatkan bandwidth upload.
  • Segmen dapat diberikan dalam urutan yang tidak 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 harus berupa URL PUT dengan menambahkan string ke URL dasar endpoint YouTube. Anda harus membuat endpoint penyerapan DASH dengan 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 Live Streaming 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 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 BMFF ISO atau dengan .webm jika data berada dalam penampung WebM.

Konten MPD

MPD harus lengkap dan sesuai dengan standar DASH. File ini harus berisi salah satu elemen berikut. Daftar ini mengidentifikasi elemen yang secara khusus diperlukan oleh YouTube, dan standar DASH mungkin 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 ditetapkan 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 untuk 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 membentuk aliran file BMFF atau WebM ISO yang diduplikasi dengan GOP tertutup (kelompok gambar).

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

Praktik terbaik tambahan

Enkripsi

YouTube mendukung enkripsi streaming melalui HTTPS. Sebaiknya Anda menggunakan fitur ini.

Segmen inisialisasi dalam MPD

Anda dapat merepresentasikan segmen Inisialisasi langsung di MPD menggunakan URL data:, sesuai dengan RFC 2397. Tindakan ini menyederhanakan penyiapan aliran data Anda dan mengurangi kemungkinan segmen Inisialisasi tidak akan sesuai dengan aliran data 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 keseimbangan yang baik antara throughput dan latensi, durasi segmen media Anda harus antara 1 dan 5 detik.Sebaiknya sampaikan durasi target segmen tersebut dalam 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.

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

Percobaan ulang dan backoff eksponensial

Semua permintaan HTTP PUT harus dijalankan dengan waktu tunggu, yang direkomendasikan untuk menyetel ke nilai 500 milidetik yang lebih besar daripada durasi segmen.

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

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

Perhatikan bahwa kegagalan berulang harus diinformasikan kepada operator encoder karena berkaitan dengan siaran yang gagal.

Kode Respons HTTP

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

200 (Oke)

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

202 (Diterima)

Respons HTTP 202 (Disetujui) untuk operasi PUT atau POST apa pun menunjukkan bahwa operasi tidak diharapkan dan diterima untuk pemrosesan yang ditangguhkan. Namun, operasi yang ditangguhkan dapat berhasil atau gagal, sehingga respons tidak menjamin bahwa YouTube akan benar-benar berhasil memproses operasi tersebut.

Respons ini paling sering terjadi saat segmen ditayangkan 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 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 memvalidasi ID sepenuhnya setelah menerima permintaan POST atau PUT. Misalnya, salah satu kasus yang terjadi adalah saat YouTube menerima dan menerima segmen inisialisasi sebelum menerima MPD, tetapi segmen inisialisasinya ternyata tidak valid. Dalam hal ini, YouTube menerima segmen inisialisasi dan menampilkan error 202, lalu menentukan apakah segmen tersebut valid setelah MPD diterima. 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:

  • URL tidak benar.
  • Ukuran 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 (Bentrok)

Respons HTTP 409 (Konflik) untuk operasi PUT atau POST apa pun menunjukkan bahwa YouTube tidak dapat memproses permintaan. Misalnya, respons ini mungkin terjadi jika pemohon telah mengirim banyak segmen media, tetapi YouTube masih belum memiliki MPD, segmen Inisialisasi, atau keduanya. Dalam contoh tersebut, encoder perlu mentransmisikan ulang segmen MPD dan Inisialisasi sebelum mencoba kembali 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 dengan backoff eksponensial.

Contoh

Urutan URL

Urutan URL di bawah menunjukkan serangkaian permintaan PUT yang akan dibuat untuk mengirim 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 ini 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 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 yang disematkan

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

Contoh ini sesuai dengan penyerapan WebM (VP8 atau VP9, Opus) ke YouTube. Sebagian besar URL data telah dihapus 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 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 ini contoh tata letak segmen Inisialisasi WebM. Ini terdiri dari bagian aliran WebM hingga tetapi tidak termasuk cluster pertama.

Media

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

Segmen BMFF ISO

MPD dengan segmen Inisialisasi yang disematkan

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

Contoh ini sesuai dengan penyerapan ISO BMFF (H.264, AAC) ke YouTube. Sebagian besar URL data telah dihapus 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 dengan 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 sampel segmen Inisialisasi ISO BMFF multipleks. YouTube tidak selalu menggunakan atom, tetapi ini adalah contoh yang sesuai. Khususnya, trek audio dan video akan direpresentasikan.

Media

Diagram berikut menampilkan tata letak sampel segmen media ISO BMFF multipleks. YouTube tidak selalu menggunakan semua atom, tetapi ini adalah contoh yang sesuai. Khususnya, trek audio dan video akan direpresentasikan. Serangkaian segmen ini dapat ditambahkan ke segmen Inisialisasi untuk menghasilkan streaming BMFF ISO multipleks yang valid dan lengkap.

Batasan Umum

Penyerapan RTMP dan DASH

Penyerapan RTMP dan DASH tidak dapat digabungkan ke YouTube.Ini berlaku untuk beralih antara keduanya selama siaran serta menggunakan salah satunya sebagai metode penyerapan utama dan yang lainnya untuk penyerapan cadangan.