首页 > 其他分享 >Qt编写网络摄像头推流(4路1080P主码流只占用0.2%CPU/极低延时极速响应)

Qt编写网络摄像头推流(4路1080P主码流只占用0.2%CPU/极低延时极速响应)

时间:2023-04-22 09:55:16浏览次数:43  
标签:视频流 Qt stream rtsp 主码 0.2% 推流 CPU ffmpeg

一、前言说明

将从网络摄像头拉流过来的视频流重新推流出去,是目前一个很常规的做法,尤其是推流到流媒体服务中心,这样流媒体服务中心就把散落在各个区域的监控摄像头集中起来统一管理,同时提供对外一致的访问接口。很多时候不仅仅是几个摄像头,很可能是几百个上千个,所以对推流程序也是一个考验,做了以后才发现这个担心有点多余,因为通网络摄像机收到的裸流基本上都是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通信,不依赖流媒体服务程序,核心源码不到500行,注释详细,功能完整。
  12. 支持Qt4/Qt5/Qt6任意版本,支持任意系统(windows/linux/macos/android/嵌入式linux等)。

2.2 网络推流

  1. 支持各种本地视频文件和网络视频文件。
  2. 支持各种网络视频流,网络摄像头,协议包括rtsp、rtmp、http。
  3. 支持将本地摄像头设备推流,可指定分辨率和帧率等。
  4. 支持将本地桌面推流,可指定屏幕区域和帧率等。
  5. 自动启动流媒体服务程序,默认mediamtx(原rtsp-simple-server),可选用srs、EasyDarwin、LiveQing、ZLMediaKit等。
  6. 可实时切换预览视频文件。
  7. 推流的清晰度和质量可调。
  8. 可动态添加文件、目录、地址。
  9. 视频文件自动循环推流,如果视频源是视频流,在掉线后会自动重连。
  10. 网络视频流自动重连,重连成功自动继续推流。
  11. 网络视频流实时性极高,延迟极低,延迟时间大概在100ms左右。
  12. 推流后除了用rtmp地址访问以外,还支持直接hls/webrtc访问,可以直接浏览器打开看实时画面。
  13. 支持Qt4/Qt5/Qt6任意版本,支持任意系统(windows/linux/macos/android/嵌入式linux等)。

三、体验地址

  1. 体验地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 名称:bin_video_push
  2. 国内站点:https://gitee.com/feiyangqingyun
  3. 国际站点:https://github.com/feiyangqingyun
  4. 个人主页:https://blog.csdn.net/feiyangqingyun
  5. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/

四、各种命令

  1. rtmp推流 ffmpeg -re -stream_loop -1 -i f:/mp4/10.mp4 -c copy -f flv rtmp://192.168.0.110:6908/stream
  2. rtsp推流 ffmpeg -re -stream_loop -1 -i f:/mp4/10.mp4 -c copy -f rtsp rtsp://192.168.0.110:6907/stream
  3. 远程推流 ffmpeg -re -stream_loop -1 -i f:/mp4/11.mp4 -c copy -f flv rtmp://47.114.127.78:6908/stream
  4. 网络设备 ffmpeg -i rtsp://admin:[email protected]:554/Streaming/Channels/101 -vcodec copy -acodec copy -f flv rtmp://192.168.0.110:6908/stream
  5. 实时桌面 ffmpeg -f gdigrab -r 30 -i desktop -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f rtsp -g 5 -an rtsp://192.168.0.110:6907/stream
  6. 本地设备 ffmpeg -f dshow -i video="USB Video Device":audio="麦克风 (USB Audio Device)" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f rtsp rtsp://192.168.0.110:6907/stream
  7. 播放设备 ffplay -f dshow video="USB Video Device":audio="麦克风 (USB Audio Device)"

标签:视频流,Qt,stream,rtsp,主码,0.2%,推流,CPU,ffmpeg
From: https://www.cnblogs.com/feiyangqingyun/p/17342501.html

