首页| 论坛| 消息

标题:Qt视音频推流/监控推流/自动重连推流/推流同时保存录像文件到本地/网页打开webrtc预览
作者:liudianwu
日期:2025-07-20 09:01
内容:

## 一、前言说明
随着推流组件的用户数越来越多,各种现场需求也不断增加,其中一个需求是能够自动重连推流,现场的监控设备成百上千,指不定哪个就离线了,不管是断电了还是断网了,或者设备坏了,都可能造成离线,而推流组件这边加载了几百路的监控摄像头在推流,最开始并没有考虑离线的情况,一旦离线后,就不会再推流,需要手动单击重新推流,这个实际现场肯定是不行的,必须能够自己处理重连推流,离线后要去释放相关的资源,不断的尝试重新连接打开摄像头,一旦打开成功,发送打开成功信号,然后在这个信号槽中去开启推流,实验下来效果非常好。
另一个常用需求是推流的同时保存录像文件到本地,每一路都是一边推流一边保存,其中保存的策略可以按照多少分钟一个文件来,比如1分钟30分钟一个文件,也可以按照整点时间来存,比如第一个文件是00:10:20s到00:30:00s,第二个文件就是00:30:00s到01:00:00s,这样方便录像文件检索,除了首尾文件可能不是30分钟一个,其他都是30分钟正对时间点的。在之前推流基础上直接复用收到的数据保存到文件即可,而不是重新打开流地址再去保存,这样可以大大节约带宽和资源。
自动重连推流功能好了,一边推流一边录制文件也好了,然后就是两者结合后,遇到个bug,运行崩溃,最后查到是重连后,没有去关闭释放这个同步保存到本地的线程,造成野指针了,应该是采集线程关闭后,对应的推流和保存线程都需要关闭,一旦采集线程正常了,再去重新推流和保存,改好后测试完美。关闭线程一般先是stop,然后deleteLater,最后=NULL,而且最好加个锁,防止保存定时器那边判断失误。

## 二、效果图

## 三、相关代码
```cpp
#include "netpushclient.h"
#include "ffmpegthread.h"
#include "ffmpegsave.h"
#include "videohelper.h"
#include "osdgraph.h"
bool NetPushClient::checkB = false;
bool NetPushClient::recordInteger = false;
int NetPushClient::recordDuration = 0;
int NetPushClient::encodeVideo = 0;
float NetPushClient::encodeVideoRatio = 1;
QString NetPushClient::encodeVideoScale = "1";
NetPushClient::NetPushClient(QObject *parent) : QObject(parent)
{
ffmpegThread = NULL;
ffmpegSave = NULL;
//定时器控制多久 ..

回复 发表
主题 版块