1. 程式人生 > >nginx+ffmpeg搭建流媒體伺服器

nginx+ffmpeg搭建流媒體伺服器

安裝ffmpeg:

下載FFmpeg和libx264的包
ffmpeg-2.4.1.tar.bz2  last_x264.tar.bz2
libx264需要yasm,所以先安裝yasm

  1. apt-get install yasm  

然後安裝libx264

  1. aptitude install libx264-dev  

也可以手動安裝libx264(原先libx264在ubuntu的軟體源裡是沒有的只能手動安裝,現在有了就可以不用手動安裝了)
解壓縮libx264

  1. tar -xjvf last_x264.tar.bz2  

安裝libx264

  1. ./configure --enable-shared --enable-pic  
  2. make  
  3. make install  

然後安裝ffmpeg,ffmpeg有許多依賴包,需要一個一個先安裝
1. libfaac

  1. aptitude install libfaac-dev  

2. libmp3lame

  1. aptitude install libmp3lame-dev  

3. libtheora

  1. aptitude install libtheora-dev  

4. libvorbis

  1. aptitude install libvorbis-dev  

5. libxvid

  1. aptitude install libxvidcore-dev

6. libxext

  1. aptitude install libxext-dev  

7. libxfixes

  1. aptitude install libxfixes-dev  

依賴包安裝完後,安裝ffmpeg
先解壓縮ffmpeg

  1. tar -xjvf ffmpeg-2.4
    .1.tar.bz2  

然後編譯安裝

  1. ./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-pthreads --enable-libfaac --enable-libmp3lame --enable-libtheora --enable-libx264 --enable-libxvid --enable-x11grab --enable-libvorbis
  1. make  
  2. make install

Nginx本身是一個非常出色的HTTP伺服器,FFMPEG是非常好的音視訊解決方案.這兩個東西通過一個nginx的模組nginx-rtmp-module,組合在一起即可以搭建一個功能相對比較完善的流媒體伺服器.

這個流媒體伺服器可以支援RTMP和HLS(Live Http Stream)

從安裝開始

不同的是在configure的時候需要增加nginx-rtmp-module的支援,下載好nginx-rtmp-module後解壓,然後nginx安裝時增加這個模組(--add-module),其它都是一樣的.

  1. ./configure --prefix=/usr/local/nginx --with-pcre=/home/user/pcre/pcre-8.32 --with-zlib=/home/user/zlib/zlib-1.2.8 --with-openssl=/home/user/openssl/openssl-1.0.1i  --add-module=/home/user/nginx-rtmp-module  

nginx配合ffmpeg做流媒體伺服器的原理是: nginx通過rtmp模組提供rtmp服務, ffmpeg推送一個rtmp流到nginx, 然後客戶端通過訪問nginx來收看實時視訊流. HLS也是差不多的原理,只是最終客戶端是通過HTTP協議來訪問的,但是ffmpeg推送流仍然是rtmp的.

安裝完成後,開啟Nginx的配置檔案nginx.conf進行配置

首先在裡面加入rtmp的配置

  1. rtmp {  
  2.     server {  
  3.         listen 1935;  
  4.         application myapp {  
  5.             live on;  
  6.         }  
  7.         application hls {  
  8.             live on;  
  9.             hls on;  
  10.             hls_path /tmp/hls;  
  11.         }  
  12.     }  
  13. }  

然後,針對hls,還需要在http裡面增加一個location配置

  1. location /hls {  
  2.             types {  
  3.                 application/vnd.apple.mpegurl m3u8;  
  4.                 video/mp2t ts;  
  5.             }  
  6.             root /tmp;  
  7.             add_header Cache-Control no-cache;  
  8. }  

 這是一個最簡單,最基礎的配置, rtmp監聽1935埠,如果是hls的話用hls on開啟hls,並且為hls設定一個臨時檔案目錄hls_path /tmp/hls; 其它更高階的配置可以參看nginx-rtmp-module的readme,裡面有比較詳細的介紹其它的配置,並且它還提供了一個通過JWPlayer在網頁上播放的例子.

 儲存完配置檔案後,啟動nginx,通過netstat -ltn命令可以看到增加了一個1935埠的監聽.8080是nginx預設的http監聽埠.

