流媒體nginx伺服器架設(一)
目標用於搭建內網流媒體伺服器支援視訊的點播。
背景
用於支援培訓網站中視訊點撥功能,在培訓網站總體方案中需要加入流媒體伺服器,用於儲存和傳輸視訊資源。
相關概念
- 流媒體
流媒體(Streaming Media)是一種新興的網路傳輸技術,在網際網路上實時順序地傳輸和播放視/音訊等多媒體內容的連續時基資料流。
流媒體技術包括流媒體資料採集、視/音訊編解碼、儲存、傳輸、播放等領域。
流媒體系統組成
包括編碼工具、流媒體資料、伺服器、網路和播放器。流媒體傳輸過程
如下圖所示:
- 傳輸協議
RSVP: 資源預留協議
RTP: 實時傳輸協議
RTCP: 實時傳輸控制協議
MMS: 微軟流媒體服務協議
RTSP: 實時流協議
RTMP: 實時訊息傳輸協議
MIME: 多目因特網電子郵件擴充套件協議
解決方案
商業方案
Real Network的Real System
- 服務端軟體:Helix Server
- 平臺:Windows or Linux
- 檔案格式:RealAudio, Realvideo, RealFlash
微軟的Windows Media Services
- 服務端軟體:Windows Media Server
- 平臺:Windows
- 檔案格式:ASF, WMV
蘋果公司的Quick Time系列
- 服務端軟體:QuickTime Streaming Server (開源版本為Darwin Streaming Server)
- 平臺:MacOS X, Linux, Windows
- 檔案格式:MOV, MP4
在這三家公司的流媒體產品中,RealNetworks公司的免費服務端Helix Server Basic最大提供個流的併發,僅支援其專有編碼RealAudio和RealVideo,基本上只能算是體驗性的產品;微軟公司的流媒體服務端Windows Media Server附帶於其伺服器產品Windows Server中,但只有最高版本的Windows Server Enterprice才具有完整的包括組播在內的所有流媒體伺服器功能;蘋果公司的Darwin Streaming Server(簡稱DSS)完全免費,沒有任何功能限制,且符合國際標準。
開源/免費解決方案
ffmpeg
- 全平臺視訊轉換
- 開源
RED5
- Red5是一個採用Java開發開源的Flash流媒體伺服器。它支援:把音訊( MP3)和視訊(FLV)轉換成播放流; 錄製客戶端播放流(只支援FLV);共享物件;現場直播流釋出;遠端呼叫。Red5使用RSTP作為流媒體傳輸協議,在其自帶的一些示例中演示了線上錄製,flash流媒體播放,線上聊天,視訊會議等一些基本功能。
- 開源地址:[](https: //github.com/Red5/red5-server)
Darwin Streaming Server
為蘋果公司視訊流解決方案的開源版本。
easyDarwin
國內基於Darwin Streaming Server二次開發的流媒體伺服器,有中文支援網站。
安裝配置
RED5
使用HTTP協議播放
- 首先從github下載已編譯版本,因為在Linux上安裝使用,直接下載 red5-server-1.0.7-RELEASE.tar.gz檔案即可。
- Java程式,在伺服器上安裝jre1.7版本後即可解壓執行。測試階段可以使用
./red5-debug.sh
啟動red5伺服器。在瀏覽器上輸入http://[serverip]:5080/可以看到red5控制主頁。 - 在red5安裝目錄下的webapp/vod目錄下的視訊檔案可以在本地VLC播放器上連線http://[serverip]:5080/[filename]進行播放。
Darwin Streaming Server
功能同easyDarwin,在Linux上安裝比較繁瑣,所以暫時只試用easyDarwin。
easyDarwin
使用RTSP協議播放
- 首先從github下載原始碼或者已編譯版本,因為上面有CentOS的已編譯版本,直接下載解壓即可使用。
- 使用root賬戶啟動執行程式,首次啟動遷移開啟除錯模式,
./easydarwin -c ./easydarwin.xml -d
。 - 啟動後,可以在執行的從終端看到除錯資訊。同時使用http://[serverip]:8088可以登入,預設使用admin/admin登入。
- 在Movies目錄下放置一些視訊檔案,就可以在客戶端使用播放器進行播放,我測試使用的是VLC。
Nginx + HLS
HLSHTTP Live Streaming蘋果公司開放的支援html5直接播放的視訊流技術。
Nginx實現http伺服器功能,可以通過http訪問m3u8檔案實現播放。
要使用HLS播放的第一步,是將視訊檔案切割成多個ts視訊流,然後使用m3u8索引檔案進行播放。生成m3u8和ts檔案可以藉助ffmpeg工具,使用如下命令就可以將一般的視訊檔案轉換成HLS支援的檔案。
ffmpeg -i "G:\video\7 magic leap2.avi" -f hls "G:\video\HLR\test.m3u8"
對於大檔案用上面這種方式有可能出現m3u8缺少索引的情況,因此也可以使用以下的方式對檔案進行轉換。
ffmpeg -i bigfile.mp4 -codec:v libx264 -codec:a aac -map 0 -f ssegment -segment_format mpegts -segment_list tos.m3u8 -segment_time 10 taste_of_shanghai%04d.ts
直接使用Nginx訪問檔案路徑
不需要多餘的軟體,直接將m3u8檔案所在目錄設定為http server的根目錄。
-
server {
-
listen
80;
-
server_name localhost;
-
-
#charset koi8-r;
-
-
#access_log logs/host.access.log main;
-
-
location / {
-
# root html;
-
root /var/www/html;
-
index index.html index.htm;
-
}
即可使用播放器開啟遠端連線。
Nginx + jwplayer
Nginx編譯時增加mp4和flv模組,可以讓Nginx支援flv和mp4格式。為了後面說明支援RMTP協議,同時在增加RTMP模組。
- 安裝依賴包
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
-
tar xzvf zlib
-1.2
.8.tar.gz
-
cd zlib
-1.2
.8
-
./configure
-
make
-
make install
-
tar xzvf pcre
-8.37.tar.gz
-
cd pcre
-8.37
-
./configure
-
make
-
make install
-
tar xzvf yamdi-
1.9.tar.gz
-
cd yamdi-
1.9
-
./cofigure
-
gcc yamdi.
c -o yamdi -
O2 -
Wall
-
tar xzvf openssl
-1.0
.1t.tar.gz
-
cd openssl
-1.0
.1t
-
./config
-
make depend
-
make install
- 安裝ffmpeg以及依賴包
需要安裝yasm, x264, LAME, libogg,libvorbis, libvpx, faad2, faac
-
# 彙編工具
-
# 請網路搜尋安裝包
-
unzip
yasm-1
.2
.0-1
.el6
.x86_64
.zip
-
rpm
-ivh
yasm-1
.2
.0-1
.el6
.x86_64
.rpm
-
# h.264編碼
-
# http videolan.org
-
tar xjvf last_x264.tar.bz2
-
cd x264-snapshot-
20160718-
2245
-
./configure --
enable-shared
-
make
-
make
install
-
# LAME mp3編碼器
-
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
-
# libogg 音訊編碼器
-
wget http:
//downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.gz
-
tar xzvf libogg
-1.3
.2.tar.gz
-
cd libogg
-1.3
.2
-
./configure
-
make
-
make install
-
# libvorbis 音訊編碼器
-
wget http:
//downloads.xiph.org/releases/vorbis/libvorbis-1.3.5.tar.gz
-
tar xzvf libvorbis
-1.3
.5.tar.gz
-
cd libvorbis
-1.3
.5
-
./configure
-
make
-
make install
-
# libvpx VP8編碼解碼器
-
# 網路搜尋
-
tar xjvf libvpx-
1.5.
0.tar.bz2
-
cd libvpx-
1.5.
0
-
./configure --
enable-shared
-
make
-
make
install
-
# FAAD2 MPEG-2和AAC格式的編解碼器
-
wget http:
//downloads.sourceforge.net/
project
/faac/faad2-src/faad2-
2.7
/faad2-
2.7
.tar.gz
-
tar xzvf faad2
-
2.7.tar.gz
-
cd faad2
-
2.7
-
./configure
-
make
-
make
install
-
# faac AAC編解碼器
-
wget http:
//downloads.sourceforge.net/
project
/faac/faac-src/faac-
1.28
/faac-
1.28
.tar.gz
-
tar xzvf faac
-
1.28.tar.gz
-
cd faac
-
1.28
-
./configure
-
make
-
make
install
-
# 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
-
# ffmpeg 轉換工具
-
wget http://ffmpeg.org/releases/ffmpeg
-3.1
.1.tar.bz2
-
tar xjvf ffmpeg
-3.1
.1.tar.bz2
-
cd ffmpeg
-3.1
.1
-
./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
- 修改
/etc/ld.so.conf
-
inclue ld.so.conf.d/*.conf
-
/
lib
-
/lib64
-
/usr/
lib
-
/usr/lib64
-
/usr/local/
lib
-
/usr/local/lib64
-
/opt/ffmpeg/
lib
執行ldconfig
使修改生效。
- 編碼測試
ffmpeg -i ./a_day_with_htc_vive.avi -f hls ./htcvive.m3u8
- 編譯Nginx
-
wget http:
//h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
-
tar xzvf nginx_mod_h264_streaming
-2.2
.7.tar.gz
-
-
# https://github.com/arut/nginx-rtmp-module
-
unzip nginx-rtmp-
module-master.zip
-
vi nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c
-
# 註釋以下內容
-
/* TODO: W
in32 */
-
if (r->zero_
in_uri)
-
{
-
return NGX_DECLINED;
-
-
}
-
groupadd nginx
-
useradd nginx
-
usermod -G nginx nginx
-
tar zxf nginx
-1.8
.0.tar.gz
-
cd nginx
-1.8
.0
-
./configure --prefix=
/usr/local/nginx \
-
--add-
module=
/opt/video/nginx_mod_h264_streaming
-2.2
.7 \
-
--
with-http_flv_module \
-
--
with-http_ssl_module \
-
--
with-http_mp4_module \
-
--
with-http_gzip_static_module \
-
--
with-http_stub_status_module \
-
--
with-pcre=
/opt/video/pcre
-8.37 \
-
--
with-zlib=
/opt/video/zlib
-1.2
.8 \
-
--u