nginx上搭建HLS流媒體伺服器

來源:互聯網
上載者:User

標籤:

http://blog.csdn.net/cjsafty/article/details/7922849

簡介:HTTP Live Streaming(縮寫是 HLS)是一個由蘋果公司提出的基於HTTP的流媒體 網路傳輸協議。

是蘋果公司QuickTime X和iPhone軟體系統的一部分。它的工作原理是把整個流分成一個個小的基於HTTP

的檔案來下載,每次只下載一些。當媒體流現正播放時,用戶端可以選擇從許多不同的備用源中以不同的速

率下載同樣的資源,允許流媒體會話適應不同的資料速率。在開始一個流媒體會話時,用戶端會下載一個包

含中繼資料的extended M3U (m3u8) playlist檔案,用於尋找可用的媒體流。


HLS只請求基本的HTTP報文,與即時傳輸協議(RTP)不同,HLS可以穿過任何允許HTTP資料通過的防

火牆或者Proxy 伺服器。它也很容易使用內容分髮網絡來傳輸媒體流。

此協議詳細內容請參考apple官方網站:https://developer.apple.com/resources/http-streaming/

有兩種方式搭建HLSserver,

一種是利用apple SDK,

一種是利用adobe 的fms,4.5版本支援hls,參考,

http://www.adobe.com/products/flash-media-streaming/features._sl_id-contentfilter_sl_featuredisplaytypes_sl_new.html

adobe的fms現在很強大,但是商用需要licence。有興趣的可以研究下。

一種是利用opensouce.我比較喜歡這一種。

 

方法:

opensource的方法主要是使用m3u8-segmenter+ffmpeg對ts檔案進行分區。

因此思路就是:

1,用編譯好的ffmpeg製作所需要的ts檔案,

2,安裝libavformat-dev版本,

3,編譯m3u8-segmenter,

4,部署到nginx

5,進階功能,流切換

6,頁面

過程

1,本來想下載ffmpeg源碼編譯,但是因為要涉及到faac,x264,lame庫。有時候ffmpeg版本對這些庫的版本又有最低版本要求,在編譯

faac時候遇到以下問題

[plain] view plain copy  
  1. 安裝支援庫  
  2. apt-get install automake autoconf m4 libtool  
  3.   
  4. -bash: ./bootstrap: /bin/sh^M: bad interpreter: No such file or directory  
  5.   
  6. 轉換字元:  
  7. dos2unix bootstrap  
  8. make  
  9.   
  10. 錯誤:mpeg4ip.h:126:58: error: new declaration ‘char* strcasestr(const char*, const char*)’  
  11.   
  12. 解決方案:Remove line 126 containing strcasecmp from mpeg4ip.h as a temporary workaround  
  13.   
  14. make install時遇到  
  15. usr/local/share/man/man1檔案夾無法建立問題。  


最後一個問題無法解決,好像是linux(ubuntu)下同一個目錄下,如果已經有一個檔案了,則不能建立同名檔案夾,遂放棄編譯,

直接從ffmpeg網站:http://ffmpeg.org/download.html ,的linux下載頁面下載編譯好ffmpeg靜態檔案。這個靜態檔案的主要目的是

為了把各種檔案轉換成apple所規定的檔案。所以需要AAC,mp3,x264庫支援。

 

或者乾脆按照2的方法。apt-get install ffmpeg.這樣會得到ffmpeg可行性檔案。

 

2,安裝ffmpeg支援庫,主要用於編譯m3u8-segmenter,這裡的ffmpeg支援庫,其目的是給segmenter提供libavformat支援。不涉及編解碼。

apt-get install libavformat-dev.

 

[plain] view plain copy  
  1. Reading package lists... Done  
  2. Building dependency tree         
  3. Reading state information... Done  
  4. The following extra packages will be installed:  
  5.   libavcodec-dev libavcodec53 libavformat53 libavutil-dev libavutil51 libgsm1 libogg0 liborc-0.4-0  
  6.   libschroedinger-1.0-0 libspeex1 libtheora0 libva1 libvorbis0a libvorbisenc2 libvpx1  
  7. Suggested packages:  
  8.   libfaad-dev libgsm1-dev libogg-dev libschroedinger-dev libspeex-dev libtheora-dev libvorbis-dev libx11-dev  
  9.   libxext-dev libraw1394-dev libdc1394-22-dev speex  
  10. The following NEW packages will be installed:  
  11.   libavcodec-dev libavcodec53 libavformat-dev libavformat53 libavutil-dev libavutil51 libgsm1 libogg0 liborc-0.4-0  
  12.   libschroedinger-1.0-0 libspeex1 libtheora0 libva1 libvorbis0a libvorbisenc2 libvpx1  


這樣會自動安裝ffmepg幾個相關庫。

 

 

3,從https://github.com/johnf/m3u8-segmenter 下載m3u8-segmenter

