效果图:

方法一:QMediaPlayer+QVideoWidget (如果其他格式视频播放不出来,安装一个视频解码器可以解决)

#include "QMutPlayer.h"
#include "ui_QMutPlayer.h"
#include<QFileDialog>
#include<QDebug>QMutPlayer::QMutPlayer(QWidget *parent) :QWidget(parent),ui(new Ui::QMutPlayer)
{ui->setupUi(this);mVideoPlayer = new QMediaPlayer(this);mSurfacePlayer = new QMediaPlayer(this);mVideoWidget  = new QVideoWidget(ui->lab_videowidget);mVideoPlayer->setVideoOutput(mVideoWidget);
}QMutPlayer::~QMutPlayer()
{delete ui;
}void QMutPlayer::on_btn_select_video_clicked()
{QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),"", tr("video (*.mp4 *.wav *.avi)"));if(fileName.isEmpty())return;mVideoPlayer->setMedia(QUrl(fileName));mVideoPlayer->play();}void QMutPlayer::showEvent(QShowEvent *event)
{Q_UNUSED(event)mVideoWidget->resize(ui->lab_videowidget->size());
}

方法二:QMediaPlayer+ QAbstractVideoSurface 提取视频帧

然后将视频帧转化为QImage,用QML 和QLabel 加载,或者QWidget 的paintEvent 绘画出来

//提取视频帧#ifndef VIDEOSURFACE_H
#define VIDEOSURFACE_H#include <QObject>
#include<QAbstractVideoSurface>class VideoSurface : public QAbstractVideoSurface
{Q_OBJECT
public:explicit VideoSurface(QObject *parent = 0);
signals:void showImage(QImage img);protected:bool present(const QVideoFrame &frame);QList<QVideoFrame::PixelFormat> supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const;
};#endif // VIDEOSURFACE_H#include "VideoSurface.h"
#include<QPixmap>
VideoSurface::VideoSurface(QObject *parent) : QAbstractVideoSurface(parent)
{}QList<QVideoFrame::PixelFormat> VideoSurface::supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const
{Q_UNUSED(handleType);QList<QVideoFrame::PixelFormat> listPixelFormats;listPixelFormats << QVideoFrame::Format_RGB32<< QVideoFrame::Format_BGR32;return listPixelFormats;}bool VideoSurface::present(const QVideoFrame &frame){if (frame.isValid()){QVideoFrame cloneFrame(frame);cloneFrame.map(QAbstractVideoBuffer::ReadOnly);QImage recvImage(cloneFrame.bits(), cloneFrame.width(), cloneFrame.height(), QVideoFrame::imageFormatFromPixelFormat(cloneFrame.pixelFormat()));cloneFrame.unmap();emit showImage(recvImage);return true;}return false;}//调用mSurfacePlayer = new QMediaPlayer(this);mVideoSurface = new VideoSurface(this);mSurfacePlayer->setVideoOutput(mVideoSurface);connect(mVideoSurface,SIGNAL(showImage(QImage)),SLOT(onShowImage(QImage)));
/QML 刷新图片 需要用到QQuickImageProvider #ifndef IMAGEPROVIDER_H
#define IMAGEPROVIDER_H#include <QQuickImageProvider>
class ImageProvider : public QQuickImageProvider
{public:explicit ImageProvider();
public:void addImage(QImage &image);QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize);QImage  requestImage(const QString &id, QSize *size, const QSize &requestedSize);private:QImage mImage;};#endif // IMAGEPROVIDER_H#include "ImageProvider.h"ImageProvider::ImageProvider(): QQuickImageProvider(QQuickImageProvider::Image)
{}void ImageProvider::addImage(QImage &image)
{mImage = image;
}QPixmap ImageProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize)
{return QPixmap::fromImage(mImage);
}QImage ImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
{return mImage;
}#ifndef SHOWIMAGE_H
#define SHOWIMAGE_H#include <QObject>
#include"ImageProvider.h"class ShowImage : public QObject
{Q_OBJECT
public:static ShowImage *instance();~ShowImage();ImageProvider *m_pImgProvider;void setImage(QImage image);signals:void callQmlRefeshImg();
private:ShowImage(QObject *parent = 0);static ShowImage *mShowImage;
};#endif // SHOWIMAGE_H#include "ShowImage.h"ShowImage* ShowImage::mShowImage = NULL;ShowImage:: ShowImage(QObject *parent) : QObject(parent)
{m_pImgProvider = new ImageProvider();
}ShowImage *ShowImage::instance()
{if(mShowImage == NULL)mShowImage = new ShowImage;return mShowImage;
}ShowImage::~ShowImage()
{delete m_pImgProvider;
}void ShowImage::setImage(QImage image)
{m_pImgProvider->addImage(image);emit callQmlRefeshImg();
}#ifndef QMLLOADWIDGET_H
#define QMLLOADWIDGET_H#include <QWidget>
#include<QQuickWidget>class QmlLoadWidget : public QQuickWidget
{Q_OBJECT
public:explicit QmlLoadWidget(QWidget *parent = 0);
signals:void errMessage(QString msg);
public slots:void addImage(QImage image);void getErr(QQuickWindow::SceneGraphError error, const QString &message);};#endif // QMLLOADWIDGET_H#include "QmlLoadWidget.h"
#include<QQmlEngine>
#include<QQmlContext>
#include"ShowImage.h"QmlLoadWidget::QmlLoadWidget(QWidget *parent) : QQuickWidget(parent)
{this->resize(parent->size());setResizeMode(QQuickWidget::SizeRootObjectToView);rootContext()->setContextProperty("CodeImage",ShowImage::instance());engine()->addImageProvider("CodeImg",ShowImage::instance()->m_pImgProvider);setSource(QUrl("qrc:/QmlRender/LoadVideImage.qml"));}void QmlLoadWidget::addImage(QImage image)
{ShowImage::instance()->setImage(image);
}void QmlLoadWidget::getErr(QQuickWindow::SceneGraphError error, const QString &message)
{emit errMessage(message);
}

