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

Bu belgede, YouTube'da bir kodlayıcıdan canlı veri akışı yapmak için HTTP üzerinden Dinamik Adaptif Akış (DASH) yayın biçimini kullanmayla ilgili yönergeler verilmektedir. Bu kılavuz, kodlayıcı sağlayıcıların ürünlerine DASH teslimat desteği eklemesine yardımcı olmayı amaçlamaktadır.

DASH'ı anlama

Aşağıdaki listede bazı önemli DASH özellikleri ve nitelikleri yer almaktadır:

  • Açık standartlara dayanır.
  • HTTP tabanlı. Bu nedenle DASH, internet altyapısıyla uyumludur ve güvenlik duvarlarını geçebilir.
  • Yüksek aktarım bit hızını destekler. DASH, tek bir TCP bağlantısına dayanan protokollere kıyasla daha fazla esneklik sağlayan birden fazla eşzamanlı HTTP oturumunu ve sıralı olmayan segment teslimini destekler.
  • HTTPS üzerinden güvenli yayın.
  • HTTP ve HTTPS üzerinden kayıpsız yayın.
  • Codec'e bağlı değildir.
  • 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ınlar sunmak için DASH'i kullanmayla ilgili şartlar açıklanmaktadır.

Zamanlama

YouTube DASH uç noktası, kodlayıcı tarafından gönderilen PUT yöntemi çağrılarını kaydeden pasif bir HTTP sunucusu gibi davranır.

  • DASH uç noktası, eşzamanlı TCP bağlantılarını destekler. HTTP/1.1'e göre bağlantıları yeniden kullanabilirsiniz.
  • MPD ve başlatma segmentleri, ilk medya segmentinden sonraki 3 saniye içinde PUT yöntemiyle gönderilmelidir. (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 segmentleri için PUT işlemleri, yükleme bant genişliğini artırmak amacıyla zaman içinde çakışabilir.
  • Segmentler, yaklaşık 3 saniyelik bir zaman aralığında sırasız olarak sağlanabilir.
  • MPD ve başlatma segmentleri, güncellenmiş bir availabilityStartTime ve startNumber ile en az 60 saniyede bir 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 aracılığıyla uç noktanın temel URL'sini programatik olarak alabilir. URL'yi kodlayıcıya manuel olarak sağlamak istiyorsanız temel URL, YouTube Canlı Etkinlikler kullanıcı arayüzünde de görünür.

Temel URL'ye eklenen dize aşağıdaki ASCII karakterlerini 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 koşula ek olarak, MPD URL'si .mpd ile bitmelidir. Bu sayede YouTube sunucusu MPD'yi kolayca tanımlayabilir. Diğer segment URL'leri .mpd ile bitmemelidir.

Başlatma ve medya segmenti URL'leri

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

MPD içerikleri

MPD tamamlanmış olmalı ve DASH standardına uygun olmalıdır. Aşağıdaki öğelerin her birinden tam olarak bir tane içermelidir. Bu listede, YouTube'un özellikle gerektirdiği öğeler tanımlanmaktadır. DASH standardında, gerekli ek öğeler tanımlanabilir. Öğ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şullara dikkat edin:

  • <MPD> öğesinin minimumUpdatePeriod özelliği, 60 saniyeye (PT60S) eşit veya daha kısa 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'tan uzun olmamalıdır. (Genellikle bir başlatma segmenti bundan çok daha küçüktür.) Başlatma segmenti MPD'ye dahil edilmişse segmenti içeren data: URL'si 100 KB'tan uzun olmamalıdır.

Kodlayıcı çıkışı

Başlatma segmenti ve medya segmentleri, kapalı GOP'lere (resim grupları) sahip çoklu ISO BMFF veya WebM dosya akışı oluşturmalıdır.

  • GOP boyutu yaklaşık 2 saniye olmalı ve 8 saniyeden kısa olmalıdır.
  • Çoklanmış akış hem ses hem de video parçaları içermelidir.

Diğer en iyi uygulamalar

Şifreleme

YouTube, HTTPS üzerinden yayın şifrelemeyi destekler. Bu özelliği kullanmanızı önemle tavsiye ederiz.

MPD'deki başlatma segmentleri

RFC 2397 uyarınca, başlatma segmentini doğrudan MPD'de data: URL'si kullanarak temsil edebilirsiniz. Bu, akış kurulumunuzu basitleştirir ve başlatma segmentinin akışın geri kalanıyla eşleşmeme olasılığını azaltır.

Bu öğenin XPath'i:

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

Hedef segment süreleri

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

  • /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ürelerinin 2 katı içinde olmalıdır. Aksi takdirde yayın performansı olumsuz etkilenebilir.

Alım için hedef sürenin, YouTube'un ürettiği canlı yayın için parça süresine eşit olmadığını unutmayın. YouTube, girişi kod dönüştürür ve yeniden parçalara ayırır. Çıkış hedef süresi, akışın yayın kalitesi veya gecikme için optimize edilip edilmediğine bağlıdır.

Yeniden denemeler ve eksponansiyel geri yükleme

Tüm HTTP PUT istekleri zaman aşımı ile gerçekleştirilmelidir. Zaman aşımının, segment süresinden 500 milisaniye daha uzun bir değere ayarlanmasını öneririz.

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 denemeniz gerekir:

  1. Başarısızlık durumunda [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 tekrar deneyin.
  3. İstek tekrar başarısız olursa [0 ... 400] milisaniye arasında rastgele bir süre bekleyin ve isteği tekrar 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 bildirilmesi gerektiğini unutmayın.

HTTP yanıt kodları

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

200 (OK)

HTTP 200 (OK) yanıtı, YouTube sunucusunun beklenen bir işlemi aldığını ve başarılı bir şekilde işlediğini gösterir.

202 (Kabul edildi)

Herhangi bir PUT veya POST işlemine verilen HTTP 202 (Kabul Edildi) 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. Bu nedenle, yanıt YouTube'un işlemi gerçekten başarıyla işleyebileceğini garanti etmez.

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

Örneğin, YouTube aşağıdaki durumlarda 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, daha önceki bir segmentten önce alınır (ör. segment 3, segment 2'den önce alınır).

Ancak YouTube, POST veya PUT isteğini 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'yi almadan önce bir başlatma segmenti alıp kabul etmesi ancak başlatma segmentinin geçersiz çıkması bu duruma yol açabilir. Bu durumda YouTube, başlatma segmentini kabul eder ve 202 döndürür. Ardından, MPD alındıktan sonra segmentin geçerli olup olmadığını belirler. Bu senaryoyu önlemek için Başlatma segmentini MPD'ye ekleyebilirsiniz.

400 (Hatalı İstek)

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

  • 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ının temel URL'sinin bozulduğunu veya süresinin dolduğ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 HTTP 409 (Çakışma) yanıtı, YouTube'un isteği işleyemediğini gösterir. Örneğin, istekte bulunan kullanıcı çok sayıda medya segmenti göndermişse ancak YouTube'da hâlâ MPD veya başlatma segmenti ya da her ikisi de yoksa bu yanıt verilebilir. Bu örnekte, kodlayıcının başarısız olan 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 eksponansiyel geri yükleme ile yeniden denemenizi öneririz.

Örnekler

URL Dizisi

Aşağıdaki URL dizisi, DASH üzerinden içerik yayınlamak için yapılacak bir dizi PUT isteğini gösterir. Sıra, YouTube DASH uç noktasının temel URL'sinin şu olduğunu varsayar:

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

Sıra, MPD ve başlatma segmentlerinin ayrı ayrı gönderildiğini gösterir. Ancak Initialization segmenti doğrudan MPD'de gösterilebilir ve bu uygulama önerilir. Ayrıca MPD ve başlatma segmentleri en az 60 saniyede bir güncellenmelidir. Bu nedenle, bu segmentlerin URL'leri sonunda bu sırayla tekrar görünür ve ardından daha fazla medya segmentinin URL'leri gelir.

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ştirilmiş başlatma segmenti içeren MPD

Aşağıdaki örnek MPD, RFC 2397 veri URL'sinde yerleştirilmiş bir başlatma segmenti içerir. 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. Okunabilirlik için veri URL'sinin büyük bir kısmı çıkarı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ştirilmiş bir başlatma segmentine sahip olmamasına rağmen YouTube'a WebM (VP8 veya VP9, Opus) 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: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ç 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, bir dizi kümeye eklenen başlatma segmenti geçerli bir WebM akışı oluşturmalıdır.

ISO BMFF segmentleri

Yerleştirilmiş başlatma segmenti içeren MPD

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

Bu örnek, YouTube'a ISO BMFF (H.264, AAC) beslemesi için uygundur. Okunabilirlik için veri URL'sinin büyük bir kısmı çıkarı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

Aşağıdaki örnek MPD, yerleştirilmiş bir başlatma segmentine sahip olmamasına rağmen YouTube'a ISO BMFF (H.264, AAC) alı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, örnek bir çoklu ISO BMFF başlatma segmentinin düzeni gösterilmektedir. YouTube, atomları kullanmak zorunda değildir ancak bu, uygun bir örnektir. Özellikle hem ses hem de video parçaları gösterilir.

Medya

Aşağıdaki şemada, örnek bir çoklu ISO BMFF medya segmentinin düzeni gösterilmektedir. YouTube, atomların tümünü kullanmayabilir ancak bu, uygun bir örnektir. Özellikle hem ses hem de video parçaları gösterilir. Bu segmentlerden oluşan bir dizi, geçerli ve eksiksiz bir çoklu ISO BMFF akışı oluşturmak için bir Başlatma segmentine eklenebilir.

Bilinen Sınırlamalar

RTMP ve DASH alımları

YouTube'a RTMP ve DASH yüklemelerini karıştırmak mümkün değildir. Bu, yayın sırasında ikisi arasında geçiş yapmanın yanı sıra birini birincil alım yöntemi, diğerini ise yedek alım yöntemi olarak kullanmak için de geçerlidir.