[java] view plaincopyprint?
  1. # netstat -ltn  
  2. Active Internet connections (only servers)  
  3. Proto Recv-Q Send-Q Local Address           Foreign Address         State        
  4. tcp        00127.0.1.1:530.0.0.0:*               LISTEN       
  5. tcp        000.0.0.0:220.0.0.0:*               LISTEN       
  6. tcp        00127.0.0.1:6310.0.0.0:*               LISTEN       
  7. tcp        000.0.0.0:19350.0.0.0:*               LISTEN       
  8. tcp        000.0.0.0:80800.0.0.0:*               LISTEN       
  9. tcp6       00 :::22                   :::*                    LISTEN       
  10. tcp6       00 ::1:631                 :::*                    LISTEN    

然後用ffmpeg推流到nginx:

第一個是推到了上面配置的myapp上:

[java] view plaincopyprint?
  1. ffmpeg -re -i "D:\download\film\aqgy\02.mp4" -vcodec libx264 -vprofile baseline -acodec aac  
  2.  -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://server:1935/
  3. myapp/test1  

第二個推送到hls上:

[java] view plaincopyprint?
  1. ffmpeg -re -i "D:\download\film\aqgy\02.mp4" -vcodec libx264 -vprofile baseline -acodec aac  
  2.  -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://ip:1935/
  3. hls/test2  

現在我們的流媒體伺服器有兩個實時流了,一個是rtmp的,另一個是hls的,用流媒體播放器播放一下,流媒體播放器可以用vlc也可以用ffmpeg帶的ffplay.手機也是可以播放的.

 上面這兩個流的地址分別是:

第一個就是推送的地址: rtmp://serverIp:1935/myapp/test1

第二個是HTTP地址: http://serverIp:8080/hls/test2.m3u8

 最後貼上一段對於HLS這個比較特殊的流媒體協議的解釋:

       (這段解釋來自: http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html)

  HTTP Live Streaming(HLS)是蘋果公司(Apple Inc.)實現的基於HTTP的流媒體傳輸協議,可實現流媒體的直播和點播,相對於常見的流媒體直播協議,例如RTMP協議、RTSP協議、MMS協議等,HLS直播最大的不同在於,直播客戶端獲取到的,並不是一個完整的資料流。HLS協議在伺服器端將直播資料流儲存為連續的、很短時長的媒體檔案(MPEG-TS格式),而客戶端則不斷的下載並播放這些小檔案,因為伺服器端總是會將最新的直播資料生成新的小檔案,這樣客戶端只要不停的按順序播放從伺服器獲取到的檔案,就實現了直播。由此可見,基本上可以認為,HLS是以點播的技術方式來實現直播。由於資料通過HTTP協議傳輸,所以完全不用考慮防火牆或者代理的問題,而且分段檔案的時長很短,客戶端可以很快的選擇和切換位元速率,以適應不同頻寬條件下的播放。不過HLS的這種技術特點,決定了它的延遲一般總是會高於普通的流媒體直播協議。

用開源nginx-rtmp-module搭建flash直播環境:

2、進入nginx的原始碼目錄,編譯
./configure --add-module=<path-to-nginx-rtmp-module> --without-http_rewrite_module
make
make install

3、寫一個測試配置檔案
#user  nobody;
worker_processes  1;

error_log  logs/error.log debug;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

rtmp {
    server {
        listen 1935;

        chunk_size 4096;

        application myapp {
            live on;
        }
    }
}

http {
    server {
        listen      8080;

        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            root /home/arut-nginx-rtmp-module-e5d61f2/;
        }

        location / {
            root /home/arut-nginx-rtmp-module-e5d61f2/test/rtmp-publisher;
        }
    }
}

4、啟動nginx
/usr/local/nginx/sbin/nginx -c /home/arut-nginx-rtmp-module-e5d61f2/test/nginx.conf

5、用ffmpeg產生一個模擬直播源,向rtmp伺服器推送
ffmpeg -re -i ~/2012.flv -f flv rtmp://192.168.11.75/myapp/test1
注意,原始檔必須是H.264+AAC編碼的。192.168.11.75是執行nginx的伺服器IP

