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