标题:Qt编写网络摄像头推流(4路1080P主码流只占用0.2%CPU/极低延时极速响应)
作者:liudianwu
日期:2023-04-22 09:40
内容:
## 一、前言说明
将从网络摄像头拉流过来的视频流重新推流出去,是目前一个很常规的做法,尤其是推流到流媒体服务中心,这样流媒体服务中心就把散落在各个区域的监控摄像头集中起来统一管理,同时提供对外一致的访问接口。很多时候不仅仅是几个摄像头,很可能是几百个上千个,所以对推流程序也是一个考验,做了以后才发现这个担心有点多余,因为通网络摄像机收到的裸流基本上都是H264/H265格式的,这个裸流可以直接推给流媒体服务器,根本就不需要解码后重新编码,而整个过程最耗CPU的就是解码以及显示,推流根本不需要显示,所以就剩下解码,而如果不需要解码直接就是裸流推出去,那就极低的CPU占用了,由于不需要解码,根本就不涉及到硬解码的情况,亲测4路1080的主码流视频流重新实时推流大概只占用0.2%的CPU,基本上所有运算耗费在从网卡收到数据包部分。
除了不要占用过多的CPU资源这个要求外,一般用户还对实时性要求很高,基本上都是希望延迟控制在0.3s以内,当然网络环境要正常的情况下,如果本身中间层的各种交换机路由器有故障或者经过外网环境,延迟可能会高一些,如果在局域网环境内,那这个延迟可以做到0.3s以内,可以说几乎看不出延迟区别。通过ffmpeg采集的时候如果是直接立即收到的流推出去,然后流媒体服务器也立即转发,拉流那边也不需要做音视频同步,直接收到流就显示,这样其实是极低的延迟,几乎在0.1s左右。实时视频流一般都是按照帧率来发送一帧帧视频流图像的,所以可以不需要音视频同步,只有m3u8或者视频文件类型的才需要做音视频同步。
## 二、功能特点
### 2.1 文件推流
1. 指定网卡和监听端口,接收网络请求推送音视频等各种文件。
2. 实时统计显示每个文件对应的访问数量、总访问数量、不同IP地址访问数量。
3. 可指定多种模式,0-直接播放、1-下载播放。
4. 实时打印显示各种收发请求和应答数据。
5. 每个文件对应MD5加密的唯一标识符,用于请求地址后缀区分访问哪个文件。
6. 支持各种浏览器(谷歌chromium/微软edge/火狐firefox等)、各种播放器(vlc/mpv/ffplay/potplayer/mpchc等)打开请求。
7. 播放过程中可以任意切换播放进度,支持倍速播放。
8. 需要推流的文件名称历史记录自动存储和打开加载应用。
9. 切换文件获取访问地址,自动拷贝地址到剪切板方便直接粘贴测试使用。
10. 极低CPU占用,128路1080P同时推流不到1%CPU占用,异步发送数据机制。
11. 纯QTcpSocket通信,不依赖流媒 ..