完整代码下载地址:https://download.csdn.net/download/xzpblog/10960022

Qt应用程序开发五:QMediaPlayer播放视频,提取视频帧,多窗口播放同一视频相关推荐

  1. 银河麒麟桌面操作系统 V10 SP1下Qt应用程序开发环境配置

    Kylin V10 SP1软件源中提供的Qt框架版本为5.12.8,qmake对应版本为3.1,Qt Creator对应版本为4.11.0. 一.下载软件包 1.1 安装Qt组件 执行命令来进行Qt组 ...

  2. 关于Qt客户端程序开发的一些思考

    最近一直忙于新项目Qt客户端程序的开发工作,对于整个项目开发中的一些坑点做一些总结,余惟愿诸友远避之. 1.关于UI界面开发.我的建议是,能用贴图就贴图.尽管我们知道Qt提供了"强大&quo ...

  3. QT应用程序开发到Android

    Qt最大的优势就是跨平台,一次性开发的Qt应用程序,可以跑Windows.跑Linux.跑MAC--如今移动平台Android操作系统如此火爆,Qt当然不能放过对android的支持,对了,还有iph ...

  4. 小程序开发-用牛刀云从零玩转-杨朦-专题视频课程

    小程序开发-用牛刀云从零玩转-496人已学习 课程介绍         1.讲师从事专业培训10余年,知识丰富,基础扎实,讲课有条理,清晰易懂: 2.课程将从小程序基础知识的介绍开始,手把手带着大家开 ...

  5. Python为视频设置遮罩实现异形窗口播放

    推荐图书:<Python程序设计基础(第2版)>,ISBN:9787302490562,董付国,清华大学出版社,2020年1月第15次印刷 图书详情: 配套资源:用书教师可以免费获取教学大 ...

  6. 360浏览器怎么设置html5播放,360浏览器如何开启小窗口播放网页视频

    有时候使用浏览器的时候不会只做一件事,很多时候,网游和看视频是可以同时进行的,那么要如何将视频小窗口播放呢,今天小编就为大家分享一个方法,让用户在玩网游的同事还可以使用小窗口播放视频,在生活娱乐的时候 ...

  7. b站网页版没有html播放,网页b站能小窗口播放吗?怎么播放?最新版本bilibili小窗口播放器...

    喜欢玩B站的小伙伴们估计很多的时候都是被B站的丰富的视频的资源所吸引,一旦有想看的视频或者其他视频内容,都会找B站进行视频搜索,特别是一些B站up主的忠实粉丝更是每天都是关注up主的最新动态,观看去上 ...

  8. FFmpeg将视频提取成帧

    首先cd到ffmpeg的bin目录下, D:\Research direction\data set\ffmpeg\ffmpeg-4.4-essentials_build\bin> #将视频提取 ...

  9. 基于VTKITK的Qt应用程序开发

    关于VTK与Qt整合的程序示例,我们在博文(点击这里查看)里面已经讲得相当详细了.总而言之,言而总之,不外乎先写CMakeLists.txt脚本,然后用CMake Configure,再Generat ...

最新文章

  1. 使用SDL打造游戏世界之入门篇 - 1
  2. SAP的会计凭证类别
  3. PHPMySQL——防止SQL注入-代码片段
  4. python时间序列分析航空旅人_python时间序列分析
  5. QT 动态创建对象(第一种方法)
  6. vue 混入对象_特性和混入不是面向对象的
  7. frame框架 超链接
  8. 大疆云台如何使用华为mate20pro_华为Mate30+大疆灵眸Osmo3,让你的照片和短视频称霸朋友圈...
  9. python selenium系列(六)实战技巧之弹框处理
  10. python length从哪个包引入_python collections包
  11. MyBatis入门学习(一)
  12. 系统学习机器学习之线性判别式(二)
  13. python cprofile_Python Profilers 分析器
  14. 不愧是最好用的 pdf 阅读器~
  15. 【PADS】用PADS画PCB
  16. 展开操作符:一家人就这么被拆散了
  17. DaoCloud Enterprise 5.0社区版永久免费!支持免费下载使用、学习和测试,体验企业级云原生底座的性能
  18. 其实装修也是工程管理
  19. Zeal 面向开发者的离线文档查看工具
  20. 用java编写数组最小公倍数_java求多个数字的最小公倍数

热门文章

  1. 靖西市民族高中2021年高考成绩查询,重磅!广西靖西民族高中2019年高考喜报
  2. ios 对应 iphone_如何锁定iPhone相机的曝光并专注于iOS
  3. 高级软件工程作业2-1
  4. camunda_01_documents
  5. 阿里领导:手下两个应届生,一个踏实喜欢加班,一个技术强挑活,怎么选?...
  6. 30岁男人和24岁女人的对话
  7. 高通WLAN框架学习(29)-- 6GHz 概述
  8. 微信公众号用户认证机制升级方案
  9. Logistic回归模型及损失函数和成本函数
  10. springboot手机号校验