IPC 移動端或web端接入方案的RTMP實踐

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章