用 HLS m3u8 及FFMPEG搭建視頻點播平臺

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ā)搭建",那里有詳細的實現步驟芯肤。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末巷折,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子崖咨,更是在濱河造成了極大的恐慌锻拘,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件击蹲,死亡現場離奇詭異署拟,居然都是意外死亡,警方通過查閱死者的電腦和手機歌豺,發(fā)現死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門推穷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人类咧,你說我怎么就攤上這事馒铃⌒诽冢” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵区宇,是天一觀的道長娃殖。 經常有香客問我,道長议谷,這世上最難降的妖魔是什么炉爆? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮卧晓,結果婚禮上芬首,老公的妹妹穿的比我還像新娘。我一直安慰自己禀崖,他們只是感情好衩辟,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著波附,像睡著了一般艺晴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掸屡,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天封寞,我揣著相機與錄音,去河邊找鬼仅财。 笑死狈究,一個胖子當著我的面吹牛,可吹牛的內容都是我干的盏求。 我是一名探鬼主播抖锥,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碎罚!你這毒婦竟也來了磅废?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤荆烈,失蹤者是張志新(化名)和其女友劉穎拯勉,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體憔购,經...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡宫峦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了玫鸟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片导绷。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖屎飘,靈堂內的尸體忽然破棺而出诵次,到底是詐尸還是另有隱情账蓉,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布逾一,位于F島的核電站,受9級特大地震影響肮雨,放射性物質發(fā)生泄漏遵堵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一怨规、第九天 我趴在偏房一處隱蔽的房頂上張望陌宿。 院中可真熱鬧,春花似錦波丰、人聲如沸壳坪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爽蝴。三九已至,卻和暖如春纫骑,著一層夾襖步出監(jiān)牢的瞬間蝎亚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工先馆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留发框,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓煤墙,卻偏偏與公主長得像梅惯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仿野,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內容