利用Nginx搭建RTMP視頻直播,點播服務器,ffmpeg推流,回看


 
 
一、環境和工具
  1. ubuntu 14.04 desktop
  • 不用server的原因是一部分的演示用到了linux視頻播放和直播軟件,自己還要裝桌面,麻煩。
  • 不建議使用 最新的16TLS,我一開始就用它來做的,但是各種坑,因為很多包都被廢棄或者必須降級
 
  1. Nginx1.8.1
  • 這個是我之前裝的版本,版本沒什么大的影響
  • 我是源代碼編譯安裝的,不建議用 apt-get install nginx
  1. nginx-rtmp-module
  1. 直播肯定用大名鼎鼎的OBS
  1. 觀看目前只是用客戶端觀看,使用的是VLC media player
 
 
二、安裝Ngnix
 
 
1、安裝各種依賴包
 
$ apt-get install openssl libssl-dev libpcre3 libpcre3-dev
 
yum install -y pcre-devel zlib-devel openssl openssl-devel
 
2、編輯安裝nginx與rtmp-module
 
nginx和nginx-rtmp-module是一起編譯安裝的。
 
編譯安裝Nginx
 
#注意nginx-rtmp-module-master的路徑
$ ./configure --add-module=../nginx-rtmp-module-master --prefix=/opt/nginx --with-http_ssl_module
$ make
$ make install
 
 
sbin/nginx --options
 
三、配置直播服務器
 
所有的配置都基於 nginx-rtmp-module 的官方文檔
 
 
因為我們這里只考慮直播,因此點播就不在記錄了。
 
