服務(wù)器端
開源的rtmp服務(wù)器在網(wǎng)上主要有這樣幾種:crtmpserver,nginx-rtmp-module,Red5,F(xiàn)luorineFx等。
crtmpserver
在ubuntu下,獲取軟件自然先從apt-get開始。
$ sudo apt-get install crtmpserver
使用apt-get方式安裝的crtmpserver默認(rèn)配置在/etc/crtmpserver目錄下。此時,這個服務(wù)器已經(jīng)可以運(yùn)行。
apt-get所下載下來的長時間運(yùn)行的程序基本上會在/etc/init.d下有一個接受start, stop, restart等命令的腳本,而crtmpserver也不例外。所以,直接使用該腳本啟動服務(wù)器即可。
$ sudo /etc/init.d/crtmpserver start
* Starting c++ RTMP Server crtmpserver [ OK ]
但為了確保服務(wù)器的運(yùn)行符合我們的預(yù)期,需要檢查一下配置文件。通過查看 /etc/init.d/crtmpserver 腳本,可以看到默認(rèn)配置文件為 /etc/crtmpserver/crtmpserver.lua。
再通過查看配置文件,最終定位到applications目錄下的appselector.lua文件。文件內(nèi)容如下
application =
{
......
default = true,
acceptors =
{
{
ip = "0.0.0.0",
prot = 1935,
protocol = "inboundRtmp"
}
......
}
}
以上配置文件說明,該applications為默認(rèn)app,接受所有的連接請求,同時,綁定本機(jī)所有ip上的1935端口,協(xié)議為Rtmp協(xié)議。該配置滿足我們的要求。
至此,一個支持rtmp協(xié)議的服務(wù)器已經(jīng)搭建完畢。
Nginx
Nginx也包括在在ubuntu下的包管理器中,但是,從服務(wù)器下載的是已經(jīng)編譯好的Nginx。而Nginx添加模塊的方式需要重新編譯,此時,我們需要自己編譯Nginx。
編譯步驟也很簡單,按照rtmp-module Github頁面上的流程進(jìn)行即可。
$ cd /path/to/nginx_source_code
$ ./configure --add-module=/path/to/nginx-rtmp-module
$ make
$ make install
make install之后,Nginx被安裝到了/usr/local/nginx目錄下,通過編輯./conf/nginx.conf配置文件,即可使用rtmp模塊。
......
rtmp {
server {
listen 1935;
chunk_size 4096;
application live{
live on;
record off;
}
}
}
如上的配置表示這是一個rtmp模塊,監(jiān)聽端口1935,直播模式為開,并且不記錄為文件。該application接受型為rtmp://xx.xx.xx.xx:1935/live/xxxx的地址。
配置完成后使用命令打開服務(wù)器,即可開始使用Nginx服務(wù)器。
$ /usr/local/nginx/sbin/nginx -t
客戶端
當(dāng)然,口說無憑,服務(wù)器能否使用自然需要一些方式來驗證。由于rtmp協(xié)議有著三方的共同參與:服務(wù)器、推流和拉流。所以,為驗證服務(wù)器的可用性需要構(gòu)建出一個推流端以及至少一個拉流端進(jìn)行驗證。
拉流
獲取總是比創(chuàng)造容易。視頻直播流的獲取也比發(fā)送方便很多。
推薦使用VLC與SRS播放器。VLC在ubuntu下可以由apt-get獲取。
推流
推流的工具有很多,常見的有圖形化的OBS以及命令行下的FFmpeg。
OBS
該軟件被用于各大視頻網(wǎng)站的直播中,支持?jǐn)z像頭捕獲、屏幕分享等各種常用功能。
最簡單的獲取方式依然是apt-get包管理器。
$ sudo add-apt-repository ppa:obsproject/obs-studio
$ sudo apt-get update && sudo apt-get install obs-studio
下載完畢之后,需要進(jìn)行配置后才可使用。首先,在 File/Settings 選項卡中,選擇Stream配置項。將Stream Type改為Custom Streaming Server。而后url填寫crtmpserver的端口地址即可。

此時,OBS會將流量發(fā)送至rtmp://127.0.0.1:1935/livd/test這個地址,而拉流也是通過這個地址。

FFmpeg
我們的應(yīng)用的需求并沒有涉及到復(fù)雜的視頻處理,而僅僅只是捕獲攝像頭數(shù)據(jù)并按照rtmp格式傳輸即可。同時,并不是每一個客戶端均支持圖形化配置運(yùn)行界面,所以,可能需要一個新的選擇。
而FFmpeg作為一個老牌的多媒體編解碼框架,同時也提供了發(fā)送流媒體的能力,與我們的需求吻合。
$ ls /dev/video*
/dev/video0
$ ffmpeg -f v4l2 -list_formats all -i /dev/video0
[video4linux2,v4l2 @ 0x2074920] Raw : yuyv422 : YUV 4:2:2 (YUYV) : 640x480 352x288 320x240 176x144 160x120 1280x720 640x480
[video4linux2,v4l2 @ 0x2074920] Compressed: mjpeg : MJPEG : 640x480 352x288 320x240 176x144 160x120 1280x720 640x480
/dev/video0: Immediate exit requested
$ ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -f flv rtmp://127.0.0.1:1935/live/test
以上命令獲取了當(dāng)前電腦的視頻設(shè)備,并通過ffmpeg查看了具體的攝像機(jī)細(xì)節(jié)。最后一條命令則是開始向地址rtmp://127.0.0.1:1935/live/test進(jìn)行推流。
當(dāng)然,ffmpeg也可以使用文件作為流輸入。
$ ffmpeg -i 這個殺手不太冷.rmvb -f flv rtmp://127.0.0.1:1935/live/test

一些問題
在實(shí)踐過程中,可能會發(fā)生FFmpeg與crtmpserver不兼容的問題,例如說
[rtmp @ 0x18aa360] Server error: Specified stream not found in call to releaseStream
[rtmp @ 0x18aa360] Sending publish command for 'test2'
[rtmp @ 0x18aa360] Server error: call to function _checkbw failed
或者
HandShake: client signature does not match!
此時可以試著使用
ffmpeg ... ... -f flv -metadata streanName="test" tcp://localhost:6666
來嘗試解決。此時6666端口使用的是crtmpserver所帶的application文件flvplayback.lua。而原來所使用的1935端口是在appselector.lua中定義。
同時,還可以修改上述兩個配置文件中的validateHandshake字段為false放行未匹配的客戶端。但是,就我本人實(shí)驗而言,沒有特別大效果。
最終項目使用以下命令成功在樹莓派上實(shí)現(xiàn)攝像頭推流。
raspivid -t -1 -w 960 -h 540 -fps 25 -b 500000 -vf -o - | ffmpeg -i - -vcodec copy -an -r 25 -f flv -metadata streamName=test tcp://remote_server_ip:6666
參考資料
- crtmpserver流媒體服務(wù)器的介紹與搭建
- crtmpserver配置文件分析
- Nginx rtmp協(xié)議的流媒體服務(wù)器
- nginx+nginx-rtmp-module+ffmpeg搭建流媒體服務(wù)器
- ubuntu下安裝nginx + nginx-rtmp-module
- Github: nginx-rtmp-module
- 斗魚游戲直播教程-OBS直播軟件篇
- FFMpeg處理RTMP流的總結(jié)
- FFMPEG 攝像頭 命令行參數(shù) 錄像 直播 rtmp
- FFmpeg wiki: Capture / Webcam
- FFmpeg wiki: StreamingGuide
- Streaming Raspberry Pi Camera H264 into HTML over RTMP