DASH ile Canlı YouTube İçeriği Yayınlama

Bu dokümanda, bir kodlayıcıdan YouTube'da canlı yayın yapmak için DASH Yayınlama biçimini kullanma kuralları açıklanmaktadır. Kodlayıcı sağlayıcıların, ürünlerine DASH yayınlama desteği eklemesine yardımcı olmak amaçlanmıştır.

DASH'i anlama

Aşağıdaki listede bazı temel DASH özellikleri ve özellikleri listelenmiştir:

  • Açık standartları temel alır.
  • HTTP tabanlı. Sonuç olarak, DASH internet altyapısına uygundur ve güvenlik duvarlarıyla karşılıklı olarak geçiş yapabilir.
  • Yüksek aktarım bit hızını destekler. DASH, birden çok eş zamanlı HTTP oturumunu ve sıralı olmayan segment yayınını destekler. Bu sayede, tek bir TCP bağlantısına dayalı protokollerden daha fazla esneklik sunar.
  • HTTPS üzerinden güvenli teslimat.
  • HTTP ve HTTPS aracılığıyla kayıpsız teslimat.
  • Codec bağımsız.
  • H264 ve AAC içeren MP4'ün yanı sıra VP8/VP9 ve Vorbis/Opus içeren WebM'yi destekler.

Teknik Özellikler

Koşullar

Aşağıdaki alt bölümlerde, YouTube'da canlı yayın yapmak için DASH kullanımıyla ilgili şartlar açıklanmaktadır.

Zamanlama

