问题
大华摄像头(型号: DH-IPC-HDW1235C-A 2.8MM 200万高清网络摄像机 )目前支持20路连接,实际使用测试过程中,只能接入6路rtsp端口,无法满足内部64路rtsp接入测试要求。故需要找到方法,接受摄像头rtsp输入流,使用服务器进行分发,已支持最大数量的连接。
目前网上主要提供了以下几种方法来实现:
- live555;
- zlmediakit, 可以直接使用其提供的容器,但测试中始终没有正常推起流来;
- rtsp-simple-server;
- EasyDarwin
最后选择了EasyDarwin作为rtsp server端实现框架进行推流;
服务搭建
在官网.下载服务端代码,我们这里以 Linux 版本为例,下载后解压
解压并启动
tar -zxvf EasyDarwin-linux-8.1.0-1901141151.tar.gz
cd EasyDarwin-linux-8.1.0-1901141151
# 启动指令
bash start.sh
# 停止指令
# ./stop.sh
运行后会创建并启动相关服务
至此,服务启动完毕,我们可以打开 10008 端口查看推流情况
推流命令
- 使用EasyDarwin提供的拉流分发
在上图RTSP地址 填写输入源地址,在自定义路径填写输出的路径。
问题:使用这种方式拉流分发,会遇到隔一段时间断开重连的问题。查看log如下:
查看了相应代码,没有想到解决方法。
2.FFMPEG命令方式
ffmpeg -re -i "rtsp://admin:cad12345@10.2.27.251:554/cam/realmonitor?channel=1&subtype=0" -c copy -rtsp_transport tcp -f rtsp rtsp://localhost/camtest
使用此命令会花屏,并在终端出现下述error log:
[rtsp @ 0x56348c591280] max delay reached. need to consume packetspeed= 1x
[rtsp @ 0x56348c591280] RTP: missed 40 packets
[rtsp @ 0x56348c591280] max delay reached. need to consume packetspeed= 1x
[rtsp @ 0x56348c591280] RTP: missed 10 packets
[rtsp @ 0x56348c591280] max delay reached. need to consume packetspeed= 1x
[rtsp @ 0x56348c591280] RTP: missed 25 packets
[rtsp @ 0x56348c591280] max delay reached. need to consume packetspeed= 1x
[rtsp @ 0x56348c591280] RTP: missed 39 packets
frame= 7951 fps= 26 q=-1.0 Lsize=N/A time=00:05:06.60 bitrate=N/A speed= 1x
搜索问题后,发现原因是FFmpeg默认接收线程数据队列大小thread_queue_size为8,当不够快时,接收数据队列溢出,导致RTP接收数据丢包。
解决办法
使用thread_queue_size选项配置大一点的接收线程数据队列,如
ffmpeg -thread_queue_size 512 -re -i "rtsp://admin:cad12345@10.2.27.251:554/cam/realmonitor?channel=1&subtype=0" -c copy -rtsp_transport tcp -f rtsp rtsp://localhost/camtest
大华摄像头配置
相关配置如下图:
结束