IPC出來的碼流都是RTP碼流,可能是裸的H264,也可能是PS流。如果要推流的話,有2種方案可以選擇
1.直接解析出h264幀數據,然後封裝成RTMP協議進行推流。
2.利用ffmpeg實現,ffmpeg拉流通過av_read_frame得到h264幀,然後將264幀封裝成RTMP的tag進行推流。
前者實現有一定工作量,需要自己解析264,封裝成RTMP包。該方案代碼自研,可控可擴展,穩定有保障。而後者利用ffmpeg實現起來快,但IPC碼流不規範,特別是PS流,各廠家並不一定嚴格按PS協議封裝,可能加有自己的私有字段,以至於ffmpeg處理兼容性有問題,造成代碼風險不可控,除非對ffmpeg有非常熟練的駕馭能力,能進行二次開發,否則不建議使用ffmpeg來對PS流解封和封裝。本文在此僅僅用ffmpeg推流來測試RTMP服務器,後續會正式方案會用上代碼實現該功能
對於RTMP服務器,業界商用的FMS,穩定可控不用多說,但需要付費,對於中小企業望而卻步。好在開源方案有crtmpd,gstreammer,nginx-rtmp-moudle,srs等方案,前二者比較簡單,適合在嵌入式場景使用,後二者適應高併發的服務器場景,而SRS採用協程模式,單進程支持9000路併發,nginx-rtmp單進程支持3000路,但支持多進程擴展,至於二者優劣很難評說。基於SRS文檔資料比較齊全,上手容易,筆者選擇SRS爲選型方案。
SRS下載地址:https://github.com/ossrs/srs,關於編譯和部署非常簡單。進入trunk目錄,編譯命令:
./configure && make
運行部署:
./objs/srs -c conf/test.conf
部署的參數配置在conf文件定義,根據不同應用場景,修改conf文件,以配置SRS服務器不同的參數。
下面講解我的conf文件相關參數
# no-daemon and write log to console config for srs.
# @see full.conf for detail config.
listen 8085; #RTMP服務的端口
max_connections 1000; #最大併發連接數
daemon on; #是否以守護進程啓動,ON代表守護進程,OFF代表控制檯進程
srs_log_tank file; #日誌存儲方式,file以文件形式存儲,console 打印到控制檯
srs_log_file ./log/test.log ;#日誌存儲路徑和文件名
reports {
# for api-server report
url http://101.132.144.122:8085/blackjack/dealer; #支持事件上報URL,SRS可能需要將服務器一些狀態參數,告警狀態上報給另一臺監控服務器
}
http_api { #內置http rest服務,可以爲控監控服務器提供狀態查詢等restful服務
enabled on;
listen 8083;
crossdomain on;
}
http_server { #內置web服務器,可以提供http 服務或者HLS服務,或者其他通用的httpd服務
enabled on;
listen 8084;
dir ./objs/nginx/html;
}
vhost __defaultVhost__ { #rtmp 服務配置
http_remux { #提供http+flv直播服務
enabled on;
mount [vhost]/[app]/[stream].flv;
hstrs on;
}
gop_cache on;
queue_length 10;
min_latency on;
mr {
enabled off;
}
mw_latency 100;
tcp_nodelay on;
}
啓動後,會在./log/test.log產生日誌記錄,可以根據日誌查看服務器啓動情況
1.客戶端推流。本文爲了測試RTMP服務器,採用ffmpeg的RTSP爲推流客戶端。如何獲取到RTSP,就需要onvif 協議去搜索了。這就用我到我們onvif 小工具了。https://blog.csdn.net/fengliang191/article/details/106032868
搜索到的rtsp地址爲:rtsp://192.168.0.7:554/cam/realmonitorchannel=1&subtype=1&unicast=true&proto=Onvif
因爲我們SRS服務器是部署在xxx公司的雲服務器上,當時購買帶寬只有1M,我們選擇道子通道的352*288分辨率碼流,不過不影響我們開發,因爲我們測試是流程。
推流命令如下:
ffmpeg.exe -i rtsp://usrname:[email protected]:554/cam/realmonitor?channel=1^&subtype=1^&unicast=true^&proto=Onvif -vcodec copy -fflags +genpts -video_track_timescale 15360 -avoid_negative_ts make_zero -f flv rtmp://xxx.xxx.xxx.xxx:8085/live/192168000007005540100
因爲服務器部署在公網雲主機上,由於雲主機安全機制,我們使用8085作爲推流rtmp端口。流的名稱採用IP+端口+序列號組合編碼,該編碼方案爲了在服務器能跟蹤是哪個IPC過來的碼流。
2.SRS服務器。
客戶端推流後,我們可以通過http的restful接口查看服務器流的各種狀態。
查看服務器會話狀態http://xxx.xxx.xxx:8083/api/v1/status
查看服務器狀態
由服務器狀態知,該服務器有一路會話,該會話的IPC對應的IP地址爲:192.168.0.7,端口號爲554,流ID爲192168000007005540100,目前active 處於true,即推流狀態。
查看服務器各路流的URL
http://xxx.xxx.xxx.xxx:8083/api/v1/url
查看各路流的URL
查看某一路流的URL
http://xxx.xxx.xxx.xxx::8083/api/v1/url/流的ID
查看某一流的URL
當然服務器有可以通過http實時上報狀態,上報服務器在reports的url中定義。SRS除了支持基本RTMP串流以外,還支持HLS,HTTP,集羣,防盜鏈,監控上報,監控查詢,轉碼等。
3.RTMP播放
客戶端我們使用web的flash播放效果如下:
web端adode flash播放rtmp
我們在web端使用jwplayer播放
web端使用jwplayer播放rtmp
Android移動播放
移動端播放效果
更多更詳細資源請關注公衆號:AV_Chat