初墨墨 2023-08-03 17:48 采纳率: 11.1%
浏览 5
已结题

qt中关于rtsp视频流的问题

目前上位机软件做了一个程序,其中使用QOpenglwidget控件用来接收视频帧,形成视频;
使用ffmpeg库进行解码,现在的问题是:
上位机软件不关闭,一直处于运行状态,当设备关闭时,就不显示视频;当设备上电后,视频在连接上,显示视频图像。
就是断网重连的意思。
请各位大lao赐教。视频部分单独开了一个线程,ffmpeg解码也是一个线程,其他代码可以si我,抱拳了!

void videothread::open(const QString &url)      //打开rtsp视频流
{
    if(!this->isRunning())
    {
        m_url = url;
        emit this->start();
    }
}
void videothread::run()
{
    bool ret = Ffmpeg->open("rtsp://192.168.0.10/test0.264");
    if(ret)
    {
        m_play = true;
        emit playState(play);
    }else
    {
        qWarning() << "打开失败!";
    }
    while (m_play)
    {
        // 暂停
        while (m_pause)
        {
            sleepMsec(200);
        }
        QImage image = Ffmpeg->read();  // 读取视频图像
        if(!image.isNull())
        {
            emit updateImage(image.copy());
        }else{
            if(Ffmpeg->isEnd())// 当前读取到无效图像时判断是否读取完成
            {
                break;
            }else {
                sleepMsec(1);// 这里不能使用QThread::msleep()延时,否则会很不稳定
            }
        }
    }
    qDebug() << "播放结束!";
    Ffmpeg->close();
    emit playState(end);
    emit isturnoff(true);
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-03 18:22
    关注

    【以下回答由 GPT 生成】

    要实现自动断网重连的功能,你可以按照以下步骤进行操作:

    1. 创建一个 QTimer 对象 reconnectTimer,用于定时检测网络连接状态并重连。
    QTimer *reconnectTimer = new QTimer(this);
    
    1. open 函数中启动 reconnectTimer
    void videothread::open(const QString &url)
    {
        if(!this->isRunning())
        {
            m_url = url;
            emit this->start();
            reconnectTimer->start(1000);  // 每秒检测一次连接状态
        }
    }
    
    1. reconnectTimertimeout 信号绑定一个槽函数,用于检测连接状态并进行重连。
    connect(reconnectTimer, &QTimer::timeout, this, &videothread::reconnect);
    
    1. 编写 reconnect 槽函数来尝试重新连接设备。
    void videothread::reconnect()
    {
        bool isConnected = // 检测网络连接状态的方法,可使用Qt的网络模块或者其他第三方库
        if(!isConnected)
        {
            // 尝试重连设备
            Ffmpeg->close();
            bool ret = Ffmpeg->open(m_url);
            if(ret)
            {
                m_play = true;
                emit playState(play);
            }
            else
            {
                qWarning() << "重连失败!";
            }
        }
    }
    
    1. videothread::run 中处理断网情况,以及在重新连接后重新显示视频图像。
    void videothread::run()
    {
        bool ret = Ffmpeg->open("rtsp://192.168.0.10/test0.264");
        if(ret)
        {
            m_play = true;
            emit playState(play);
        }
        else
        {
            qWarning() << "打开失败!";
        }
    
        while (m_play)
        {
            // 暂停
            while (m_pause)
            {
                sleepMsec(200);
            }
    
            QImage image = Ffmpeg->read();  // 读取视频图像
    
            if(!image.isNull())
            {
                emit updateImage(image.copy());
            }
            else
            {
                if(Ffmpeg->isEnd()) // 当前读取到无效图像时判断是否读取完成
                {
                    break;
                }
                else
                {
                    sleepMsec(1); // 这里不能使用QThread::msleep()延时,否则会很不稳定
                }
            }
    
            if(!Ffmpeg->isConnected()) // 判断是否断网
            {
                m_play = false; // 断网时停止播放
                reconnect(); // 断网后尝试重新连接
            }
        }
    
        qDebug() << "播放结束!";
        Ffmpeg->close();
        emit playState(end);
        emit isturnoff(true);
    }
    

    这样,当网络断开时,这段代码就会尝试断网重连,并且重新显示视频图像。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月4日
  • 创建了问题 8月3日

悬赏问题

  • ¥25 LT码在高斯信道下的误码率仿真
  • ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作
  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
  • ¥15 数字图像的降噪滤波增强
  • ¥15 心碎了,为啥我的神经网络训练的时候第二个批次反向传播会报错呀,第一个批次都没有问题
  • ¥15 MSR2680-XS路由器频繁卡顿问题
  • ¥15 VB6可以成功读取的文件,用C#读不了