視頻流媒體服務器


目標用於搭建內網流媒體服務器支持視頻的點播。

背景

用於支持培訓網站中視頻點撥功能,在培訓網站總體方案中需要加入流媒體服務器,用於存儲和傳輸視頻資源。

相關概念

  • 流媒體
    流媒體(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協議播放

  1. 首先從github下載已編譯版本,因為在Linux上安裝使用,直接下載 red5-server-1.0.7-RELEASE.tar.gz文件即可。
  2. Java程序,在服務器上安裝jre1.7版本后即可解壓運行。測試階段可以使用./red5-debug.sh啟動red5服務器。在瀏覽器上輸入http://[serverip]:5080/可以看到red5控制主頁。
  3. 在red5安裝目錄下的webapp/vod目錄下的視頻文件可以在本地VLC播放器上連接http://[serverip]:5080/[filename]進行播放。

Darwin Streaming Server

功能同easyDarwin,在Linux上安裝比較繁瑣,所以暫時只試用easyDarwin。

easyDarwin

使用RTSP協議播放

  1. 首先從github下載源碼或者已編譯版本,因為上面有centos的已編譯版本,直接下載解壓即可使用。
  2. 使用root賬戶啟動執行程序,首次啟動遷移開啟調試模式,./easydarwin -c ./easydarwin.xml -d
  3. 啟動后,可以在執行的從終端看到調試信息。同時使用http://[serverip]:8088可以登錄,默認使用admin/admin登錄。
    配置界面
  4. 在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;
        }

即可使用播放器打開遠程連接。

hlr_playback

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: Win32 */
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 \
--user=nginx --group=nginx \
--add-module=/opt/video/nginx-rtmp-module-master \
--with-cc-opt=-I/opt/ffmpeg/include \
--with-ld-opt=-L/opt/ffmpeg/lib-R/opt/ffmpeg/lib

make 
make install
  • 配置nginx.conf文件
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root /var/www/html;
            index  index.html index.htm;
            location ~ \.flv$
            {
                flv;
            }
            location ~ \.mp4$
            {
                mp4;
            }
        }
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
            root /var/www/html;
            break;
        }
  • 使用jwplayer實現http播放

在網站上下載一個jwplayer,解壓后上傳至/var/www/html目錄,然后就可以在瀏覽器直接訪問以h264編碼的mp4文件或flv文件。

此方法的兼容性較好,在IE, Chrome, Firefox, Safari輸入地址http://192.168.40.134/player.swf?type=http&file=sample_h264_100kbit.mp4,視頻都可以直接打開。

效果如下圖所示:

ie_jwplayer

不過這樣的播放方式,要求在地址欄輸入一長串的地址,優雅一點的方法是寫一個頁面放在網站目錄下,然后通過訪問頁面來播放嵌套其中的視頻。

如下建立一個index.html文件。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test of nginx-http</title>
</head>
<body>
<div id="myElement"></div>
<object id="FlashID" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="480" height="360">
  <param name="movie" value="player.swf" />
  <param name="quality" value="high" />
  <param name="wmode" value="opaque" />
  <param name="swfversion" value="6.0.65.0" />
  <EMBED SRC="player.swf" WIDTH="480" HEIGHT="360" QUALITY="high" flashvars="type=http&file=/magicleap2.flv&autostart=true" wmode="opaque" /></object>
</body>
</html>

其中flv文件如果要支持拖動,需要對文件添加關鍵幀,方法如下:

yamdi -i magicleap.flv -o magicleap2.flv

然后通過瀏覽器訪問這個地址http://192.168.40.134/index.html。可以看到視頻實現在頁面中的播放。

ie_jwplayer_page

Nginx + RMTP模塊

  • 測試RTMP直播功能
    提示:測試RTMP功能可以參考nginx-rtmp-module中的test目錄。
# 寫入nginx.conf文件,rtmp協議專用1935端口
rtmp {
    server {
        listen 1935;
        chunk_size 4000;
        application vod {
            play /var/www/vod; # vod file location
        }
        application live { 
            live on;

         }
    access_log logs/rtmp_access.log; 
    }
}

在本地的VLC打開rtmp地址rtmp://192.168.40.134/live/mystream。
在遠程主機上使用ffmpeg命令模擬一個視頻流推送給VLC。這種推流的方式實際就是所謂的直播了。

ffmpeg -loglevel verbose -re -i /var/www/html/a_day_with_htc_vive.avi  -f flv rtmp://localhost/live/mystream

ffmpeg –i/usr/local/nginx/vod/flvs/a.flv-strict -2 -c:v libx264 -c:a aac -f flv rtmp://192.168.10.4/live/test

一旦遠程主機上的轉換開始,VLC開始緩沖幾秒后就會開始播放,如下圖所示。

vlc_rtmp_receive

  • 在http模塊中配置RTMP虛擬機(server)實現點播功能

實現方法是用jwplayer調用rtmp的流實現視頻播放。如下html實現對視頻的嵌入播放。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>nginx-rtmp</title>
</head>

<body>
<div id="myElement"></div>
<object id="FlashID" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="480" height="360">
  <param name="movie" value="player.swf" />
  <param name="quality" value="high" />
  <param name="wmode" value="opaque" />
  <param name="swfversion" value="6.0.65.0" />  <EMBED SRC="player.swf" WIDTH="480" HEIGHT="360" QUALITY="high" flashvars="streamer=rtmp://192.168.40.134:1935/vod&file=magicleap2.flv&autostart=true" wmode="o
paque" />
</object>
</body>
</html>

播放效果如下:

ie_jwplayer_rmtp_page

通過這個RTMP流的優勢是,可以避免視頻文件被瀏覽器通過http方式進行下載。

視頻文件存儲

所有流服務器存儲媒體文件的方式都是將文件放在指定目錄下面,且磁盤系統絕大部分I/O都是讀操作,寫操作只會發生在上傳和更新媒體文件過程中。對於這種I/O操作特性,建議選擇RAID 5用於中小規模的視頻點撥服務。這樣可以提供比獨立磁盤更高的數據安全性和讀取速度,同時將成本控制在較小的范圍內。實際可用容量為(N-1)個磁盤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM