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
- DASH, ISO/IEC 23009-1:2014 Bilgi teknolojisi -- HTTP üzerinden dinamik uyarlanabilir akış (DASH) bölümünde açıklanmıştır.
- DASH üzerinden WebM, WebM DASH spesifikasyonunda açıklanmıştır.
Ş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
vestartNumber
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>
öğesininminimumUpdatePeriod
özelliği, 60 saniyeye eşit veya 60 saniyeden kısa (PT60S
) bir değere ayarlanmalıdır.<SegmentTemplate>
öğesininmedia
ö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:
- Bir hata oluştuktan sonra,
[0 ... 100]
milisaniye arasında rastgele bir süre bekleyin ve isteği yeniden deneyin. - İstek tekrar başarısız olursa
[0 ... 200]
milisaniye arasında rastgele bir süre bekleyin ve isteği yeniden deneyin. - İstek tekrar başarısız olursa
[0 ... 400]
milisaniye arasında rastgele bir süre bekleyin ve isteği yeniden deneyin. - 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©=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©=0&file=dash.mpd PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx©=0&file=init.mp4 PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx©=0&file=media001.mp4 PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx©=0&file=media002.mp4 PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx©=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©=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©=0&file=init.webm" media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx©=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©=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©=0&file=init.mp4" media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx©=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.