如何同时在不同的 QT 小部件上显示多个视频

Posted

技术标签:

【中文标题】如何同时在不同的 QT 小部件上显示多个视频【英文标题】:how I can display multiple videos on different QT widgets at the same time 【发布时间】:2012-02-22 13:21:44 【问题描述】:

我已经完成了一个代码,它在不同的 QWidgets 上运行不同的 OpenCV 算法..所以我有 3 个选项卡,每个选项卡都应该显示一个摄像头实时流式处理它们..我在第一个选项卡上捕获视频小部件并通过全局引用将其传递给其他选项卡...但是我遇到了这个问题

libv4l1: error setting pixformat: Device or resource busy
HIGHGUI ERROR: libv4l unable to ioctl VIDIOCSPICT

虽然我只有一个捕获..

有什么想法吗?

【问题讨论】:

这与Qt无关 【参考方案1】:

处理此问题的正确方法是复制相机检索到的帧,并将其提供给其他选项卡。 不要分享capture界面!

【讨论】:

我已经在我的代码中实现了它,这就是为什么我对错误感到困惑.. 该消息清楚地表明问题与您的相机设备有关。也许捕获代码正在执行两次?您是否在捕获帧之前或期间设置了相机的任何特定属性? 你确定吗?如果您在负责从相机检索帧的while 循环之前添加一个打印语句,您能否验证它只执行一次?【参考方案2】:

我也在使用 OpenCV 和 Qt。为了模拟相机,我使用 Capture 对象从视频文件中读取帧并通过 TCP/IP 发送它们。

为了使您的帧可用于所有其他小部件,我建议您创建一个继承自 QIODevice 的新类,初始化您的捕获设备。每次从摄像头获取新帧时,将数据保存到 QByteArray 变量中并发出 readyRead() 信号。

注意: - 你所有的小部件都必须连接到 readyRead() 信号 - 一旦你得到一个新的框架,记得清理以前的数据 - 你必须重新实现函数virtual qint64 readData( char * data, qint64 maxSize ) 才能读取你的数据

类似的东西

#include "opencv2/highgui/highgui.hpp"

using namespace cv;

class VideoCaptureDevice : public QIODevice

    Q_OBJECT

public:
    VideoCaptureDevice(QObject *parent);
    virtual ~VideoCaptureDevice();

private:
    VideoCapture            m_capture;
    QByteArray      m_receivedData;

protected:
    // from QIODevice
    qint64 writeData(const char * data, qint64 maxSize);
    qint64 readData(char * data, qint64 maxSize);

;

【讨论】:

以上是关于如何同时在不同的 QT 小部件上显示多个视频的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt 小部件中的视频顶部绘画

Qt/C++ Multimedia Player Video Clips,多个视频小部件

Qt 如何从 QVector 中的数据创建位图并将其显示在小部件上?

如何在 Qt 中实现基于 GStreamer 的视频小部件?

在 Qt5 中的多个弹出窗口小部件上接收鼠标 EnterEvent 和 LeaveEvent

在多个小部件上显示相同的 QPushButton