赞
踩
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:password@192.168.0.7: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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。