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

Bu dokümanda, bir kodlayıcıdan YouTube'da canlı veri akışı gerçekleştirmek için HTTP üzerinden Dinamik Uyarlanabilir Akış (DASH) Yayınlama biçiminin kullanımıyla ilgili yönergeler açıklanmaktadır. Kodlayıcı tedarikçilerinin ürünlerine DASH yayınlama desteği eklemesine yardımcı olmak amaçlanır.

DASH'i anlama

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

  • Açık standartlara dayanır.
  • HTTP tabanlıdır. Sonuç olarak DASH, internet altyapısında kullanılabilir ve güvenlik duvarlarını geçebilir.
  • Yüksek aktarım bit hızını destekler. DASH, aynı anda birden çok HTTP oturumunu ve sıralı olmayan segment teslimini destekleyerek tek bir TCP bağlantısına dayanan protokollere göre daha fazla esneklik sağlar.
  • HTTPS aracılığıyla güvenli teslim.
  • HTTP ve HTTPS üzerinden kayıpsız teslim.
  • Codec'ten bağımsızdır.
  • H264 ve AAC içeren MP4'ün yanı sıra VP8/VP9 ve Vorbis/Opus içeren WebM'yi destekler.

Özellikler

Şartlar

Aşağıdaki alt bölümlerde, YouTube'da canlı yayın yapmak için DASH kullanma koşulları açıklanmaktadır.

Zamanlama

YouTube DASH uç noktası pasif bir HTTP sunucusu gibi davranı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 3 saniye sonra PUT değerine ayarlanmalıdır. (Başlatma segmentini MPD'ye eklemenizi öneririz.)
  • Her segment veya MPD ayrı bir PUT isteği kullanmalıdır; birden fazla segmentin çok parçalı yüklemesi desteklenmez.
  • Medya segmentlerinin PUT işlemleri, yükleme bant genişliğini artırmak için zaman içinde çakışabilir.
  • Segmentler, yaklaşık 3 saniyelik bir zaman aralığı içinde sıralı olmayan bir ş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ç nokta 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 YouTube Live Streaming API üzerinden uç noktanın temel URL'sini 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ünür.

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

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

MPD URL'leri

Yukarıdaki koşula ek olarak, MPD URL'si .mpd ile bitmelidir. Böylece, YouTube sunucusu MPD'yi kolayca tanıyabilir.Diğer segment URL'leri .mpd ile bitemez.

Başlatma ve medya segmenti URL'leri

Veriler bir ISO BMFF kapsayıcısındaysa Başlatma segmenti URL'si ve tüm medya segmenti URL'leri .mp4, 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 birinden tam olarak birini içermelidir. Bu liste, YouTube'un özellikle gerektirdiği öğeleri tanımlar ve DASH standardı gerekli ek öğ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ğerleriyle ilgili aşağıdaki koşulları göz önünde bulundurun:

  • <MPD> öğesinin minimumUpdatePeriod özelliği, 60 saniyeye eşit veya 60 saniyeden kısa (PT60S) bir değere 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 numarayı tanımlar.)

Başlatma segmenti uzunluğu

Başlatma segmenti 100 kb'den uzun olmamalıdır. (Bir Başlatma segmenti genellikle bundan çok daha küçüktür.) Başlatma segmenti MPD'ye dahilse segmenti içeren data: URL'si 100 kb'den uzun olmamalıdır.

Kodlayıcı çıkışı

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

  • GOP boyutu yaklaşık 2 saniye ve 8 saniyeden kısa olmalıdır.
  • Multiplex uygulanmış yayın, hem ses hem de video kanalları içermelidir.

Diğer en iyi uygulamalar

Şifreleme

YouTube, HTTPS aracılığıyla akış şifrelemesini destekler. Bu özelliği kullanmanızı önemle tavsiye ederiz.

MPD'deki başlatma segmentleri

Başlatma segmentini, RFC 2397 uyarınca bir data: URL'si kullanarak doğrudan MPD'de gösterebilirsiniz. Bu, akış kurulumunuzu basitleştirir ve Başlatma segmentinin akışın geri kalanına karşılık gelmeme olasılığını azaltır.

Bu öğenin XPath'i şudur:

/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 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 bildirmenizi öneririz:

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

Bu özelliklerden hesaplanan süre, tüm gerçek segment sürelerine göre 2 kat fazla olmalıdır. Aksi takdirde akış performansı olumsuz etkilenebilir.

Besleme için hedef sürenin, YouTube'un oluşturduğu canlı yayının yığın süresine eşit olmadığını unutmayın. YouTube, girişi kodlayıp yeniden parçalara ayırır. Çıkış hedefi süresi, yayının akış kalitesi için mi yoksa gecikme için mi optimize edildiğine bağlıdır.

Yeniden deneme ve eksponansiyel geri yükleme

Tüm HTTP PUT istekleri, zaman aşımıyla gerçekleştirilmelidir. Segment süresinden 500 milisaniye daha büyük bir değere ayarlanması önerilir.

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

  1. Bir hata oluştuktan 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.

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

HTTP yanıt kodları

