1. 程式人生 > >流媒體nginx伺服器架設(一)

流媒體nginx伺服器架設(一)

目標用於搭建內網流媒體伺服器支援視訊的點播。

背景

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

相關概念

  • 流媒體
    流媒體(Streaming Media)是一種新興的網路傳輸技術,在網際網路上實時順序地傳輸和播放視/音訊等多媒體內容的連續時基資料流。

流媒體技術包括流媒體資料採集、視/音訊編解碼、儲存、傳輸、播放等領域。

  • 流媒體系統組成
    包括編碼工具、流媒體資料、伺服器、網路和播放器。

  • 流媒體傳輸過程
    如下圖所示:

  • 傳輸協議
    RSVP: 資源預留協議
    RTP: 實時傳輸協議
    RTCP: 實時傳輸控制協議
    MMS: 微軟流媒體服務協議
    RTSP: 實時流協議
    RTMP: 實時訊息傳輸協議
    MIME: 多目因特網電子郵件擴充套件協議

解決方案

商業方案

  • Real Network的Real System

    
          
    1. 服務端軟體:Helix Server
    2. 平臺:Windows or Linux
    3. 檔案格式:RealAudio, Realvideo, RealFlash
  • 微軟的Windows Media Services

    
          
    1. 服務端軟體:Windows Media Server
    2. 平臺:Windows
    3. 檔案格式:ASF, WMV
  • 蘋果公司的Quick Time系列

    
          
    1. 服務端軟體:QuickTime Streaming Server (開源版本為Darwin Streaming Server)
    2. 平臺:MacOS X, Linux, Windows
    3. 檔案格式:MOV, MP4

在這三家公司的流媒體產品中,RealNetworks公司的免費服務端Helix Server Basic最大提供個流的併發,僅支援其專有編碼RealAudio和RealVideo,基本上只能算是體驗性的產品;微軟公司的流媒體服務端Windows Media Server附帶於其伺服器產品Windows Server中,但只有最高版本的Windows Server Enterprice才具有完整的包括組播在內的所有流媒體伺服器功能;蘋果公司的Darwin Streaming Server(簡稱DSS)完全免費,沒有任何功能限制,且符合國際標準。