下載後不要用它的反覆編譯,直接取m3u8-segmenter.c檔案,

 

[plain] view plain copy  
  1. gcc -Wall -g segmenter.c -o segmenter -lavformat  

 

從源碼來看,因為只用到了avformat庫,所以只連結這一個即可。產生segmenter檔案,用help命令,可以看到已經成功。

 

[plain] view plain copy  
  1. HTTP Live Streaming - Segments TS file and creates M3U8 index.  
  2.         -i, --input FILE             TS file to segment (Use - for stdin)  
  3.         -d, --duration SECONDS       Duration of each segment (default: 10 seconds)  
  4.         -p, --output-prefix PREFIX   Prefix for the TS segments, will be appended  
  5.                                      with -1.ts, -2.ts etc  
  6.         -m, --m3u8-file FILE         M3U8 output filename  
  7.         -u, --url-prefix PREFIX      Prefix for web address of segments, e.g. http://example.org/video/  
  8.         -n, --num-segment NUMBER     Number of segments to keep on disk  
  9.         -h, --help                   This help  


從來看,文法很簡單,這裡貼一個我用的。

 

 

[plain] view plain copy  
  1. ./segmenter -i test.ts -n 30 -p sample_test -m stream-test.m3u8 -u http://192.168.1.10:8080/hls/  


i表示輸入檔案,n表示切割30個,p表示切割檔案的首碼。m表示產生的m3u8檔案名稱,u表示這些切割後的檔案處於web server的哪個目錄下,這個一定要和web目錄匹配

 

 

4,部署到nginx。

nginx的相關部署我在前兩個部落格中已經詳細說明,這裡在jwplayer部落格的基礎上部署hls。

1)目錄問題:

在html/jwplayer目錄下,建立hls檔案夾,將m3u8檔案和切割後的全部ts檔案拷貝到此目錄下,

在VLC PLAYER或者ipad safie瀏覽器或者在ffplayer(我用的是0.11版本的windows編譯版本)

上的訪問路徑應該是http://192.168.1.10:8080/hls/stream-test.m3u8

2)檔案類型問題:編輯 /usr/local/nginx/conf/mime.types 檔案,添加如下類型

 

[plain] view plain copy  
  1. application/x-mpegURL                 m3u8;  
  2. video/MP2T                             ts;   

 

 

3)重啟nginx 

輸入上述路徑,你應該就看到視頻了。

 

5,進階功能,流切換

上述m3u8檔案,只有一個流,不具備流切換功能。在優酷上,如果是ipad用戶端,可以看到有標清,高清,超清的按鈕,其實那個是對應著不同標準

的(單個)m3u8檔案,來實現流切換的,不知道apple是不是這樣做的,apple好像是要求“智能”流切換。即不要求使用者去選擇,而是根據網路狀況自適應的。

apple給的sample的流切換是把各個流的m3u8寫在一個m3u8檔案裡實現的。

類似於這樣,其實原理是一樣的。

 

[plain] view plain copy  
  1. #EXTM3U  
  2. #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=100000  
  3. video1/index1.m3u8  
  4. #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000  
  5. video2/index2.m3u8  

 

 


6,頁面,

如果再繼續搭建一個頁面,把上述地址嵌在頁面裡面,這樣配合CSS就比較美觀了。頁面可以在這個基礎上,用webpy去做。



頁面參考:

蘋果開發網:https://developer.apple.com/resources/http-streaming/

部落格:http://www.nginxs.com/linux/459.html

ffmpeg開發網:http://ffmpeg.org/download.html

segmenter源碼:https://github.com/johnf/m3u8-segmenter

adboe fms介紹:http://www.adobe.com/products/flash-media-streaming/features._sl_id-contentfilter_sl_featuredisplaytypes_sl_new.html


 

 

2014.02備忘:

文中所描述的切片軟體可能有問題,可選擇這個

https://code.google.com/p/httpsegmenter/downloads/list

 

//--------------------------------------------------------------------------------

目的:使Nginx支援Rtmp協議推流,並支援HLS分發功能及FFmpeg轉碼多碼率功能。

一、準備工作
模組:nginx-rtmp-module-master(支援rtmp協議)
:
http://nginx.org
https://github.com/arut/nginx-rtmp-module

1、安裝依賴包:
#yum -y install gcc glibc glibc-devel make nasm pkgconfig lib-devel openssl-devel expat-devel gettext-devel libtool mhash.x86_64 perl-Digest-SHA1.x86_64 gcc-c++

2、安裝git工具:
#mkdir soft-source
#cd soft-source
#wget http://www.codemonkey.org.uk/projects/git-snapshots/git/git-latest.tar.gz
#tar xzvf git-latest.tar.gz 
#cd git-2013-02-04
#autoconf
#./configure
#make && make install
# git --version
git version 1.8.1.GIT
#cd ..

【錯誤處理】

如果 git-latest.tar.gz大小為0,請下載git-latest-tar.xz

