HTTP Canlı Akışına Giriş: Android'de HLS ve Daha Fazlası
Yayınlanan: 2022-03-11Video akışı, modern internet deneyiminin ayrılmaz bir parçasıdır. Her yerde: cep telefonlarında, masaüstü bilgisayarlarda, TV'lerde ve hatta giyilebilir cihazlarda. İster yavaş mobil bağlantılarda, ister WiFi, güvenlik duvarlarının arkasında, vb. olsun, her cihazda ve ağ türünde kusursuz çalışması gerekir. Apple'ın HTTP Canlı Akışı (HLS) tam olarak bu zorluklar düşünülerek oluşturulmuştur.
Hemen hemen tüm modern cihazlar, video oynatmak için yeterince hızlı modern donanımlarla donatılmış olarak gelir, bu nedenle ağ hızı ve güvenilirliği en büyük sorun olarak ortaya çıkar. Nedenmiş? Birkaç yıl öncesine kadar, videoyu depolamanın ve yayınlamanın kurallı yolu, RTP gibi UDP tabanlı protokollerdi. Bu, sadece birkaçını listelemek için birçok yönden sorunlu olduğunu kanıtladı:
- İçerik akışı için bir sunucu (arka plan programı) hizmetine ihtiyacınız var.
- Çoğu güvenlik duvarı, yalnızca standart bağlantı noktalarına ve http, e-posta vb. gibi ağ trafiği türlerine izin verecek şekilde yapılandırılmıştır.
- Hedef kitleniz küreselse, tüm büyük bölgelerde çalışan akış arka plan programı hizmetinizin bir kopyasına ihtiyacınız vardır.
Tabii ki, tüm bu sorunların çözülmesinin kolay olduğunu düşünebilirsiniz. Sadece video dosyalarını (örneğin, mp4 dosyaları) http sunucunuzda saklayın ve dünyanın herhangi bir yerinde onlara sunmak için en sevdiğiniz CDN hizmetini kullanın.
Eski Video Akışının Yetersiz Kaldığı Yer
Bu, birkaç nedenden dolayı en iyi çözüm olmaktan uzaktır, verimlilik bunlardan biridir. Orijinal video dosyalarını tam çözünürlükte saklarsanız, kırsal alanlardaki veya dünyanın zayıf bağlantıya sahip bölgelerindeki kullanıcılar bunlardan keyif almakta zorlanırlar. Video oynatıcıları, çalışma zamanında oynatmak için yeterli veriyi indirmek için mücadele edecek.
Bu nedenle, indirilen video miktarının oynatılabilecek miktarla yaklaşık olarak aynı olması için dosyanın özel bir sürümüne ihtiyacınız vardır. Örneğin, video çözünürlüğü ve kalitesi, beş saniye içinde başka bir beş saniyelik video indirebilecek şekildeyse, bu en uygunudur. Ancak, yalnızca üç saniyelik video indirmek beş saniye sürerse, oynatıcı duracak ve akışın bir sonraki parçasının indirilmesini bekleyecektir.
Öte yandan, kaliteyi ve çözünürlüğü daha da düşürmek, bant genişliğini gereksiz yere koruyacağınız için yalnızca daha hızlı bağlantılarda kullanıcı deneyimini bozar. Ancak, üçüncü bir yol var.
Uyarlanabilir Bit Hızı Akışı
Farklı kullanıcılar için farklı video sürümlerini yükleyebilmenize rağmen, daha sonra oynatıcılarını kontrol etme ve bağlantıları ve cihazları için en iyi akışın ne olduğunu hesaplama yeteneğine sahip olmanız gerekir. Ardından, oynatıcının bunlar arasında geçiş yapması gerekir (örneğin, bir kullanıcı 3G'den WiFi'ye geçtiğinde). Ve o zaman bile, ya istemci ağ türünü değiştirirse? Ardından oynatıcı farklı bir videoya geçmelidir, ancak video baştan değil, videonun ortasında bir yerden oynatılmaya başlamalıdır. Peki talep edilecek bayt aralığını nasıl hesaplarsınız?
Video oynatıcılar, ağ türündeki ve kullanılabilir bant genişliğindeki değişiklikleri algılayabilir ve ardından en iyisini bulana kadar farklı akışlar (aynı videonun farklı hızlar için hazırlanmış) arasında şeffaf bir şekilde geçiş yapabilirse harika bir şey olurdu.
Uyarlanabilir bit hızı akışının çözdüğü tam olarak budur.
Not: Bu HLS öğreticisi, şifrelemeyi, senkronize oynatmaları ve IMSC1'i kapsamayacaktır.
HLS nedir?
HTTP Canlı Akış, Apple tarafından 2009'da tanıtılan uyarlanabilir bir bit hızı akış protokolüdür. Medya akışlarını tanımlamak için m3u8 dosyalarını ve sunucu ile istemci arasındaki iletişim için HTTP'yi kullanır. Tüm iOS cihazları için varsayılan medya akış protokolüdür, ancak Android ve web tarayıcılarında kullanılabilir.
HLS akışlarının temel yapı taşları şunlardır:
- M3U8 çalma listeleri
- Çeşitli akışlar için medya dosyaları
M3U8 Oynatma Listeleri
Temel bir soruyu yanıtlayarak başlayalım: M3U8 dosyaları nelerdir?
M3U (veya M3U8), orijinal olarak MP3 dosyaları koleksiyonlarını düzenlemek için oluşturulmuş bir düz metin dosyası biçimidir. Biçim, medya akışlarını tanımlamak için kullanıldığı HLS için genişletilmiştir. HLS'de iki tür m3u8 dosyası vardır:
- Medya oynatma listesi: akış için gereken dosyaların URL'lerini içerir (yani oynatılacak orijinal videonun parçaları).
- Ana oynatma listesi: sırasıyla aynı videonun farklı bant genişlikleri için hazırlanmış türevlerini içeren medya oynatma listelerinin URL'lerini içerir.
Sözde M3U8 canlı akış URL'si, M3U8 dosyalarının URL'lerinden başka bir şey değildir, örneğin: https://s3-us-west-2.amazonaws.com/hls-playground/hls.m3u8.
HLS Akışı için Örnek M3U8 Dosyası
Bir M3U8 dosyası, bazı ek meta verilerle birlikte bir url listesi veya yerel dosya yolları içerir. Meta veri satırları # ile başlar.
Bu örnek, basit bir HLS akışı için bir M3U8 dosyasının nasıl göründüğünü gösterir:
#EXTM3U #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-ALLOW-CACHE:YES #EXT-X-TARGETDURATION:11 #EXTINF:5.215111, 00000.ts #EXTINF:10.344822, 00001.ts #EXTINF:10.344822, 00002.ts #EXTINF:9.310344, 00003.ts #EXTINF:10.344822, 00004.ts ... #EXT-X-ENDLIST
- İlk dört satır, bu M3U8 oynatma listesi için genel (başlık) meta verileridir.
-
EXT-X-VERSION
, M3U8 formatının sürümüdür (EXTINF
girişlerini kullanmak istiyorsak en az 3 olmalıdır). -
EXT-X-TARGETDURATION
etiketi, her video "parçasının" maksimum süresini içerir. Tipik olarak, bu değer 10s civarındadır. - Belgenin geri kalanı aşağıdaki gibi satır çiftleri içerir:
#EXTINF:10.344822, 00001.ts
Bu bir "parça" videosudur. Bu, tam olarak 10.344822 saniye uzunluğunda olan 00001.ts
yığınını temsil eder. Bir istemci video oynatıcı, söz konusu videoda belirli bir noktadan bir video başlatması gerektiğinde, daha önce görüntülenen parçaların sürelerini ekleyerek hangi .ts
dosyasını talep etmesi gerektiğini kolayca hesaplayabilir. İkinci satır, yerel bir dosya adı veya o dosyanın URL'si olabilir.
.ts
dosyalarıyla birlikte M3U8 dosyası, bir HLS akışının en basit biçimini temsil eder - bir medya oynatma listesi.
Lütfen her tarayıcının varsayılan olarak HLS akışlarını oynatamayacağını unutmayın.
Ana Çalma Listesi veya Dizin M3U8 Dosyası
Önceki M3U8 örneği, bir dizi .ts
parçasına işaret ediyor. Yeniden boyutlandırılan ve parçalara ayrılan orijinal video dosyasından oluşturulurlar.
Bu, girişte ana hatlarıyla belirtilen sorunumuz olduğu anlamına gelir - çok yavaş (veya alışılmadık derecede hızlı) ağlardaki istemciler ne olacak? Veya çok küçük ekran boyutlarına sahip hızlı ağlardaki istemciler mi? Parlak yeni telefonunuzda tüm görkemiyle görüntülenemiyorsa, bir dosyayı maksimum çözünürlükte yayınlamanın bir anlamı yoktur.
HLS, bu sorunu M3U8'in başka bir "katmanını" tanıtarak çözer. Bu M3U8 dosyası , .ts
dosyalarına yönelik işaretçiler içermez, ancak diğer M3U8 dosyalarına yönelik işaretçiler içerir, bunlar da önceden belirli bit hızları ve çözünürlükler için hazırlanmış video dosyalarını içerir.
İşte böyle bir M3U8 dosyası örneği:
#EXTM3U #EXT-X-STREAM-INF:BANDWIDTH=1296,RESOLUTION=640x360 https://.../640x360_1200.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=264,RESOLUTION=416x234 https://.../416x234_200.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=464,RESOLUTION=480x270 https://.../480x270_400.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=1628,RESOLUTION=960x540 https://.../960x540_1500.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=2628,RESOLUTION=1280x720 https://.../1280x720_2500.m3u8
Video oynatıcı aşağıdaki gibi satır çiftlerini seçecektir:
#EXT-X-STREAM-INF:BANDWIDTH=1296,RESOLUTION=640x360 https://.../640x360_1200.m3u8
Bunlara aynı videonun farklı ağ hızları ve ekran çözünürlükleri için hazırlanmış varyantları denir. Bu özel M3U8 dosyası ( 640x360_1200.m3u8
), videonun 640x360 piksel olarak yeniden boyutlandırılan ve 1296 kbps bit hızları için hazırlanmış video dosyası parçalarını içerir. Bildirilen bit hızının videodaki hem video hem de ses akışlarını hesaba katması gerektiğini unutmayın.
Video oynatıcı genellikle ilk akış varyantından oynatmaya başlar (önceki örnekte bu 640x360_1200.m3u8'dir). Bu nedenle listede hangi varyantın ilk olacağına özellikle dikkat etmelisiniz. Diğer varyantların sırası önemli değildir.
İlk .ts dosyasının indirilmesi çok uzun sürerse ("arabelleğe almaya", yani bir sonraki parçayı beklemeye neden olur), video oynatıcı daha küçük bit hızına sahip bir akışa geçer. Ve elbette, yeterince hızlı yüklenirse, daha kaliteli bir varyanta geçebileceği anlamına gelir, ancak yalnızca ekranın çözünürlüğü açısından anlamlıysa.
M3U8 dizini listesindeki ilk akış en iyisi değilse, istemcinin doğru değişkenle yerleşene kadar bir veya iki döngüye ihtiyacı olacaktır.
Şimdi üç katman HLS'ye sahibiz:
- Varyantlara yönelik işaretçiler (URL'ler) içeren M3U8 dosyasını (ana çalma listesi) dizinleyin.
- Farklı ekran boyutları ve ağ hızları için farklı akışlar için Varyant M3U8 dosyaları (medya oynatma listesi) . .ts dosyalarına işaretçiler (URL'ler) içerirler.
- Videonun bölümleriyle ikili dosyalar olan
.ts
dosyaları (parçalar) .
Örnek bir indeks M3U8 dosyasını buradan izleyebilirsiniz (yine tarayıcınıza/OS'nize bağlıdır).
Bazen, istemcinin yavaş veya hızlı bir ağda olduğunu önceden bilirsiniz. Bu durumda, farklı bir ilk değişkene sahip bir dizin M3U8 dosyası sağlayarak istemcinin doğru değişkeni seçmesine yardımcı olabilirsiniz. Bunu yapmanın iki yolu vardır.
- Birincisi, farklı ağ türleri için hazırlanmış birden fazla dizin dosyasına sahip olmak ve istemciyi doğru olanı talep etmeye önceden hazırlamaktır. İstemcinin ağ türünü kontrol etmesi ve ardından örneğin
http://.../index_wifi.m3u8
veyahttp://.../index_mobile.m3u8
. - Ayrıca, istemcinin ağ türünü http isteğinin bir parçası olarak gönderdiğinden emin olabilir (örneğin, bir wifi'ye veya mobil 2G/3G/…'ye bağlıysa) ve ardından her istek için dizin M3U8 dosyasının dinamik olarak hazırlanmasını sağlayabilirsiniz. Yalnızca dizin M3U8 dosyasının dinamik bir sürüme ihtiyacı vardır, tek akışlar (varyant M3U8 dosyaları) yine de statik dosyalar olarak saklanabilir.
HLS için Video Dosyalarının Hazırlanması
Apple'ın HTTP Canlı Akışının iki önemli yapı taşı vardır. Biri video dosyalarının nasıl saklandığı (daha sonra HTTP aracılığıyla sunulacak) ve diğeri oynatıcıya (akış istemci uygulaması) hangi video dosyasını nereden alacağını söyleyen M3U8 dizin dosyalarıdır.
Video dosyalarıyla başlayalım. HLS protokolü, video dosyalarının genellikle her biri 10 saniye olmak üzere eşit uzunlukta daha küçük parçalar halinde saklanmasını bekler. Başlangıçta, bu dosyaların MPEG-2 TS dosyalarında ( .ts
) saklanması ve MP3, HE-AAC veya AC-3'te sesli H.264 formatı ile kodlanması gerekiyordu.
Bu, 30 saniyelik bir videonun her biri yaklaşık 10 saniye uzunluğunda 3 küçük .ts
dosyasına bölüneceği anlamına gelir.
HLS'nin en son sürümünün parçalanmış .mp4 dosyalarına da izin verdiğini unutmayın. Bu henüz yeni bir şey olduğundan ve bazı video oynatıcıların hala uygulaması gerektiğinden, bu makaledeki örnekler .ts
dosyalarını kullanacaktır.

ana kareler
Parçalar, her dosyanın başında bir ana kare ile kodlanmalıdır. Her video çerçeveler içerir. Çerçeveler görüntülerdir, ancak video biçimleri tam görüntüleri saklamaz, bu çok fazla disk alanı kaplar. Sadece önceki çerçeveden farkı kodlarlar. Videoda bir orta noktaya atladığınızda, oynatıcının, ilk görüntüyü göstermek ve ardından videoyu oynatmaya başlamak için tüm bu farkları uygulayacağı bir "başlangıç noktası"na ihtiyacı vardır.
Bu nedenle .ts
parçalarının başında bir ana kare olmalıdır. Bazen oyuncuların yığının ortasından başlaması gerekir. Oyuncu her zaman ilk ana karedeki tüm "farkları" ekleyerek mevcut görüntüyü hesaplayabilir. Ancak, başlangıçtan 9 saniye sonra başlıyorsa, 9 saniyelik “fark” hesaplaması gerekir. Bu hesaplamayı daha hızlı yapmak için, birkaç saniyede bir ana kareler oluşturmak en iyisidir (en iyi cca 3s).
HLS Kırılma Noktaları
Arka arkaya birden fazla video klibin oynatılmasını istediğiniz durumlar vardır. Bunu yapmanın bir yolu, orijinal video dosyalarını birleştirmek ve ardından bu dosyayla HLS akışlarını oluşturmaktır, ancak bu birçok nedenden dolayı sorunludur. Videonuzdan önce veya sonra bir reklam göstermek isterseniz ne olur? Belki bunu tüm kullanıcılar için yapmak istemiyorsunuz ve muhtemelen farklı kullanıcılar için farklı reklamlar istiyorsunuz. Ve elbette önceden farklı reklamlarla HLS dosyaları hazırlamak istemezsiniz.
Bu sorunu çözmek için m3u8 çalma listesinde kullanılabilecek bir #EXT-X-DISCONTINUITY
DISCONTINUITY etiketi vardır. Bu satır temel olarak video oynatıcıya, bu noktadan itibaren .ts
dosyalarının farklı bir konfigürasyonla oluşturulabileceği (örneğin, çözünürlük değişebilir) gerçeğine önceden hazırlanmasını söyler. Oyuncunun her şeyi yeniden hesaplaması ve muhtemelen başka bir varyanta geçmesi gerekecek ve bu tür “süreksizlik” noktalarına hazırlıklı olması gerekiyor.
HLS ile Canlı Yayın
Temel olarak iki tür "video akışı" vardır. Bunlardan biri, önceden kaydedilen ve kullanıcıya karar verdiğinde akışı yapılan videolar için Talep Üzerine Video ( VOD ). Ve Canlı Yayın var. HLS, HTTP Canlı Akışın kısaltması olsa da, şimdiye kadar açıklanan her şey VOD etrafında toplanmıştır, ancak HLS ile canlı akış yapmanın da bir yolu vardır.
M3U8 dosyalarınızda birkaç değişiklik var. İlk olarak, varyant M3U8 dosyasında bir #EXT-X-MEDIA-SEQUENCE:1
etiketi olmalıdır. Ardından, M3U8 dosyası #EXT-X-ENDLIST
(aksi takdirde her zaman sona yerleştirilmelidir).
Akışınızı kaydederken sürekli olarak yeni .ts
dosyalarınız olacaktır. Bunları M3U8 çalma listesine eklemeniz gerekir ve her yenisini eklediğinizde #EXT-X-MEDIA-SEQUENCE:<counter>
içindeki sayaç 1 artırılmalıdır.
Video oynatıcı sayacı kontrol edecektir. Son seferden itibaren değiştirilirse, indirilecek ve oynatılacak yeni parçalar olup olmadığını bilir. İstemciler yeni parçaların oynatılmasını bekleyen M3U8 dosyalarını yeniden yüklemeye devam edeceğinden, M3U8 dosyasının önbelleksiz başlıklarla sunulduğundan emin olun.
VTT
HLS akışları için bir başka ilginç özellik de Web Video Metin Parçası (VTT) dosyalarını bunlara gömebilmenizdir. VTT dosyaları çeşitli kullanımlar için kullanılabilir. Örneğin, bir web HLS oynatıcısı için videonun çeşitli bölümleri için anlık görüntü görüntüleri belirleyebilirsiniz. Kullanıcı, fareyi video zamanlayıcı alanı (video oynatıcının altında) üzerine getirdiğinde, oynatıcı videoda o konumdan anlık görüntüleri gösterebilir.
VTT dosyalarının bir başka bariz kullanımı da altyazılardır. HLS akışı, birden çok dil için birden çok altyazı belirtebilir:
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-,NAME="English",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO,LANGUAGE="en",CHARACTERISTICS="public.accessibility.transcribes-spoken-dialog, public.accessibility.describes-music-and-sound",URI="subtitles/eng/prog_index.m3u8"
Ardından, theprog_index.m3u8
şöyle görünür:
#EXTM3U #EXT-X-TARGETDURATION:30 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:30, 0000.webvtt #EXTINF:30, 0001.webvtt ...
Gerçek VTT (örneğin 0000.webvtt
):
WEBVTT X-TIMESTAMP-MAP=MPEGTS:900000,LOCAL:00:00:00.000 00:00:01.000 --> 00:00:03.000 Subtitle -Unforced- (00:00:01.000) 00:00:03.000 --> 00:00:05.000 <i>...text here... -Unforced- (00:00:03.000)</i> <i>...text here...</i>
VTT dosyalarına ek olarak, Apple kısa süre önce duyurduğu HLS, akış dağıtımı için optimize edilmiş yeni bir altyazı formatı olan IMSC1 için destek sunacak. En önemli avantajı, CSS kullanılarak şekillendirilebilmesidir.
HTTP Canlı Akış Araçları ve Olası Sorunlar
Apple, resmi HLS kılavuzunda daha ayrıntılı olarak açıklanan bir dizi kullanışlı HSL aracını tanıttı.
- Canlı akışlar için Apple, devam eden bir video akışından anında segment dosyaları oluşturmak için
mediastreamsegmenter
adlı bir araç hazırladı. - Bir diğer önemli araç ise
mediastreamvalidator
. M3U8 çalma listelerinizi kontrol edecek, video dosyalarını indirecek ve çeşitli sorunları bildirecektir. Örneğin, bildirilen bit hızı .ts dosyalarından hesaplananla aynı olmadığında. - Tabii ki, video/ses dosyalarını kodlamanız/kod çözmeniz/mux/demux/chunk/strip/merge/join/… yapmanız gerektiğinde, ffmpeg vardır. Belirli kullanım durumları için kendi özel ffmpeg sürümlerinizi derlemeye hazır olun.
Videoda en sık karşılaşılan sorunlardan biri ses senkronizasyonudur. Bazı HLS akışlarınızdaki sesin videoyla senkronize olmadığını fark ederseniz (yani bir aktör ağzını açar, ancak sesin birkaç milisaniye erken veya geç olduğunu fark ederseniz), orijinal video dosyasının filme alınmış olması olasıdır. değişken bir kare hızı kullanarak. Sabit bit hızına dönüştürdüğünüzden emin olun.
Mümkünse, yazılımınızın sabit bir kare hızında video kaydetmeye ayarlandığından emin olmak daha da iyidir.
HTTP Canlı Akış Örneği
Google'ın ExoPlayer oynatıcısını kullanarak önceden tanımlanmış bir HLS yayınlayan bir HLS Android uygulaması hazırladım. Altında bir video ve HLS "olaylarının" bir listesini gösterecektir. Bu olaylar şunları içerir: indirilen her .ts
dosyası veya oynatıcı daha yüksek veya daha düşük bir bit hızı akışına geçmeye her karar verdiğinde.
İzleyici başlatmanın ana bölümlerinden geçelim. İlk adımda, cihazın mevcut bağlantı türünü alacağız ve bu bilgiyi hangi m3u8
dosyasının alınacağına karar vermek için kullanacağız.
String m3u8File = "hls.m3u8"; ConnectivityManager connectivity = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = connectivity.getActiveNetworkInfo(); if (activeNetwork != null && activeNetwork.isConnectedOrConnecting()) { int type = activeNetwork.getType(); int subType = activeNetwork.getSubtype(); if (type == ConnectivityManager.TYPE_MOBILE && subType == TelephonyManager.NETWORK_TYPE_GPRS) { m3u8File = "hls_gprs.m3u8"; } } String m3u8URL = "https://s3-us-west-2.amazonaws.com/hls-playground/" + m3u8File;
Bunun kesinlikle gerekli olmadığını unutmayın. HLS oynatıcı, birkaç parçadan sonra her zaman doğru HLS varyantına uyum sağlar, ancak bu, ilk 5-20 saniyede kullanıcının akışın ideal varyantını izleyemeyebileceği anlamına gelir.
Unutmayın, m3u8
dosyasındaki ilk varyant, izleyicinin başlayacağı varyanttır. İstemci tarafında olduğumuz ve bağlantı türünü algılayabildiğimiz için en azından bu bağlantı türü için önceden hazırlanmış m3u8
dosyasını talep ederek ilk oyuncunun varyantlar arasında geçiş yapmasını engellemeye çalışabiliriz.
Bir sonraki adımda, HLS oynatıcımızı başlatıyoruz ve başlatıyoruz:
Handler mainHandler = new Handler(); DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter.Builder() .setEventListener(mainHandler, bandwidthMeterEventListener) .build(); TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter); TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); LoadControl loadControl = new DefaultLoadControl(); SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
Ardından oynatıcıyı hazırlıyoruz ve bu ağ bağlantı türü için doğru m3u8 ile besliyoruz:
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "example-hls-app"), bandwidthMeter); HlsMediaSource videoSource = new HlsMediaSource(Uri.parse(m3u8URL), dataSourceFactory, 5, mainHandler, eventListener); player.prepare(videoSource);
Ve işte sonuç:
HLS Tarayıcı Uyumluluğu, Gelecekteki Gelişmeler
Apple'dan, iOS'ta video akışı uygulamaları için, videolar 10 dakikadan uzun veya 5mb'den büyükse HLS kullanmaları gerekir . Bu, başlı başına HLS'nin kalıcı olduğunun garantisidir. HLS ve MPEG-DASH ve web tarayıcıları arenasında hangisinin galip geleceği konusunda bazı endişeler vardı. HLS tüm modern tarayıcılarda uygulanmaz (önceki m3u8 url örneklerine tıkladıysanız muhtemelen fark etmişsinizdir). Örneğin Android'de 4.0'dan daha düşük sürümlerde hiç çalışmayacaktır. 4.1'den 4.4'e kadar yalnızca kısmen çalışır (örneğin, ses eksik veya video eksik ancak ses çalışıyor).
Ancak bu “savaş” son zamanlarda biraz daha basitleşti. Apple, yeni HLS protokolünün parçalanmış mp4 dosyalarına ( fMP4
) izin vereceğini duyurdu. Daha önce hem HLS hem de MPEG-DASH desteğine sahip olmak istiyorsanız videolarınızı iki kez kodlamanız gerekiyordu. Artık aynı video dosyalarını yeniden kullanabilecek ve yalnızca meta veri dosyalarını yeniden paketleyebileceksiniz (HLS için .m3u8
ve MPEG-DASH için .mpd
).
Yakın zamanda yapılan bir diğer duyuru, Yüksek Verimli Video Codec'i (HEVC) desteğidir. Kullanılırsa, parçalanmış mp4 dosyalarında paketlenmelidir. Ve bu muhtemelen HLS'nin geleceğinin fMP4
olduğu anlamına gelir.
Tarayıcılar dünyasındaki mevcut durum, <video>
etiketinin yalnızca bazı tarayıcı uygulamalarının kutudan çıktığı haliyle HLS'yi oynatmasıdır. Ancak HLS uyumluluğu sunan açık kaynaklı ve ticari çözümler var. Çoğu, Flash yedeğine sahip olarak HLS sunar, ancak tamamen JavaScript ile yazılmış birkaç uygulama vardır.
Toplama
Bu makale özellikle HTTP Canlı Akışına odaklanır, ancak kavramsal olarak Uyarlamalı Bit Hızı Akışının (ABS) nasıl çalıştığının bir açıklaması olarak da okunabilir. Sonuç olarak HLS'nin video akışında sayısız önemli sorunu çözen bir teknoloji olduğunu söyleyebiliriz:
- Video dosyalarının depolanmasını kolaylaştırır
- CDN
- Farklı istemci bant genişliklerini yöneten ve akışlar arasında geçiş yapan istemci oynatıcılar
- Altyazılar, şifreleme, senkronize oynatmalar ve bu makalede ele alınmayan diğer özellikler
Sonunda HLS veya MPEG-DASH kullanıp kullanmadığınıza bakılmaksızın, her iki protokol de benzer işlevler sunmalıdır ve HLS'de parçalı mp4'ün (fMP4) tanıtılmasıyla aynı video dosyalarını kullanabilirsiniz. Bu, çoğu durumda her iki protokolün de temellerini anlamanız gerekeceği anlamına gelir. Neyse ki, aynı yönde hareket ediyor gibi görünüyorlar, bu da ustalaşmayı kolaylaştırıyor.