QT显示视频-QVideoWidget

6 篇文章 0 订阅
3 篇文章 2 订阅

QT显示视频QVideoWidget

Header:
#include <QVideoWidget>
qmake:
QT += multimediawidgets
Inherits:
QWidget and QMediaBindableInterface

AVframe pFrameRGB的data 实际指向rgbBuffer 其中存储的是YUV或RGB数据 可将rgbBuffer绑定到QImage

//ffmpeg 分配frame结构体
pFrameRGB = av_frame_alloc();
//获取视频帧的实际占用空间大小
    rgbNumBytes = av_image_get_buffer_size(AV_PIX_FMT_BGR24, dec_ctx->width, dec_ctx->height, 1);
  //分配视频帧存储空间
    rgbBuffer = (unsigned char*)av_malloc(rgbNumBytes);
   //data 帧存储空间 linesize数组 保存YUV三分量的起始地址
    ret = av_image_fill_arrays(pFrameRGB->data, pFrameRGB->linesize, rgbBuffer,
        AV_PIX_FMT_BGR24, dec_ctx->width, dec_ctx->height, 1);

image = std::make_shared<QImage>((uchar*)rgbBuffer, dec_ctx->width, dec_ctx->height, QImage::Format_RGB32);
//rgbBuffer为ffmpeg 与AVFrame 绑定的内存 将qImage 绑定到实际的帧存储地址
QVideoWidget* frame = new QVideoWidget();
// 缩放成和窗口一样的大小
QImage img = media->image->scaled(frame->width(), frame->height(), Qt::KeepAspectRatio, Qt::FastTransformation);
            QVideoSurfaceFormat format(img.size(), QVideoFrame::Format_RGB32);
            frame->videoSurface()->start(format);
            //显示视频帧
            frame->videoSurface()->present(img);
Qt中,你可以通过QVideoWidget和OpenCV库结合,实现在应用程序中显示从摄像头捕获的视频流。以下是步骤: 1. **添加依赖**:首先确保你的Qt项目已经安装了Qt Video Framework(QtAV),如果没有,需要将其作为外部依赖或者在Qt Creator的项目设置中配置。 2. **初始化摄像头**:使用OpenCV库的`cv::VideoCapture`来打开摄像头设备,例如 `cv::VideoCapture cap(0);`,其中0通常代表默认摄像头。 3. **创建QVideoFrame**:每次从摄像头获取到一帧图像后,你需要将其转换成Qt的`QVideoFrame`。这可以通过`QImage`,然后转换为`QVideoFrame`,如下面的示例: ```cpp cv::Mat frame; cap.read(frame); if (frame.empty()) { qDebug() << "Failed to capture frame"; } else { QImage img(frame.data, frame.cols, frame.rows, QImage::Format_RGB888); img = img.rgbSwapped(); // OpenCV默认BGR, Qt需要RGB QVideoFrame videoFrame = qMakeVideoFrame(img); // 设置编码器为YUV420P,因为QVideoWidget支持此格式 if (!videoFrame.setPixelFormat(QVideoFrame::Format_YUV420P)) { qWarning() << "Failed to set pixel format"; } } ``` 4. **显示视频**:将`QVideoFrame`发送给`QVideoWidget`进行显示: ```cpp auto result = widget->lock(); if (result) { result->append(videoFrame); widget->unlockAndDisplay(); } else { qDebug() << "Failed to append frame"; } ``` 这里`widget`是你的`QVideoWidget`实例。 5. **循环处理**:将上述代码放在一个无限循环中,持续更新显示窗口。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值