相关文章

  • qt编译出现“常量中有换行符”
    在qt编译过程中出现“常量中有换行符”,原因有以下几点(qt版本5.9.9)2023-04-21:1.中文编码格式问题,在qt:工具-外部-配置里选择文本编辑器-行为-默认编码选为UTF-8,UTF-8BOM选为如果编码是UTF-8则添加。2.依旧采用默认编码,在需要使用中文的地方使用QStringLiteral("text......
  • ruoyi整合mqtt
    https://www.cnblogs.com/SjhCode/p/mqtt.htmlruoyi整合mqttmqtt报错客户机未连接32104,可能是没连接上,也可能是两个客户端clientID相同,也可能是同一台机子subscribe(Topic,Qos)订阅了多次在消费时,需要对方的通道有发送测试信息,我们才能取出来消费,消费完出队。 本地测试:https......
  • QT中在使用QMediaPlaylist类的insertMedia函数插入新播放文件后,出现播放顺序错误的分
    我下面的这段代码的意图是:当前的播放队列中插入一个播放文件到队首,使其为下一个播放文件。但是并没有达到我的预期。于是在代码中加入一段调试程序,将当前的播放文件的序号打印出来。 调试之后的结果如下:发现无论向播放队列中插入几次,当前的播放序列都是1。如果想要在播放......
  • Qt 加载 libjpeg 库出现“长跳转已经运行”错误
    继上篇 Qt5.15.0升级至Qt5.15.9遇到的一些错误篇幅有点长,先说解决方法,在编译静态库时加上-qt-libjpeg,编译出libjpeg库后,在项目中使用#pragmacomment链接即可 在我以为升级到Qt5.15.9后,运行没有什么问题时,问题就来了在加载jpeg格式的图片时,出现了“长跳转已经......
  • Qt之QMake编译转换为CMake编译
    一、前言-QMake和CMake都是用来控制编译过程的构建系统,最终生成可在选择的编译器环境中使用的本机makefile和工作区。简单来说,QMake和CMake就像类似于作曲,makefile类似于乐谱,最终由编译器完成乐章的演奏。那么QMake和CMake有什么区别呢?-对于纯Qt项目,QMake更加好用。QMake与QtCr......
  • Qt5.14+CMake3.22+OpenCV4.5
    原文地址zhuanlan.zhihu.com下载链接首先需要下载对应的软件,下载链接和我选择的版本如下(仅作参考):QtIndexof/archive/qt/5.14/5.14.2,qt-opensource-windows-x86-5.14.2.exeCMakeDownload|CMake,cmake-3.23.0-windows-x86_64.msi注意x86指的是32位系统;x64指的是64位系......
  • MQTT-发布与订阅的报文
    MQTT发布订阅流程在MQTT发布/订阅模式中,一个客户端既可以是发布者,也可以是订阅者,也可以同时具备这两个身份。当客户端发布一条消息时,它会被发送到代理,然后代理将消息路由到该主题的所有订阅者。当客户端订阅一个主题时,它会收到代理转发到该主题的所有消息发布消息报文-Publish......
  • Qt使用Http协议进行通信
    原文地址blog.csdn.net原文链接在使用Qt框架进行应用开发的过程中,很多时候需要进行客户端与服务端的网络通信,这时候就需要Qt的internet模块。而网络通信中最常用的协议就是http协议,Qt对http协议的调用进行了封装,使用非常方便。这里对常用的http请求demo做一下总结,方便大家参......
  • MQTT基础介绍
    MQTT与HTTP的区别HTTP协议是客户端与服务端直连请求与响应MQTT是基于发布订阅模型的轻量级的消息传输协议MQTT能力发布:Publish订阅:Subscribe代理:Broker,管理通信执行模式:客户端发送消息到broker,broker将消息发送给订阅过的客户端MQTT通信模式一对一:点对点通信......
  • ImportError: DLL load failed while importing QtChart: 找不到指定的模块
    这个错误通常是由于您的Python环境缺少QtChart模块或QtChart模块依赖的库文件之一导致的。解决此问题的方法可能因操作系统和Python环境而异,但下面是一些常见的解决方法:检查是否已安装QtChart模块和其依赖项。您可以使用pip命令在终端中安装QtChart模块:Copycodepipinstal......