YouTube DASH uç noktası pasif HTTP sunucusu işlevi görür ve kodlayıcı tarafından gönderilen PUT yöntemi çağrılarını kaydeder.

  • DASH uç noktası, eşzamanlı TCP bağlantılarını destekler. Bağlantıları HTTP/1.1'e göre yeniden kullanabilirsiniz.
  • MPD ve Başlatma segmentleri, ilk medya segmentinden sonraki 3 saniye içinde PUT olmalıdır. (Başlatma segmentini MPD'ye dahil etmenizi öneririz.)
  • Her segment veya MPD ayrı bir PUT isteği kullanmalıdır. Birden fazla segmentin çok parçalı yüklenmesi desteklenmez.
  • Medya segmentlerine ilişkin PUT işlemleri, yükleme bant genişliğini iyileştirmek için zaman içinde çakışabilir.
  • Segmentler, yaklaşık 3 saniyelik bir zaman aralığı içinde sıralı olmayan şekilde sağlanabilir.
  • MPD ve Başlatma segmentleri, en az 60 saniyede bir güncellenmiş availabilityStartTime ve startNumber ile güncellenmelidir. (Yukarıda belirtildiği gibi, Başlatma segmenti MPD'ye dahil edilebilir. Bu durumda, bir PUT isteği her iki segmenti de güncelleyebilir.)

URL yapısı

Kodlayıcınız, YouTube uç noktası temel URL'sine bir dize ekleyerek PUT URL'leri oluşturmalıdır. YouTube Live Streaming API'yi kullanarak DASH besleme uç noktası oluşturmanız gerekir.

Kodlayıcı, daha sonra uç noktanın temel URL'sini YouTube Live Streaming API üzerinden programatik olarak alabilir. URL'yi kodlayıcıya manuel olarak sağlamak isterseniz temel URL, YouTube Canlı Etkinlikler kullanıcı arayüzünde de görülebilir.

Temel URL'ye eklenen dize, aşağıdaki ASCII karakter grubunu içerebilir:

  • Küçük harfler: a-z
  • Büyük harfler: A-Z
  • Rakamlar: 0-9
  • Özel karakterler: _ (alt çizgi), - (kısa çizgi), . (nokta)

MPD URL'leri

Yukarıdaki şarta ek olarak MPD URL'sinin .mpd ile bitmesi, YouTube sunucusunun MPD'yi kolayca tanımlamasını sağlar.Diğer segment URL'leri .mpd ile bitemez.

Başlatma ve medya segmenti URL'leri

Başlatma segmenti URL'si ve tüm medya segmenti URL'leri, veriler bir ISO BMFF kapsayıcısındaysa .mp4 veya veriler bir WebM kapsayıcısındaysa .webm ile bitmelidir.

MPD içerikleri

MPD eksiksiz ve DASH standardına uygun olmalıdır. Aşağıdaki öğelerin her birini tam olarak içermelidir. Bu liste, YouTube tarafından özellikle gerekli olan öğeleri, DASH standardı ise ek gerekli öğeleri tanımlayabilir. Öğeler XPath söz dizimi kullanılarak gösterilir ve DASH standardıyla tutarlıdır.

  • /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

Öğe değerleri için aşağıdaki gereksinimleri göz önünde bulundurun:

  • <MPD> öğesinin minimumUpdatePeriod özelliği, 60 saniyeye (PT60S) eşit veya daha az olarak ayarlanmalıdır.
  • <SegmentTemplate> öğesinin media özelliği, medya segmenti URL'lerinin $Number$ kullanılarak oluşturulduğunu belirtmelidir. (startNumber özelliği, ilk medya segmentine atanacak sayıyı tanımlar.)

Başlatma segmenti uzunluğu

Başlatma segmenti 100 KB'tan uzun olmamalıdır. (Genellikle ilk kullanıma hazırlama segmenti bundan çok daha küçüktür.) Başlatma segmenti MPD'ye dahil edilirse segmenti içeren data: URL'si 100 KB'tan uzun olmamalıdır.

Kodlayıcı çıkışı

Başlatma segmenti ve medya segmentleri, kapalı GOP'lara sahip (çoklu resim grupları) ISO BMFF veya WebM dosya akışı içermelidir.

  • GOP boyutu yaklaşık 2 saniye ve 8 saniyeden kısa olmalıdır.
  • Çok kanallı akışta hem ses hem de video kanalları bulunmalıdır.

Diğer en iyi uygulamalar

Şifreleme

YouTube, HTTPS üzerinden akış şifrelemesini destekler. Bu özelliği kullanmanızı önemle tavsiye ederiz.

MPD'de başlatma segmentleri

RFC 2397 uyarınca, bir data: URL'si kullanarak Başlatma segmentini doğrudan MPD'de temsil edebilirsiniz. Bu, akış ayarlarınızı basitleştirir ve Başlatma segmentinin akışın geri kalanına karşılık gelme olasılığını azaltır.

Bu öğenin XPath'i:

/mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute:data

Hedef segment süreleri

İyi besleme performansı ve işleme hızı ile gecikme arasında iyi bir denge olması için medya segmentlerinizin uzunluğu 1 ile 5 saniye arasında olmalıdır.Aşağıdaki iki öğeyi kullanarak MPD'de bu segmentlerin hedef süresini iletmenizi önemle tavsiye ederiz:

  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::duration
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::timescale

Bu özelliklere göre hesaplanan süre, tüm gerçek segment sürelerinden veya akış performansından etkilenebilecek 2 faktör içinde olmalıdır.

Besleme için hedef sürenin, YouTube tarafından oluşturulan canlı yayının parça süresine eşit olmadığını unutmayın. YouTube, giriş kodunu dönüştürüp yeniden parçalara ayırır ve çıkış hedefi süresi, akışın akış kalitesi için mi yoksa gecikme için mi optimize edildiğine bağlıdır.

Yeniden denemeler ve eksponansiyel geri yükleme

Tüm HTTP PUT istekleri zaman aşımı ile gerçekleştirilmelidir. Bu işlem, segment süresinden 500 milisaniyeden büyük bir değere ayarlamanızı öneririz.

Zaman aşımı veya diğer hatalar nedeniyle başarısız olan bir medya segmenti PUT isteği, video akışındaki bir boşluğa karşılık gelir. Bu nedenle, bu tür istekleri rastgele bir ikili program eksponansiyel geri yükleme kullanarak tekrar denemeniz gerekir:

  1. Hata verildikten sonra [0 ... 100] milisaniye arasında rastgele bir süre bekleyin ve isteği yeniden deneyin.
  2. İstek tekrar başarısız olursa [0 ... 200] milisaniye arasında rastgele bir süre bekleyin ve isteği yeniden deneyin.
  3. İstek tekrar başarısız olursa [0 ... 400] milisaniye arasında rastgele bir süre bekleyin ve isteği yeniden deneyin.
  4. vb.

Tekrar eden hataların, başarısız bir yayına karşılık geldiği için kodlayıcı operatörüne sinyal vermesi gerektiğini unutmayın.

HTTP Yanıt kodları

Aşağıdaki bölümlerde, YouTube'un DASH ile yayınlanan segmentlere yanıt olarak döndürdüğü yanıt kodları açıklanmaktadır.

200 (Tamam)

HTTP 200 (Tamam) yanıtı, YouTube sunucusunun beklenen bir işlemi aldığını ve işlemi başarıyla gerçekleştirdiğini gösterir.

202 (Kabul edildi)

Herhangi bir PUT veya POST işlemine verilen HTTP 202 (Kabul Edilen) yanıtı, işlemin beklenmedik olduğunu ve ertelemenin işlenmesi için kabul edildiğini gösterir. Ancak, ertelenmiş işlem başarılı veya başarısız olabilir. Bu nedenle yanıt, YouTube'un işlemi başarılı bir şekilde gerçekleştirebileceğini garanti etmez.

Bu yanıt çoğunlukla segmentlerden biri sıralı olarak yayınlanmadığında gerçekleşir. Genellikle YouTube, kabul edilen segmenti önceki segmentleri aldıktan sonra doğru bir şekilde işleyebilir ve segmenti yeniden göndermeniz gerekmez.

Örneğin, YouTube aşağıdaki durumlardan birinde 202 yanıtı döndürebilir:

  • MPD'den önce bir başlatma segmenti alınır.
  • Medya segmentleri, MPD ve Başlatma segmentlerinden önce alınır.
  • Medya segmenti, 2. segmentten önce alınan segment 3 gibi önceki bir segmentten önce alınır.

Bununla birlikte 202 yanıtı, YouTube'un POST veya PUT isteği alındığında tanımlayıcıyı tam olarak doğrulayamadığı durumlarda da öğe tanımlayıcısının yanlış olduğunu gösterebilir. Örneğin, bu durumlardan biri YouTube'un MPD'yi almadan önce bir başlangıç segmenti alıp kabul etmesi ancak başlatma segmentinin geçersiz olmasıdır. Bu durumda YouTube, ilk kullanıma hazırlama segmentini kabul eder ve 202 değerini döndürür. Ardından segmentin MPD alındığında geçerli olup olmadığını belirler. MPD'ye Başlatma segmentini dahil ederek bu senaryoyu önleyebilirsiniz.

400 (Yanlış İstek)

HTTP 400 (Yanlış İstek) yanıtı, aşağıdaki sorunlardan birinin gerçekleştiğini gösterir:

  • URL hatalı
  • Yayın çok büyük (> 10 MB)
  • MPD ayrıştırılamıyor
  • MPD'deki Başlatma segmenti bozuk

401 (Yetkisiz)

HTTP 401 (Yetkisiz) yanıtı, YouTube DASH uç noktasının temel URL'sinin bozuk veya kullanım süresinin dolmuş olduğunu gösterir.

405 (Yönteme İzin Verilmiyor)

HTTP 405 (Yönteme İzin Verilmiyor) yanıtı, POST veya PUT dışında bir isteğin gönderildiğini gösterir.

409 (Çakışma)

Herhangi bir PUT veya POST işlemine verilen bir HTTP 409 (Çakışma) yanıtı, YouTube'un isteği işleyemediğini gösterir. Örneğin, istek gönderen kişi çok sayıda medya segmenti göndermişse ancak YouTube yine de MPD'ye, Başlatma segmentine veya her ikisine birden sahip değilse bu yanıt oluşabilir. Bu örnekte, başarısız isteği yeniden denemeden önce kodlayıcının MPD ve Başlatma segmentlerini yeniden iletmesi gerekir.

500 (Dahili Sunucu Hatası)

HTTP 500 (Dahili Sunucu Hatası) yanıtı, sunucunun isteği işleyemediğini gösterir. Bu hata için isteği eksponansiyel geri yükleme ile yeniden denemenizi öneririz.

Örnekler

URL Sırası

Aşağıdaki URL dizisi, DASH üzerinden içerik yayınlamak için yapılacak bir dizi PUT isteğini göstermektedir. Dizide, YouTube DASH uç noktasının temel URL'sinin şu olduğu varsayılır:

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

Dizide, ayrı olarak gönderilen MPD ve Başlatma segmentleri gösterilir. Ancak, Başlatma segmenti doğrudan MPD'de gösterilebilir ve bu önerilen bir uygulamadır. Ayrıca, MPD ve Başlatma segmentleri en az 60 saniyede bir güncellenmelidir. Böylece, ilgili bölümlerin URL'leri bu sırayla tekrar gerçekleşir ve daha fazla medya segmentinin URL'lerini izler.

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

WebM segmentleri

Yerleşik Başlatma segmenti olan MPD

Aşağıdaki örnek MPD'nin, RFC 2397 veri URL'sine yerleştirilmiş bir Başlatma segmenti vardır. Başlatma segmentini ayrı olarak göndermek yerine bu şekilde yerleştirmenizi öneririz.

Bu örnek, YouTube'a WebM (VP8 veya VP9, Opus) alımı için uygundur. Veri URL'sinin büyük kısmı okunabilirlik için hazırlandı:

<?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>

199

Yerleştirilmiş bir Başlatma segmenti bulunmayan aşağıdaki örnek MPD, YouTube'a WebM (VP8 veya VP9, Opus) aktarımı için de uygundur:

<?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>

Başlatma

Aşağıda, örnek bir WebM Başlatma segmentinin düzeni gösterilmektedir. WebM akışının, ilk küme hariç olacak şekildeki kısmından oluşur.

Medya

Aşağıda, örnek bir WebM medya segmentinin düzeni gösterilmektedir. Tek bir WebM kümesinden oluşur. ISO BMFF akışında olduğu gibi, başına eklenen bir dizi kümenin geçerli olduğu WebM akışı geçerli olur.

ISO BMFF segmentleri

Yerleşik Başlatma segmenti olan MPD

Aşağıdaki örnek MPD'nin, RFC 2397 veri URL'sine yerleştirilmiş bir Başlatma segmenti vardır. Başlatma segmentini ayrı olarak göndermek yerine bu şekilde yerleştirmenizi öneririz.

Bu örnek, YouTube'a ISO BMFF (H.264, AAC) aktarımı için uygundur. Veri URL'sinin büyük kısmı okunabilirlik için hazırlandı:

<?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>

199

Yerleştirilmiş bir Başlatma segmenti bulunmayan aşağıdaki örnek MPD, YouTube'a ISO BMFF (H.264, AAC) aktarımı için de uygundur:

<?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>

Başlatma

Aşağıdaki şemada, birden fazla kez kullanılan, ISO BMFF Başlatma segmentinin düzeni gösterilmektedir. YouTube'un atomları kullanması şart değildir ancak bu duruma uygun bir örnektir. Özellikle, ses ve video parçaları temsil edilir.

Medya

Aşağıdaki şemada, çok sayıda örneklenmiş ISO BMFF medya segmentinin düzeni gösterilmektedir. YouTube tüm atomları kullanmayabilir ancak bu duruma uygun bir örnek. Özellikle, ses ve video parçaları temsil edilir. Bu segmentlerden oluşan bir seri, geçerli ve eksiksiz bir çok katlı ISO BMFF akışı oluşturmak için bir Başlatma segmentine eklenebilir.

Bilinen Sınırlamalar

RTMP ve DASH beslemeleri

RTMP ve DASH beslemelerini YouTube ile birlikte kullanmak mümkün değildir.Bu durum, bir yayın sırasında iki yöntem arasında geçiş yapmanın yanı sıra birini birincil besleme yöntemi olarak, diğerini yedek besleme için kullanmak için de geçerlidir.