7、網頁播放測試,用nginx-rtmp-module自帶的一個例子修改,在test/rtmp-publisher目錄下

player.html

<!DOCTYPE html>
<html>
<head>
    <title>RTMP Player</title>
    <script type="text/javascript" src="swfobject.js"></script>
    <script type="text/javascript">
        var flashVars = {
            streamer: 'rtmp://192.168.11.75/myapp',
            file:'test1'
        };
        swfobject.embedSWF("RtmpPlayer.swf", "rtmp-publisher", "500", "400", "9.0.0", 

null, flashVars);
    </script>
</head>
<body>
    <div id="rtmp-publisher">
        <p>Flash not installed</p>
    </div>
</body>
</html>

播放大視訊會很卡

nginx-rtmp-module還有許多其他特性,例如支援FLV/MP4的點播、HLS直播、多worker工作模式、push and pull工作模式等,以後慢慢挖掘

 Nginx-RTMP功能調研:

協議介紹

RTMP(Real Time Messaging Protocol)實時訊息傳送協議是Adobe Systems公司為Flash播放器和伺服器之間音訊、視訊和資料傳輸開發的私有協議。

它有三種變種:

1)工作在TCP之上的明文協議,使用埠1935

2)RTMPT封裝HTTP請求之中,可穿越防火牆

3)RTMPS類似RTMPT,但使用的是HTTPS連線;

RTMP協議就像一個用來裝資料包的容器,這些資料可以是AMF格式的資料,也可以是FLV中的視/音訊資料。一個單一的連線可以通過不同的通道傳輸多路網路流。這些通道中的包都是按照固定大小的包傳輸的。

   

1   RTMP互動圖

更多協議的細節可以參見《rtmp specification 1.0

2.1當前的流媒體server

現在主要有兩種rtmp server,商業的和開源的。商業的比開源的支援的功能多,個人根據需要選擇吧

  商業的有FMS Wowza

  開源RTMP server

  1.  red5 java  有名

  2.  crtmpserver c++ 支援多種rtmp協議,移動裝置以及IPTV相關網路協議 http://www.rtmpd.com/ Erlyvideo erlong 有開源和商業版本 https//github.com/erlyvideo/erlyvideo h

FMS是Adobe公司的產品,license非常昂貴。下面就wowza這個商業軟體講下流媒體Server,不僅僅是RTMP Server,在達到生產環境所需要的功能。wowza最突出的特定是多終端適應性,這個在如今多媒體融合的網路環境下有很強的實用意義。究其原理並無深入研究。國內尚為視訊是其代理公司。

Wowza Media Server是一款高效能、多執行緒的流媒體伺服器軟體。專為多種終端裝置提供音視訊內容播放服務,支援iOSwindowsAndroidBlackMerry等系統的終端裝置,以HTTPRTSP/ RTPRTMP傳輸協議的流播放,還支援利用機頂盒進行播放的IPTV

通過對Wowza Media Server的深度定製開發,尚為網路視聽管理系統實現了對網路音視訊內容的採集、編碼、編輯、轉碼、稽核、播出與監控等完整的生命週期管理,突出了以下能力:

1)自動化內容收錄

  對網路視訊的錄製,採用伺服器端錄製模式,滿足從28Kbps10Mbps碼流範圍的H.264編碼流的自動化定時收錄。

2) 快速線上編輯

雲端計算架構設計,伺服器端處理。所有編輯任務都處在雲端,對編輯機無要求,任務處理快捷簡單。

  對視訊的處理包括切條、合併、去除廣告、新增logo等操作。

  支援同一素材多格式檔案的一次性編輯處理,提高工作效率。

3) 雲式轉碼

  採用雲轉碼技術開發的音視訊檔案轉碼、實時流轉碼,實現了不同格式、位元速率、解析度、幀數等引數的自由轉換,滿足不同終端的播放需求。

4) 多終端釋出支援

  結合Wowza Media Server支援多協議多終端的特性,尚為網路視聽系統一個平臺即可支援多終端裝置的視訊訪問,無論用任何裝置都可訪問所需的視訊內容。

  在對多終端內容統一管理的基礎之上,還可實現了多終端視訊的斷點續播功能。使用者的播放在一個終端上播放暫停後