nginx上搭建HLS流媒體伺服器
簡介:HTTP Live Streaming(縮寫是 HLS)是一個由蘋果公司提出的基於HTTP的流媒體 網路傳輸協議。
是蘋果公司QuickTime X和iPhone軟體系統的一部分。它的工作原理是把整個流分成一個個小的基於HTTP
的檔案來下載,每次只下載一些。當媒體流正在播放時,客戶端可以選擇從許多不同的備用源中以不同的速
率下載同樣的資源,允許流媒體會話適應不同的資料速率。在開始一個流媒體會話時,客戶端會下載一個包
含後設資料的extended M3U (m3u8) playlist檔案,用於尋找可用的媒體流。
HLS只請求基本的HTTP報文,與實時傳輸協議(RTP)不同,HLS可以穿過任何允許HTTP資料通過的防
火牆或者代理伺服器。它也很容易使用內容分發網路來傳輸媒體流。
此協議詳細內容請參考apple官方網站:https://developer.apple.com/resources/http-streaming/
有兩種方式搭建HLSserver,
一種是利用apple SDK,
一種是利用adobe 的fms,4.5版本支援hls,參考,
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時候遇到以下問題
- 安裝支援庫
- apt-get install automake autoconf m4 libtool
- -bash: ./bootstrap: /bin/sh^M: bad interpreter: No such file or directory
- 轉換字元:
- dos2unix bootstrap
- make
- 錯誤:mpeg4ip.h:126:58: error: new declaration ‘char* strcasestr(const char*, const char*)’
- 解決方法:Remove line 126 containing strcasecmp from mpeg4ip.h as a temporary workaround
- make install時遇到
- 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.
- Reading package lists... Done
- Building dependency tree
- Reading state information... Done
- The following extra packages will be installed:
- libavcodec-dev libavcodec53 libavformat53 libavutil-dev libavutil51 libgsm1 libogg0 liborc-0.4-0
- libschroedinger-1.0-0 libspeex1 libtheora0 libva1 libvorbis0a libvorbisenc2 libvpx1
- Suggested packages:
- libfaad-dev libgsm1-dev libogg-dev libschroedinger-dev libspeex-dev libtheora-dev libvorbis-dev libx11-dev
- libxext-dev libraw1394-dev libdc1394-22-dev speex
- The following NEW packages will be installed:
- libavcodec-dev libavcodec53 libavformat-dev libavformat53 libavutil-dev libavutil51 libgsm1 libogg0 liborc-0.4-0
- libschroedinger-1.0-0 libspeex1 libtheora0 libva1 libvorbis0a libvorbisenc2 libvpx1
這樣會自動安裝ffmepg幾個相關庫。
3,從https://github.com/johnf/m3u8-segmenter 下載m3u8-segmenter
下載後不要用它的反覆編譯,直接取m3u8-segmenter.c檔案,
- gcc -Wall -g segmenter.c -o segmenter -lavformat
從原始碼來看,因為只用到了avformat庫,所以只連結這一個即可。生成segmenter檔案,用help命令,可以看到已經成功。
- HTTP Live Streaming - Segments TS file and creates M3U8 index.
- -i, --input FILE TS file to segment (Use - for stdin)
- -d, --duration SECONDS Duration of each segment (default: 10 seconds)
- -p, --output-prefix PREFIX Prefix for the TS segments, will be appended
- with -1.ts, -2.ts etc
- -m, --m3u8-file FILE M3U8 output filename
- -u, --url-prefix PREFIX Prefix for web address of segments, e.g. http://example.org/video/
- -n, --num-segment NUMBER Number of segments to keep on disk
- -h, --help This help
從上圖來看,語法很簡單,這裡貼一個我用的。
- ./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 檔案,新增如下型別
- application/x-mpegURL m3u8;
- video/MP2T ts;
輸入上述路徑,你應該就看到視訊了。
5,高階功能,流切換
上述m3u8檔案,只有一個流,不具備流切換功能。在優酷上,如果是ipad客戶端,可以看到有標清,高清,超清的按鈕,其實那個是對應著不同標準
的(單個)m3u8檔案,來實現流切換的,不知道apple是不是這樣做的,apple好像是要求“智慧”流切換。即不要求使用者去選擇,而是根據網路狀況自適應的。
apple給的sample的流切換是把各個流的m3u8寫在一個m3u8檔案裡實現的。
類似於這樣,其實原理是一樣的。
- #EXTM3U
- #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=100000
- video1/index1.m3u8
- #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000
- 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
相關文章
- 基於 SRS+NG 搭建 HLS 直播流媒體伺服器伺服器
- nginx+ffmpeg搭建流媒體伺服器(直播流)Nginx伺服器
- 使用Nginx搭建rtmp流媒體伺服器筆記Nginx伺服器筆記
- 為SRS流媒體伺服器新增HLS加密功能(附原始碼)伺服器加密原始碼
- [SRS流媒體]RTMP/HLS 直播伺服器simple-rtmp-server安裝伺服器Server
- 淺析 HLS 流媒體協議協議
- MAC 上編譯安裝nginx-rtmp-module 流媒體伺服器Mac編譯Nginx伺服器
- 1.RTMP流媒體伺服器搭建伺服器
- vlc簡單搭建流媒體伺服器伺服器
- nginx搭建支援http和rtmp協議的流媒體伺服器之一NginxHTTP協議伺服器
- 利用nginx搭建RTMP視訊點播、直播、HLS伺服器Nginx伺服器
- 基於SRS搭建RTMP直播流媒體伺服器伺服器
- Ubuntu 中使用 Nginx+rtmp 搭建流媒體直播服務.mdUbuntuNginx
- JMeter流媒體線上播放HLS外掛BlazeMeter - HLS Plugin實現視訊線上播放壓測JMeterPlugin
- Nginx搭建RTMP推拉流伺服器Nginx伺服器
- 搭建一個點播跟直播流媒體伺服器玩玩伺服器
- Ubuntu 中使用 Nginx+rtmp 模組搭建流媒體視訊點播服務UbuntuNginx
- 什麼是流媒體伺服器?伺服器
- 用VLC做流媒體伺服器伺服器
- Golang開源流媒體伺服器(RTMP/RTSP/HLS/FLV等協議)Golang伺服器協議
- Ubuntu 安裝nginx 來搭建推流伺服器UbuntuNginx伺服器
- SequoiaDB巨杉資料庫入門:快速搭建流媒體伺服器資料庫伺服器
- 技術分享| 如何搭建直播場景下的推拉流媒體伺服器伺服器
- 媒體轉碼HLS標準加密詳解加密
- 直播流媒體伺服器解決方案伺服器
- 【史上最全】Nginx+ffmpeg實現流媒體系統Nginx
- Windows Server 2022 上搭建流媒體直播和點播服務WindowsServer
- 在Mac上搭建自己的伺服器——NginxMac伺服器Nginx
- 搭建rtmp流媒體伺服器過程中遇到的一個小問題伺服器
- 流媒體加密加密
- CD 從抓軌到搭建流媒體伺服器 —— 以《月臨寐鄉》為例伺服器
- 使用ffmpeg推送視訊流至流媒體伺服器(c語言)伺服器C語言
- 樹莓派實用RED5搭建流媒體伺服器實現點播功能樹莓派伺服器
- docker 中使用原始碼方式搭建 SRS 流媒體服務Docker原始碼
- crtmpserver系列(二):搭建簡易流媒體直播系統Server
- 流媒體技術基礎-流媒體傳輸協議(二)協議
- 流媒體伺服器與影片伺服器有什麼區別?伺服器
- 點量流媒體伺服器系統釋出啦伺服器