標(biāo)簽:流媒體?HLS?播放
原創(chuàng)作品,允許轉(zhuǎn)載,轉(zhuǎn)載時請務(wù)必以超鏈接形式標(biāo)明文章?原始出處?、作者信息和本聲明。否則將追究法律責(zé)任。http://yaocoder.blog.51cto.com/2668309/1435771
背景:前一段時間幫助一個朋友研究了下流媒體播放方面的知識,感覺挺好玩的。現(xiàn)在把淺薄的嘗試和總結(jié)分享給大家。
一 . HLS 流媒體點(diǎn)播系統(tǒng)概述
HTTP?Live? Streaming 最初是蘋果公司針對其iPhone、iPod、iTouch和iPad等移動設(shè)備而開發(fā)的流媒體協(xié)議,后來在桌面QuickTime播放器中也得到了應(yīng)用。HTTP? Live? Streaming允許內(nèi)容提供者通過普通Web服務(wù)器向上述客戶端提供接近實(shí)時的音視頻流媒體服務(wù),包括直播和點(diǎn)播。HTTP? Live?Streaming支持將同一節(jié)目編碼為不同碼率的多個替換流,客戶端軟件可以根據(jù)網(wǎng)絡(luò)帶寬的變化在這些不同碼率的替換流之間進(jìn)行智能切換。此外,HTTP? Live? Streaming還支持通過媒體加密和用戶認(rèn)證等方式來達(dá)到媒體版權(quán)保護(hù)。目前HTTP? Live? Streaming已被提交成為IETF的Internet-Draft。
?
一個典型的HTTP?Live? Streaming流媒體系統(tǒng)由內(nèi)容準(zhǔn)備(流媒體服務(wù))、內(nèi)容分發(fā)(分發(fā)服務(wù)器)和客戶端軟件三部分組成,如圖所示
?
1.1? 內(nèi)容準(zhǔn)備服務(wù)
?
內(nèi)容準(zhǔn)備服務(wù)(流媒體服務(wù)器)負(fù)責(zé)將輸入的音視頻媒體內(nèi)容轉(zhuǎn)換成為適合于內(nèi)容分發(fā)服務(wù)進(jìn)行傳輸?shù)母袷健τ谝曨l源獲取的或者上傳的視利用視頻編碼器轉(zhuǎn)化為MPEG-2系統(tǒng)層標(biāo)準(zhǔn)的傳輸流(TS)格式進(jìn)行輸出。流分割器負(fù)責(zé)將編碼器輸出的MPEG-2 TS流分割為一系列連續(xù)的、長度均等的小TS文件(后綴名為.ts),并依次發(fā)送至內(nèi)容分發(fā)組件中的Web服務(wù)器進(jìn)行存儲。與此同時,流分割器還需創(chuàng)建一個含有指向這些小TS文件指針的索引文件(后綴為m3u8),同樣放置于Web服務(wù)器之中進(jìn)行存儲。流分割器還可以對其生成的每個小TS文件進(jìn)行加密,并生成相應(yīng)的密鑰文件。
?
之所以采用MPEG-2?TS格式來對編碼后的媒體流進(jìn)行統(tǒng)一封裝,是因?yàn)樗軌驅(qū)⒁粢曨l媒體流嚴(yán)格按時序進(jìn)行交織復(fù)用,任意截取和分段后,每一個分段都可能不依賴于之前的分段而獨(dú)立進(jìn)行解碼和播放
?
1.2 內(nèi)容分發(fā)服務(wù)
?
內(nèi)容分發(fā)服務(wù)(分發(fā)服務(wù)器)用于通過HTTP協(xié)議將分割后的小媒體文件及其索引文件遞送至客戶端播放器,可以采用一個普通的Web服務(wù)器(nginx,Apache)來實(shí)現(xiàn)。
?
1.3? 客戶端
?
??????? 通常情況下,客戶端軟件通過訪問 Web網(wǎng)頁中的 URL鏈接來獲取和下載一個流媒體會話的索引文件。這個索引文件進(jìn)一步指定了服務(wù)器上當(dāng)前可用的 TS格式媒體文件、解密密鑰和其他替換流的位置。對于選定的媒體流,客戶端依次下載索引文件中列出的每一個可用媒體文件。當(dāng)這些媒體文件緩沖夠一定數(shù)量后,客戶端將它們按順序重新拼裝成一個連貫的 TS流,然后發(fā)送至播放器進(jìn)行解碼和呈現(xiàn)。對于加密的媒體文件,客戶端還負(fù)責(zé)根據(jù)索引文件的指引來獲取解密密鑰,提供用戶認(rèn)證接口,并按需進(jìn)行解密。
?
1.4 HTTP? Live?Streaming協(xié)議介紹
?
索引文件采用擴(kuò)展的 M3U播放列表格式,后綴名為 .m3u8。 M3U播放列表是一個由若干文本行組成的文本文件,其中每一行要么是一個 URI,一個空行,或者是一個以注釋符“ #”起始的行。每個 URI行指向一個分段的媒體文件,或者一個衍生的索引 (播放列表 )文件。除了以“ #EXT”起始的行是標(biāo)簽行外,其他以“ #”起始的行是注釋,應(yīng)予忽略。下面是一個簡單的 .m3u8索引文件例子,其所表示的媒體流由 3個未加密的長度為 10秒的 TS文件組成
1 2 3 4 5 6 7 8 9 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-TARGETDURATION:10 #EXTINF:10, http://media.example.com/segment1.ts #EXTINF:10, http://media.example.com/segment2.ts #EXTINF:10, http://media.example.com/segment3.ts #EXT-X-ENDLIST
對于視頻點(diǎn)播,直到客戶端碰到索引文件中的 #EXT-X-ENDLIST標(biāo)簽便會停止播放。
二. HLS 流媒體系統(tǒng)的優(yōu)勢
?
部署方便,便于分發(fā): 一旦切分完成,之后的分發(fā)過程完全不需要額外使用任何專門軟件,普通的網(wǎng)絡(luò)服務(wù)器即可,大大降低了 ?CDN? 邊緣服務(wù)器的配置要求,可以使用任何現(xiàn)成的 ?CDN 。分發(fā)使用的協(xié)議是最常見 ?HTTP ,代理服務(wù)器對這個協(xié)議的緩存優(yōu)化相當(dāng)成熟。
?
時移特性好 :如果你要在一段長達(dá)一小時的視頻中跳轉(zhuǎn),如果使用單個 ?MP4? 格式的視頻文件,并且也是用 ?HTTP? 協(xié)議,那么需要代理服務(wù)器支持 ?HTTP range request? 以獲取大文件中的一部分。不是所有的代理服務(wù)器都對此有良好的支持。而 ?HTTP Live Streaming? 則只需要根據(jù)列表文件中的時間軸找出對應(yīng)的 ?TS? 片段下載即可,不需要 ?range request ,對代理服務(wù)器的要求小很多。所有代理服務(wù)器都支持小文件的高效緩存。
?
自適應(yīng)碼率流播: 效果就是客戶端會根據(jù)網(wǎng)絡(luò)狀況自動選擇不同碼率的視頻流,條件允許的情況下使用高碼率,網(wǎng)絡(luò)繁忙的時候使用低碼率,并且自動在二者間隨意切換。這對移動設(shè)備網(wǎng)絡(luò)狀況不穩(wěn)定的情況下保障流暢播放非常有幫助。實(shí)現(xiàn)方法是服務(wù)器端提供多碼率視頻流,并且在列表文件中注明,播放器根據(jù)播放進(jìn)度和下載速度自動調(diào)整。
?
對網(wǎng)絡(luò)環(huán)境支持好 : HLS 可以穿過任何允許 HTTP 數(shù)據(jù)通過的 防火墻或者 代理服務(wù)器。
?
二. HLS 流媒體系統(tǒng)的缺點(diǎn)
具有時延性: HTTP? Live? Streaming 并不是一個真正實(shí)時的流媒體系統(tǒng),這是因?yàn)閷?yīng)于媒體分段的大小和持續(xù)時間有一定潛在的時間延遲。在客戶端中,至少在一個分段媒體文件被完全下載之后才能夠開始播放,而通常要求下載完成兩個分段媒體文件之后才開始播放以保證不同分段音視頻之間的無縫連接。
?
媒體數(shù)據(jù)碼率相對較大: MPEG-TS 流有比通常文件更多的頭信息,會導(dǎo)致文件整體碼率明顯上升。
?
三.技術(shù)選型
??????? 內(nèi)容準(zhǔn)備服務(wù)中的編碼器采用 ffmpeg ,流切片采用 Segmenter , web服務(wù)器采用 Nginx , 客戶端:對 flash支持客戶端的選用 StrobeMedia Playback , ios 利用 Safari 瀏覽即可, Android 正在研究中,對于支持 html5 的瀏覽器可采用 html5 技術(shù)進(jìn)行播放。
?
四.流媒體服務(wù)器的安裝配置
系統(tǒng)環(huán)境:
發(fā)行版本:CentOS release 6.3
內(nèi)核版本:2.6.32-279.el6.x86_64
4.1 ffmpeg的安裝
?
Yasm 是一個完全重寫的 NASM 匯編。目前,它支持x86和AMD64指令集,接受NASM和氣體匯編語法,產(chǎn)出二進(jìn)制, ELF32 , ELF64 ,COFF , Mach - O的( 32和64 ) , RDOFF2 ,的Win32和Win64對象的格式,并生成STABS 調(diào)試信息的來源,DWARF 2 ,CodeView 8格式。
1 2 3 4 5 6 7 wget?http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz tar?zxvf?yasm-1.2.0.tar.gz cd?yasm-1.2.0 ./configure?–prefix=/usr/local Make make?install 查看yasm是否可以執(zhí)行,不能執(zhí)行就將/usr/local/bin加入可執(zhí)行路徑
FFmpeg 是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計(jì)算機(jī)程序。它包括了目前領(lǐng)先的音/視頻編碼庫libavcodec。可以輕易地實(shí)現(xiàn)多種視頻格式之間的相互轉(zhuǎn)換,例如在本例中可以把MP4,MOV等文件轉(zhuǎn)成我們用來切片的 MPEG-TS 文件。
1 2 3 4 5 6 wget?http://ffmpeg.org/releases/ffmpeg-2.2.tar.gz tar?zxvf?ffmpeg-2.2.tar.gz cd?ffmpeg-2.2 ./configure?–prefix=/usr/local Make make?install
4.2?切片工具 segmenter 的安裝
我們使用segmenter工具獲得m3u8的索引文件以及視頻流切片文件。
?
從 http://httpsegmenter.googlecode.com/svn/? ? 找到 segmenter.c 文件,采用如下編譯方式
1 gcc?-Wall-g?segmenter.c?-o?segmenter?-lavformat?-lavcodec?-lavutil?-lm?-lz-lpthread??-std=c99
建議之后把生成的二進(jìn)制 segmenter 拷貝入/usr/local/bin方便使用。
?
警告:針對網(wǎng)絡(luò)上很多 https://github.com/johnf/m3u8-segmenter 這個解決方案,在我和王海濤的測試中發(fā)現(xiàn)切片不準(zhǔn)確的情況,需要注意。
4.3 web服務(wù)器 nginx 的安裝
?
4.3.1? 可以直接安裝官網(wǎng)提供的較新的穩(wěn)定版本即可,也可以安裝github上的加入nginx-rtmp-module模塊的版本, https://github.com/arut/nginx-rtmp-module 。
?
4.3.2 由于我們需要播放m3u8,ts類型的文件,所以要在nginx的conf/mime.types文件中加入
1 2 application/x-mpegURL?????????????????m3u8; video/MP2T????????????????????????????ts;
4.3.3 另外對于nginx的http配置塊中server配置塊進(jìn)行下簡要說明
1 2 3 4 5 6 7 8 9 10 http?{ ??????server?{ ???????????????listen?80; ???????????????server_name?localhost; ???????????????location?/?{ ??????????????????????????????root?/usr/local/html; ??????????????????????????????index?index.html?index.htm; ???????????????} ????????} }
listen? 表示 nginx 的監(jiān)聽端口,建議配置為 80 ,因?yàn)椤?/span>允許 HTTP 數(shù)據(jù)通過的 防火墻或者 代理服務(wù)器”這個緣故。
?
對 Location 進(jìn)行講解主要是為了指出今后我們的視頻存儲 URL 對應(yīng)在 web
1 2 3 4 5 6 7 8 9 以root方式設(shè)置資源路徑 語法:rootpath; 默認(rèn):roothtml; 配置塊:http、server、location、if 例如,定義資源文件相對于HTTP請求的根目錄。? location?/download/?{? .?????root?/opt/web/html/;?? }? 在上面的配置中,如果有一個請求的URI是/download/index/test.html,那么Web服務(wù)器將會返回服務(wù)器上/opt/web/html/download/index/test.html文件的內(nèi)容。
以root方式設(shè)置資源路徑
語法:rootpath;
默認(rèn):roothtml;
配置塊:http、server、location、if
例如,定義資源文件相對于HTTP請求的根目錄。?
location?/download/?{?
. ????root?/opt/web/html/; ?
}?
在上面的配置中,如果有一個請求的URI是/download/index/test.html,那么Web服務(wù)器將會返回服務(wù)器上/opt/web/html/download/index/test.html文件的內(nèi)容。
五.如何采用 HLS 協(xié)議播放視頻
?
5.1? 利用ffmpeg對視頻文件進(jìn)行轉(zhuǎn)碼? **文件 -- >ts文件。
1 2 3 4 5 6 7 8 ffmpeg?-y?-i?<infile>?-vcodec?copy?-acodec?copy?-vbsf?h264_mp4toannexb?<output?file> ?-y??覆蓋輸出文件,即如果nba.xxx文件已經(jīng)存在的話,直接覆蓋?? -i???“filename”???指定需要轉(zhuǎn)換的文件 -vcodec的意思是指定一個視頻編碼器,copy的意思就是不編碼,直接復(fù)制到新文件。 -acodec的意思是指定一個音頻編碼器,copy的意思就是不編碼,直接復(fù)制到新文件。 vbsf為過濾方法,即將mp4規(guī)定的H264組織方式轉(zhuǎn)換回H264協(xié)議書規(guī)定的字節(jié)流格式。 h264_mp4toannexb?過濾器,很多解碼器只支持annexb這種模式,因此需要將mp4做轉(zhuǎn)換 其中in?file為待轉(zhuǎn)換的視頻文件,比如input.mov,outputfile為轉(zhuǎn)換后的文件,要命名為output.ts
5.2? 利用segmenter將轉(zhuǎn)換好的ts文件切割成多個ts片,并生成.m3u8的索引文件。
5.3? 分完片后就會生成視頻的m3u8索引文件和視頻分片文件,將這些文件拷貝至相應(yīng)的web目錄即可。
六.測試及結(jié)論
?
6.1? 播放模式
?
對于蘋果的設(shè)備可直接使用safari播放m3u8文件。
對于支持flash的設(shè)備我們采用StrobeMediaPlayback實(shí)現(xiàn)播放音視頻文件。
對于支持hls的平臺,在對html5支持的瀏覽器下,可直接使用瀏覽器進(jìn)行視頻播放。
6.2? 演示資源
略
6.3? 測試結(jié)果
?
?
?
附錄:
?
1.?????? 關(guān)于 StrobeMediaPlayback 的配置方式:
?
說明: StrobeMediaPlayback自身不支持 hls視頻的播放,但是利用第三方插件可以完成對 hls視頻播放的支持。
?
配置方式:
?
第三方插件地址 https://github.com/denivip/osmf-hls-plugin,我們進(jìn)行配置只需要將 ??
StrobeMediaPlayback 文件夾下的文件拷貝至 nginx 的 web 目錄下,然后對 StrobeMediaPlayback/ StrobeMediaPlayback.html 文件內(nèi)容進(jìn)行更改
將 src改為 hls索引文件的 url,接著通過訪問 url就可以完成對 hls視頻的播放。
本文出自 “永遠(yuǎn)的朋友” 博客,請務(wù)必保留此出處http://yaocoder.blog.51cto.com/2668309/1435771
總結(jié)
以上是生活随笔 為你收集整理的小玩流媒体播放——HLS流媒体点播系统 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。