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

猜你喜欢

转载自blog.csdn.net/fengliang191/article/details/106322965
IPC