然後xz -d git-latest.tar.xz解壓為.tar

再tar xvf git-latest.tar

3、安裝ffmpeg及其依賴包:
++++++++Yasm+++++++++++
#wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
#tar xzvf yasm-1.2.0.tar.gz
#cd yasm-1.2.0
#./configure
#make
#make install
#cd ..
++++++++x264+++++++++++
#git clone git://git.videolan.org/x264
#cd x264
#./configure --enable-shared 
#make
#make install
#cd ..

++++++++LAME+++++++++++
#wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
#tar xzvf lame-3.99.5.tar.gz
#cd lame-3.99.5
#./configure --enable-nasm
#make
#make install
#cd ..
++++++++libogg+++++++++++
#wget http://downloads.xiph.org/releases/ogg/libogg-1.3.0.tar.gz
#tar xzvf libogg-1.3.0.tar.gz
#cd libogg-1.3.0
#./configure
#make
#make install
#cd ..
++++++++libvorbis+++++++++++
#wget http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz
#tar xzvf libvorbis-1.3.3.tar.gz
#cd libvorbis-1.3.3
#./configure
#make
#make install
#cd ..
++++++++libvpx+++++++++++
#git clone http://git.chromium.org/webm/libvpx.git
#cd libvpx
#./configure  --enable-shared
#make
#make install
#cd ..
++++++++FAAD2+++++++++++
#wget http://downloads.sourceforge.net/project/faac/faad2-src/faad2-2.7/faad2-2.7.tar.gz
#tar zxvf faad2-2.7.tar.gz
#cd faad2-2.7
#./configure
#make
#make install
#cd ..
++++++++FAAC+++++++++++
#wget http://downloads.sourceforge.net/project/faac/faac-src/faac-1.28/faac-1.28.tar.gz
#tar zxvf faac-1.28.tar.gz
#cd faac-1.28
#./configure
#make
#make install
#cd ..

【錯誤處理】

編譯FAAC-1.28時遇到錯誤:

mpeg4ip.h:126: error: new declaration ‘char* strcasestr(const char*, const char*)’

解決方案:

從123行開始修改此檔案mpeg4ip.h,到129行結束。
修改前:
#ifdef __cplusplus
extern "C" {
#endif
char *strcasestr(const char *haystack, const char *needle);
#ifdef __cplusplus
}
#endif

修改後:
#ifdef __cplusplus
extern "C++" {
#endif
const char *strcasestr(const char *haystack, const char *needle);
#ifdef __cplusplus
}
#endif


++++++++Xvid+++++++++++
#wget http://downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz
#tar zxvf xvidcore-1.3.2.tar.gz
#cd xvidcore/build/generic
#./configure
#make
#make install
cd ../../../


++++++++ffmpeg+++++++++++
#git clone git://source.ffmpeg.org/ffmpeg
#cd ffmpeg
#./configure  --prefix=/opt/ffmpeg/ --enable-version3  --enable-libvpx --enable-libfaac --enable-libmp3lame  --enable-libvorbis --enable-libx264 --enable-libxvid --enable-shared --enable-gpl --enable-postproc --enable-nonfree  --enable-avfilter --enable-pthreads
#make && make install
#cd ..
【錯誤處理】

如果提示libvpx decoder version must be >=0.91,請從Baidu搜尋一下libvpx-v1.1.0.tar.bz下載。

bzip2 -d  libvpx-v1.1.0.tar.bz2

tar xvf  libvpx-v1.1.0.tar.bz2

cd libvpx-v1.1.0

./configure --enable-shared --enable-vp8

make

make install


修改/etc/ld.so.conf如下:
include ld.so.conf.d/*.conf
/lib
/lib64
/usr/lib
/usr/lib64
/usr/local/lib
/usr/local/lib64
/opt/ffmpeg/lib
#ldconfig

【說明】

動態裝入器找到共用庫要依靠兩個檔案 — /etc/ld.so.conf 和 /etc/ld.so.cache。

安裝完成後,ffmpeg位於/opt/ffmpeg/bin目錄下。

Linux下編譯FFmpeg之下載源檔案並編譯 http://www.linuxidc.com/Linux/2012-02/54565.htm

Linux 編譯升級 FFmpeg 步驟 http://www.linuxidc.com/Linux/2013-08/88190.htm

CentOS 5.6 上安裝 FFMPEG http://www.linuxidc.com/Linux/2011-09/42793.htm

在Ubuntu下安裝FFmpeg http://www.linuxidc.com/Linux/2012-12/75408.htm

Ubuntu 12.04下編譯ffmpeg  http://www.linuxidc.com/Linux/2013-02/78857.htm

Ubuntu 14.04下PPA安裝FFmpeg 2.2.2  http://www.linuxidc.com/Linux/2014-05/101322.htm

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-01/111182p2.htm

nginx上搭建HLS流媒體伺服器

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.