Aşağıdaki bölümlerde, YouTube'un DASH aracılığıyla 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 bunu başarılı bir şekilde işlediğini belirtir.

202 (Kabul edildi)

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

Bu yanıt en sık, bir segment sıralı olmayan bir şekilde yayınlandığında ortaya çıkar. YouTube genellikle önceki segmentleri aldıktan sonra kabul edilen segmenti doğru şekilde işleyebilir. Segmenti yeniden göndermeniz gerekmez.

Örneğin, YouTube aşağıdaki durumlardan herhangi 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.
  • Bir medya segmenti, segment 2'den önce alınması gibi segment 3'ten önce alınır.

Ancak YouTube, POST veya PUT isteği aldıktan sonra tanımlayıcıyı tam olarak doğrulayamazsa 202 yanıtı, öğe tanımlayıcısının yanlış olduğunu da gösterebilir. Örneğin, YouTube'un MPD almadan önce bir başlatma segmenti alıp kabul etmesi ancak başlatma segmentinin geçersiz olması, bu durumun yaşandığı durumlardan biridir. Bu durumda YouTube, başlatma segmentini kabul eder ve bir 202 değeri döndürür. Ardından, MPD alındıktan sonra segmentin geçerli olup olmadığını belirler. MPD'ye Başlatma segmentini dahil ederek bu durumun önüne geçebilirsiniz.

400 (Hatalı İstek)

HTTP 400 (Hatalı İstek) yanıtı, aşağıdaki sorunlardan birinin oluştuğunu belirtir:

  • URL hatalı biçimlendirilmiş.
  • 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ı için temel URL'nin bozuk veya süresi dolmuş olduğunu belirtir.

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)

PUT veya POST işlemlerine verilen HTTP 409 (Çakışma) yanıtı, YouTube'un isteği işleyemediğini gösterir. Örneğin, istekte bulunan kişi çok sayıda medya segmenti göndermişse ancak YouTube'da MPD, Başlatma segmenti veya her ikisi de yoksa bu yanıt oluşabilir. Bu örnekte, kodlayıcının başarısız isteği yeniden denemeden önce 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 üstel geri yükleme ile yeniden denemenizi öneririz.

Örnekler

URL Sırası

Aşağıdaki URL dizisi, DASH aracılığıyla içerik yayınlamak için yapılacak bir dizi PUT isteğini göstermektedir. Sıra, YouTube DASH uç noktası için temel URL'nin şu olduğunu varsayar:

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

Sıra, ayrı olarak gönderilen MPD ve Başlatma segmentlerini gösterir. Ancak Başlatma segmenti doğrudan MPD'de temsil edilebilir ve bu uygulama önerilir. Ayrıca, MPD ve Başlatma segmentleri en az 60 saniyede bir güncellenmelidir. Dolayısıyla, sonunda bu segmentlerin URL'leri bu sırada tekrar gelir ve bunları, daha fazla medya segmentinin URL'leri 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 segmentine sahip MPD

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

Bu örnek, YouTube'a WebM (VP8 veya VP9, Opus) beslemesine uygundur. Veri URL'sinin büyük bir kısmı okunabilirlik açısından kaldırıldı:

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

Aşağıdaki örnek MPD, yerleşik bir başlatma segmentine sahip değildir ve YouTube'a WebM (VP8 veya VP9, Opus) beslemesine 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ümeye kadar olan kısmından oluşur ancak ilk kümeyi hariç tutar.

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, bir dizi kümenin başında bulunan Başlatma segmenti geçerli bir WebM akışı oluşturmalıdır.

ISO BMFF segmentleri

Yerleşik başlatma segmentine sahip MPD

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

Bu örnek, YouTube'a ISO BMFF (H.264, AAC) beslemeye uygundur. Veri URL'sinin büyük bir kısmı okunabilirlik açısından kaldırıldı:

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

Yerleşik bir Başlatma segmenti bulunmayan aşağıdaki örnek MPD, YouTube'a ISO BMFF (H.264, AAC) beslemesi 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, Multiplex uygulanmış ISO BMFF Başlatma segmentinin düzeni gösterilmektedir. YouTube'da atomlar kullanılması zorunlu değildir ancak bu, uygun bir örnektir. Özellikle, hem ses hem de video parçaları temsil edilir.

Medya

Aşağıdaki şemada, çok kanallı örnek bir ISO BMFF medya segmentinin düzeni gösterilmektedir. YouTube tüm atomları kullanmasa da bu, uyumlu bir örnek. Özellikle, hem ses hem de video parçaları temsil edilir. Bu segmentlerin bir serisi, geçerli ve eksiksiz bir çoğullama ISO BMFF akışı oluşturmak için bir Başlatma segmentine eklenebilir.

Bilinen Sınırlamalar

RTMP ve DASH beslemeleri

RTMP ve DASH beslemeleri YouTube'a karıştırılamaz.Bu durum, yayın sırasında ikisi arasında geçiş yapmanın yanı sıra birini birincil besleme yöntemi olarak kullanırken diğeri yedek besleme için geçerlidir.