關於視頻點播服務器的配置可以查看上面作者的文章:[ http://blog.csdn.net/kingroc/article/details/50839994] [9]
 
視頻點播服務器和視頻直播的不同我想不需要說明,一個實時推流,一個是也是播放視頻流,但是是基於文件進行的。點播無非是通過播放某服務器上的文件進行推流,從而能夠觀看,而直播是有專門推流客戶端進行實時推流。
 
我把我的nginx.conf的配置貼出來,需要注意的就是我監聽的是一個域名,而不是ip,因為域名我是為了在局域網使用。
  1. 我的ubuntu IP是 192.168.124.129,hosts文件將rtmp-server指向了這個ip。
  2. 同時windows的hosts文件我也改過,同樣將rtmp-server指向了192.168.124.129,這樣子好處是,很輕松在windows上進行推流和觀看
  3. rtmp上最重要的配置就是 push rtmp://rtmp-server/live;(詳細查看下面注釋)
 
#配置RTMP,這個配置格式在github的readme上有詳細說明 rtmp { server { listen 1935; #服務端口--默認 chunk_size 4096; #數據傳輸塊的大小--默認
#設置直播的application名稱是 live application live{ live on; #live on表示開啟直播模式 }
 
#設置推流的應用名稱 application push{ live on; #開啟直播 push rtmp://rtmp-server/live; #推流到上面的直播應用 } } }
如果打算弄多個頻道的直播就可以live_cctv1、live_cctv2名字任意。
 
 
#下面的server是在http的一級配置標簽下的 #上面的注釋對懂nginx的人是廢話,但是如果你不熟悉nginx,建議認真看看 http{ ...# 這里有一些其他的配置 server { listen 80; #端口 server_name rtmp-server;#設置http服務器監聽的域名 hosts中配置了 #下面兩個是加上去的,用來配置直播的http訪問 #具體的意思可以在github的文檔中查看 location /stat { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; } location /stat.xsl { #注意這里的路徑不能錯誤,直接寫絕對路徑就可以 root /usr/local/nginx-rtmp-module-master/; 也可以把這個文件復制到html目錄下,不然有可能因為權限打不開 } location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
 
 
配置完之后,需要重新啟動nginx
 
 
 
然后在瀏覽器輸入 http://rtmp-server/stat ,stat就是上面server中配置的名稱
 
如果能看到下面圖片的內容,則證明配置沒有問題,一般沒啥問題,我是一次就成功的。如果無法訪問,請關閉防火牆以及查看hosts文件等等。
 
點播配置
rtmp { #RTMP服務 server { listen 1935; #//服務端口 chunk_size 4096; #//數據傳輸塊的大小 application vod { play /opt/media/vod; #//視頻文件存放位置。 } } }
可以在上面目錄放一個文件,如 starRTC.mp4
則打開地址為 rtmp://localhost/vod/starRTC.mp4 
 
點播不使用RTMP插件nginx自身也是可以實現點播服務的。那就是配置location部分,由於下面我們要配置直播和回看功能所以選用了RTMP服務。
 
四、進行直播,推流
 
下面是在windows上進行直播,
在linux下直播和觀看當然也沒有任何的問題:
 
  1. 在linux上安裝obs直播(需要ffmpeg):http://blog.csdn.net/kingroc/article/details/50829213
  2. 在linux上使用OBS:http://blog.csdn.net/kingroc/article/details/50839994#t4
 
1、下載OBS並進行安裝
 
2、使用OBS直播
 
打開之后,在來源那里點擊加號,選擇一個來源,比如我選擇了攝像頭,
 
選擇文件可以:
 
 
3、配置串流服務
  1. 點擊【設置】
  2. 選擇【串流】
  3. 串流類型選擇【自定義流媒體服務器】
  4. URL填寫我們上面配置的push地址【rtmp://rtmp-server/push】
  5. 密鑰沒有配置,不需要填寫。
  6. 【完成】
  7. 【開始串流】
 
 
 
FFmpeg 推流
循環推流:
ffmpeg -threads 2 -re -fflags +genpts -stream_loop -1 -i /mnt/test.mp4 -c:v copy -c:a aac -f flv rtmp://172.2.8.31:1935/live/test2
 
-re : 表示使用文件的原始幀率進行讀取,因為ffmpeg讀取視頻幀的速度很快,如果不使用這個參數,ffmpeg可以在很短時間就把video.mp4中的視頻幀全部讀取完並進行推流,這樣就無法體現出視頻播放的效果了。官方文檔中對這個參數的解釋是:
-re (input)
Read input at native frame rate. Mainly used to simulate a grab device, or live input stream (e.g. when reading from a file). Should not be used with actual grab devices or live input streams (where it can cause packet loss). By default ffmpeg attempts to read the input(s) as fast as possible. This option will slow down the reading of the input(s) to the native frame rate of the input(s). It is useful for real-time output (e.g. live streaming).
 
 
ffmpeg -y -re -fflags +genpts -stream_loop -1 -probesize 1280 -i test.mp4 -c copy -f flv rtmp_url, 加黃色選項后重復播放時不會卡,會比較連貫一些。
 
 
五、觀看直播
 
服務器有沒有接收到呢?打開我的服務器地址“ http://localhost/stat”查看一下 ,
 
直播使用VLC進行觀看,其實很簡單就是填一個鏈接就OK。
  1. 打開VLC media player,
  2. 選擇【媒體】->【網絡串流】
  3. 在地址輸入:rtmp://rtmp-server/live(之前配置的live的地址)
  4. 確認后即可觀看
 
或者用: ffplay rtmp://localhost/videotest
實時回看
如果直播服務能夠把節目錄制在本地,就可以直接回看先前的節目了
rtmp配置部分:
application live { live on; hls on; #這個參數把直播服務器改造成實時回放服務器。 wait_key on; #對視頻切片進行保護,這樣就不會產生馬賽克了。 hls_path /opt/video/hls; #切片視頻文件存放位置。 hls_fragment 10s; #每個視頻切片的時長。 hls_playlist_length 60s; #總共可以回看的事件,這里設置的是1分鍾。 hls_continuous on; #連續模式。 hls_cleanup on; #對多余的切片進行刪除。 hls_nested on; #嵌套模式。 }
http部分
location /stat.xsl { root /usr/local/nginx/nginx-rtmp-module/; } location /live { #這里也是需要添加的字段。 types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } alias /opt/video/hls; expires -1; add_header Cache-Control no-cache; }
 
application myapp {
live on;
}
application hls {
live on;
hls on;
hls_path /tmp/hls;
}
 
 
由於這次nginx需要向服務器寫切片視頻文件,但nginx又沒有給nginx指定用戶名只能走默認的nobody用戶和nogroup用戶組,其實就是沒有組。所以需要對寫入的目錄做增大權限的修改。 chmod -R 777 /opt/video/hls
播放視頻,“ http://localhost/live/test/index.m3u8”。
六、問題
 
這個只是實現了推流然后能觀看,依舊有很多問題。
  1. 在windows上直播觀看延遲大約在5-10秒,如果非局域網這個速度沒法看。
  2. 現在所有人只要填寫推流地址,就能進行播放和查看,沒有權限控制,雖然rtmp本身對ip有一個策略機制可以配置,但是並沒有什么實際的用處,需要結合程序實現控制,也是后面需要實現的功能
  3. 目前還沒有考慮網頁上的觀看,網頁上考慮使用html5流媒體播放器,結合hls協議實現。
 
nginx配合ffmpeg做流媒體服務器的原理是:nginx通過rtmp模塊提供rtmp服務,ffmpeg推送一個rtmp流到nginx,然后客戶端通過訪問nginx來收看實時視頻流。HLS也是差不多的原理,只是最終客戶端是通過HTTP協議來訪問的,但是ffmpeg推送流仍然是rtmp的。
 
 
我的直播部分配置文件 只配置了rtmp和 http統計的部分,用的 rtmp://localhost/live/star就可以播放
 
nginx.conf
 


免責聲明!

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



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