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);