Mp4是目前使用很廣泛的一種視頻格式熊咽。
隨著客戶的增加儒将,mp4文件播放的弊端也日益凸顯卿闹,主要集中在兩個方面當視頻時長比較長的時候粘勒,mp4的關鍵幀元素往往很大竞端,需要加載很長時間才能開始播放,網速不好的情況緩沖加載就要20多秒的時間庙睡,客戶早已急不可耐事富。當用戶打開一個視頻播放的時候,瀏覽器會持續(xù)請求下載mp4文件直到下載完成乘陪,就算是用戶暫停視頻播放瀏覽器也會持續(xù)這種下載狀態(tài)统台,如果這個視頻文件是500M則會請求服務器下載500M文件,是1G則會不停下載1G暂刘,給服務器硬盤和寬帶造成很大浪費和壓力饺谬。而HLS這種方式就可以避免這兩個問題。
HLS(HTTP Live Streaming)是蘋果公司針對iPhone、iPod募寨、iTouch和iPad等移動設備而開發(fā)的基于HTTP協(xié)議的流媒體解決方案族展。在 HLS 技術中 Web 服務器向客戶端提供接近實時的音視頻流。
但在使用的過程中是使用的標準的 HTTP 協(xié)議拔鹰,所以這時仪缸,只要使用 HLS 的技術,就能在普通的 HTTP 的應用上直接提供點播和直播列肢。
該技術基本原理是將視頻文件或視頻流切分成小片(ts)并建立索引文件(m3u8)恰画。支持的視頻流編碼為H.264,音頻流編碼為AAC瓷马。
在App Store中的視頻相關的應用拴还,基本都是應用的此種技術。
HLS優(yōu)點
無需專門軟件欧聘,普通的網絡服務器即可片林,大大降低了 CDN 邊緣服務器的配置要求,可以使用任何現成的 CDN怀骤。分發(fā)使用的協(xié)議是最常見 HTTP费封,代理服務器對這個協(xié)議的緩存優(yōu)化相當成熟,而很少有代理服務器對 RTSP 的進行緩存優(yōu)
對于非實時視頻蒋伦,同樣的好處也是存在的:如果你要在一段長達一小時的視頻中跳轉弓摘,如果使用單個 MP4 格式的視頻文件,并且也是用 HTTP 協(xié)議痕届,那么需要代理服務器支持 HTTP range request 韧献,以獲取大文件中的一部分。不是所有的代理服務器都對此有良好的支持爷抓。而 HTTP Live Streaming 則只需要根據列表文件中的時間軸找出對應的 TS 片段下載即可势决,不需要 range request,對代理服務器的要求小很多蓝撇。所有代理服務器都支持小文件的高效緩存。
此外陈莽,HTTP Live Streaming 還有一個巨大優(yōu)勢:自適應碼率流播(adaptive streaming)渤昌。效果就是客戶端會根據網絡狀況自動選擇不同碼率的視頻流,條件允許的情況下使用高碼率走搁,網絡繁忙的時候使用低碼率独柑,并且自動在二者間隨意切換。這對移動設備網絡狀況不穩(wěn)定的情況下保障流暢播放非常有幫助私植。實現方法是服務器端提供多碼率視頻流忌栅,并且在列表文件中注明,播放器根據播放進度和下載速度自動調整。
根據網絡帶寬索绪,客戶端會選擇一個適合自己碼率的文件進行播放湖员,保證視頻流的流暢。
至于為什么要用 TS 而不是 MP4瑞驱,這是因為兩個 TS 片段可以無縫拼接娘摔,播放器能連續(xù)播放,而 MP4 文件由于編碼方式的原因唤反,兩段 MP4 不能無縫拼接凳寺,播放器連續(xù)播放兩個 MP4 文件會出現破音和畫面間斷,影響用戶體驗彤侍。
肠缨,與實時傳輸協(xié)議(RTP)不同,HLS可以穿過任何允許HTTP數據通過的防火墻或者代理服務器盏阶。?它也很容易使用內容分發(fā)網絡來傳輸媒體流
M3U8文件介紹
我們比較詳細的來介紹m3u8文件
譬如:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:13
#EXT-X-MEDIA-SEQUENCE:430
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:11.800
news-430.ts
#EXTINF:10.120
news-431.ts
#EXT-X-DISCONTINUITY
#EXTINF:11.952
news-430.ts
#EXTINF:12.640
news-431.ts
#EXTINF:11.160
news-432.ts
#EXT-X-DISCONTINUITY
#EXTINF:11.751
news-430.ts
#EXTINF:2.040
news-431.ts
#EXT-X-ENDLIST
EXTM3U
首先要說明的是
?m3u8 文件必須以 utf-8
m3u8 文件的每一行要么是一個 URI晒奕,要么是空行,要么就是以?#?開頭的字符串般哼。不能出現空白字符吴汪,除了顯示聲明的元素。
?m3u8 文件中以?#?開頭的字符串要么是注釋蒸眠,要么就是標簽漾橙。標簽以?#EXT?開頭,大小寫敏感楞卡。
第二行 EXT-X-VERSION:表示?HLS?的協(xié)議版本號霜运,該標簽與流媒體的兼容性相關。該標簽為全局作用域蒋腮,使能整個 m3u8 文件淘捡;每個 m3u8 文件內最多只能出現一個該標簽定義。如果 m3u8 文件不包含該標簽池摧,則默認為協(xié)議的第一個版本焦除。
第三行 #EXT-X-ALLOW-CACHE:YES
忘文生意,表示允許緩存
第四行??
?EXT-X-TARGETDURATION:TARGETDURATION 英文直譯就是目標持續(xù)時間 表示每個視頻分段最大的時長(單位秒)作彤。該標簽為必選標簽膘魄。下面的ts列表中,任何一個 ts播放的時間長度都不能超過這里指定的時間長度
上面我們介紹的是HLS里面竭讳,媒體索引文件--m3u8文件的常用格式创葡,以及標簽。它的詳細的標簽說明绢慢,我們可以去搜索相應的文檔灿渴。
第五行 ?
#EXT-X-PLAYLIST-TYPE:VOD
??EXT-X-PLAYLIST-TYPE:表明流媒體類型。全局生效。該標簽為可選標簽骚露。
其格式為:#EXT-X-PLAYLIST-TYPE:<type-enum>蹬挤,其中,type-enum可選值如下:
??VOD?即 Video on Demand荸百,表示該視屏流為點播源闻伶,因此服務器不能更改該 m3u8 文件;
??EVENT?表示該視頻流為直播源够话,因此服務器不能更改或刪除該文件任意部分內容(但是可以在文件末尾添加新內容)(注:VOD?文件通常帶有 EXT-X-ENDLIST?標簽蓝翰,因為其為點播源,不會改變女嘲;而 EVEVT?文件初始化時一般不會有 EXT-X-ENDLIST?標簽畜份,暗示有新的文件會添加到播放列表末尾,因此也需要客戶端定時獲取該 m3u8 文件欣尼,以獲取新的媒體片段資源爆雹,直到訪問到 EXT-X-ENDLIST?標簽才停止)。
第六行
EXTINF:表示其后 URL 指定的媒體片段時長(單位為秒)愕鼓。每個 URL 媒體片段之前必須指定該標簽钙态。該標簽的使用格式為:#EXTINF:<duration>,[<title>],其中,參數duration可以為十進制的整型或者浮點型菇晃,其值必須小于或等于 EXT-X-
?EXT-X-ENDLIST:表明 m3u8 文件的結束册倒。該標簽可出現在 m3u8 文件任意位置,一般是結尾磺送。
接下來驻子,我們來了解下如何切換同一視頻的不同碼流
我們介紹過,m3u8的一個優(yōu)點就是可以根據網絡狀況估灿,切換不通清晰度的碼流崇呵。那么要實現碼流切換,應該怎么做呢馅袁?
首先域慷,我們要生成同一視頻的不同碼率的ts文件及其索引文件,及m3u8文件汗销。然后芒粹,再生成一個m3u8文件,來包含這幾個不同
碼率的m3u8文件大溜。這個m3u8文件如下
多碼率適配流,
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000
http://example.com/low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000
http://example.com/mid.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000
http://example.com/hi.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS="mp4a.40.5"
http://example.com/audio-only.m3u8
我們看估脆,這個m3u8文件里包括關鍵字BANDWIDTH也就是帶寬钦奋,每一行下面跟著的,就是這個帶寬要讀取的m3u8文件。對應的m3u8文件里付材,才是真正的ts文件朦拖。
服務器搭建
服務器在邏輯上其實是分兩塊,一是http服務器厌衔,這相對比較簡單璧帝,我們在此用apache做例子。另一部分是視頻的切割富寿,就是將一個大的mp4文件切割成多個ts文件睬隶,這個需要安裝安裝FFMPEG,但是先要安裝比較多的第三方庫页徐。苏潜。
搭建好后,使用ffmpege命令变勇,例如ffmpeg -i? ?/root/1.mp4?4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_time 15 -hls_list_size 0 test.m3u8? ?就能將?\root\1.mp4?這個文件切割恤左。并且生成m3u8文件? 名字是? test.m3u8
五、客戶端
我們可以利用第三方一些庫搀绣,支持h5的飞袋,在html文件中指定這個m3u8文件,就可以播放了链患。
總體思路是比較清晰的巧鸭,但是具體實施起來,還是有很多細節(jié)锣险,一篇文章難以寫完蹄皱。具體的可在“CSDN學院”里面搜 "視頻點播平臺的開發(fā)搭建",那里有詳細的實現步驟芯肤。