開源/免費解決方案

  • ffmpeg

    
          
    1. 全平臺視訊轉換
    2. 開源
  • RED5

    
          
    1. Red5是一個採用Java開發開源的Flash流媒體伺服器。它支援:把音訊( MP3)和視訊(FLV)轉換成播放流; 錄製客戶端播放流(只支援FLV);共享物件;現場直播流釋出;遠端呼叫。Red5使用RSTP作為流媒體傳輸協議,在其自帶的一些示例中演示了線上錄製,flash流媒體播放,線上聊天,視訊會議等一些基本功能。
    2. 開源地址:[](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的根目錄。


    
  1. server {
  2. listen 80;
  3. server_name localhost;
  4. #charset koi8-r;
  5. #access_log logs/host.access.log main;
  6. location / {
  7. # root html;
  8. root /var/www/html;
  9. index index.html index.htm;
  10. }

即可使用播放器開啟遠端連線。

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
    

    
  1. tar xzvf zlib -1.2 .8.tar.gz
  2. cd zlib -1.2 .8
  3. ./configure
  4. make
  5. make install

    
  1. tar xzvf pcre -8.37.tar.gz
  2. cd pcre -8.37
  3. ./configure
  4. make
  5. make install

    
  1. tar xzvf yamdi- 1.9.tar.gz
  2. cd yamdi- 1.9
  3. ./cofigure
  4. gcc yamdi. c -o yamdi - O2 - Wall

    
  1. tar xzvf openssl -1.0 .1t.tar.gz
  2. cd openssl -1.0 .1t
  3. ./config
  4. make depend
  5. make install
  • 安裝ffmpeg以及依賴包
    需要安裝yasm, x264, LAME, libogg,libvorbis, libvpx, faad2, faac

    
  1. # 彙編工具
  2. # 請網路搜尋安裝包
  3. unzip yasm-1 .2 .0-1 .el6 .x86_64 .zip
  4. rpm -ivh yasm-1 .2 .0-1 .el6 .x86_64 .rpm

    
  1. # h.264編碼
  2. # http videolan.org
  3. tar xjvf last_x264.tar.bz2
  4. cd x264-snapshot- 20160718- 2245
  5. ./configure -- enable-shared
  6. make
  7. make install

    
  1. # LAME mp3編碼器
  2. wget http:/ /downloads.sourceforge.net/project /lame/lame /3.99/lame- 3.99. 5.tar.gz
  3. tar xzvf lame- 3.99. 5.tar.gz
  4. cd lame- 3.99. 5
  5. ./configure --enable-nasm
  6. make
  7. make install

    
  1. # libogg 音訊編碼器
  2. wget http: //downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.gz
  3. tar xzvf libogg -1.3 .2.tar.gz
  4. cd libogg -1.3 .2
  5. ./configure
  6. make
  7. make install

    
  1. # libvorbis 音訊編碼器
  2. wget http: //downloads.xiph.org/releases/vorbis/libvorbis-1.3.5.tar.gz
  3. tar xzvf libvorbis -1.3 .5.tar.gz
  4. cd libvorbis -1.3 .5
  5. ./configure
  6. make
  7. make install

    
  1. # libvpx VP8編碼解碼器
  2. # 網路搜尋
  3. tar xjvf libvpx- 1.5. 0.tar.bz2
  4. cd libvpx- 1.5. 0
  5. ./configure -- enable-shared
  6. make
  7. make install

    
  1. # FAAD2 MPEG-2和AAC格式的編解碼器
  2. wget http: //downloads.sourceforge.net/ project /faac/faad2-src/faad2- 2.7 /faad2- 2.7 .tar.gz
  3. tar xzvf faad2 - 2.7.tar.gz
  4. cd faad2 - 2.7
  5. ./configure
  6. make
  7. make install

    
  1. # faac AAC編解碼器
  2. wget http: //downloads.sourceforge.net/ project /faac/faac-src/faac- 1.28 /faac- 1.28 .tar.gz
  3. tar xzvf faac - 1.28.tar.gz
  4. cd faac - 1.28
  5. ./configure
  6. make
  7. make install

    
  1. # xvid 視訊編碼
  2. wget http: //downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz
  3. tar zxvf xvidcore -1.3 .2.tar.gz
  4. cd xvidcore/build/generic
  5. ./configure
  6. make
  7. make install

    
  1. # ffmpeg 轉換工具
  2. wget http://ffmpeg.org/releases/ffmpeg -3.1 .1.tar.bz2
  3. tar xjvf ffmpeg -3.1 .1.tar.bz2
  4. cd ffmpeg -3.1 .1
  5. ./configure --prefix=/opt/ffmpeg/ \
  6. --enable-version3 \
  7. --enable-libvpx \
  8. --enable-libfaac \
  9. --enable-libmp3lame \
  10. --enable-libvorbis \
  11. --enable-libx264 \
  12. --enable-libxvid \
  13. --enable-shared \
  14. --enable-gpl \
  15. --enable-postproc \
  16. --enable-nonfree \
  17. --enable-avfilter \
  18. --enable-pthreads
  19. make
  20. # 可以忽略編譯過程中的警告資訊
  21. make install
  • 修改/etc/ld.so.conf

    
  1. inclue ld.so.conf.d/*.conf
  2. / lib
  3. /lib64
  4. /usr/ lib
  5. /usr/lib64
  6. /usr/local/ lib
  7. /usr/local/lib64
  8. /opt/ffmpeg/ lib

執行ldconfig使修改生效。

  • 編碼測試
ffmpeg -i ./a_day_with_htc_vive.avi -f hls ./htcvive.m3u8
    
  • 編譯Nginx

    
  1. wget http: //h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
  2. tar xzvf nginx_mod_h264_streaming -2.2 .7.tar.gz
  3. # https://github.com/arut/nginx-rtmp-module
  4. unzip nginx-rtmp- module-master.zip

    
  1. vi nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c
  2. # 註釋以下內容
  3. /* TODO: W in32 */
  4. if (r->zero_ in_uri)
  5. {
  6. return NGX_DECLINED;
  7. }

    
  1. groupadd nginx
  2. useradd nginx
  3. usermod -G nginx nginx

    
  1. tar zxf nginx -1.8 .0.tar.gz
  2. cd nginx -1.8 .0
  3. ./configure --prefix= /usr/local/nginx \
  4. --add- module= /opt/video/nginx_mod_h264_streaming -2.2 .7 \
  5. -- with-http_flv_module \
  6. -- with-http_ssl_module \
  7. -- with-http_mp4_module \
  8. -- with-http_gzip_static_module \
  9. -- with-http_stub_status_module \
  10. -- with-pcre= /opt/video/pcre -8.37 \
  11. -- with-zlib= /opt/video/zlib -1.2 .8 \
  12. --u