Qt项目实战:基于QMediaPlayer开发视频播放器
创作时间:
作者:
@小白创作中心
Qt项目实战:基于QMediaPlayer开发视频播放器
引用
1
来源
1.
https://www.cnblogs.com/ybqjymy/p/18020952
本文基于Qt 5.12版本,介绍了如何使用QMediaPlayer开发一个简单的视频播放器。文章详细讲解了从项目配置到代码实现的全过程,并展示了如何在界面上添加QVideoWidget控件以及如何创建右键菜单。需要注意的是,Qt的最新版本已经更新到Qt 6.x,因此在实际开发中可能需要根据具体版本对代码进行适当调整。
QMediaPlayer开发视频播放器
Q: 我们为何不使用QMediaPlayer?
A:QMediaPlayer支持的编解码库太少;QMediaPlayer在Windows中解码调用的是DirectShow,在Linux中调用的是GStreamer;相对Windows而言GStreamer扩展编解码库比较方便,但是Windows中的DirectShow太老了,Demuxer Decoder都比较麻烦。
QtMultimediaDemo 这个例子为老师编写的基于QMediaPlayer的播放器,它可以播放MPEG-4编码方式的视频。
使用QMediaPlayer搭建最简单的播放器
step1: pro文件添加内容
QT += core gui multimedia multimediawidgets
step2: 框架
step3: 测试代码
#include "widget.h"
#include <QApplication>
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 创建一个MediaPlayer
QMediaPlayer *player = new QMediaPlayer;
// 创建一个播放器窗口(Widget),用于显示MediaPlayer
QVideoWidget *vw = new QVideoWidget;
// 将player绑定到显示的窗口上
player->setVideoOutput(vw);
// 打开播放器的位置
player->setSource(QUrl::fromLocalFile("G:/video_test/video-h265.mkv"));
vw->setGeometry(100,100,640,480);
vw->show();
// Widget w;
// w.show();
return a.exec();
}
如何添加不是“非基本图形控件”的派生类
需求:需要在界面上直接拖一个 QVideoWidget,由于基本控件中没有QVideoWidget,所以需要想想办法
新建提升的类
因为QVideoWidget本身就继承于QWidget,所以这里选择QWidget作为基类
控件进行提升
成功播放视频
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QMenu>
#include <QFileDialog>
#include <QFile>
#include <QDir>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
protected:
virtual void contextMenuEvent(QContextMenuEvent *event);
private:
void createRightPopActions();
private slots:
void openLocalVideoSlot();
void openUrlVideoSlot();
private:
Ui::Widget *ui;
QMenu *popMenu; //右键弹出式菜单
QAction *openLocalAction; //打开本地文件
QAction *openUrlAction; //打开网络文件
QAction *fullScreenAction; //全屏显示
QAction *normalScreenAction; //普通显示
QAction *quitAction; //退出
QMediaPlayer *player;
//QVideoWidget* vw; //不需要了,界面上已经拖了一个QVideoWidget进去了
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget),
player(new QMediaPlayer) //创建一个MediaPlayer
{
ui->setupUi(this);
createRightPopActions();
player->setVideoOutput(ui->av_widget); //把player绑定到显示窗口上
}
/* 右键弹出 Menu & Action */
void Widget::createRightPopActions()
{
popMenu = new QMenu(this);
popMenu->setStyleSheet("background-color: rgb(100, 100, 100);");
openLocalAction = new QAction(this);
openLocalAction->setText(QString("打开本地文件"));
openUrlAction = new QAction(this);
openUrlAction->setText(QString("打开本地文件"));
fullScreenAction = new QAction(this);
fullScreenAction->setText(QString("全屏"));
normalScreenAction = new QAction(this);
normalScreenAction->setText(QString("普通"));
quitAction = new QAction(this);
quitAction->setText(QString("退出"));
connect(openLocalAction, SIGNAL(triggered(bool)), this, SLOT(openLocalVideoSlot()));
connect(openUrlAction, SIGNAL(triggered(bool)), this, SLOT(openUrlVideoSlot()));
connect(fullScreenAction, &QAction::triggered, this, &Widget::showFullScreen);
connect(normalScreenAction, &QAction::triggered, this, &Widget::showNormal);
connect(quitAction, &QAction::triggered, this, &Widget::close);
}
void Widget::openLocalVideoSlot()
{
QString file = QFileDialog::getOpenFileName(this, tr("Open file"),
QDir::homePath(),
tr("Multimedia files(*)"));
if (file.isEmpty())
return;
player->setSource(QUrl::fromLocalFile(file)); //设置需要打开的媒体文件
player->play();
}
void Widget::openUrlVideoSlot()
{
}
/*右键菜单接口*/
void Widget::contextMenuEvent(QContextMenuEvent *event)
{
Q_UNUSED(event); //未使用不警告
popMenu->clear();
popMenu->addAction(openLocalAction);
popMenu->addAction(openUrlAction);
popMenu->addAction(fullScreenAction);
popMenu->addAction(normalScreenAction);
popMenu->addAction(quitAction);
popMenu->exec(QCursor::pos());//QAction *exec(const QPoint &pos, QAction *at = Q_NULLPTR);
}
Widget::~Widget()
{
delete ui;
}
无边框的视屏
布局器边框都设置为zero,设置widget的背景颜色为666
热门推荐
瑶池:从神话传说走向现实的自然瑰宝
曼城砸2亿欧元引进6强援 坐稳欧洲转会金主宝座
盐酸纳洛酮:抵消可能致命的阿片类药物过量
战双帕弥什莉莉丝介绍 战双帕弥什莉莉丝怎么样
最美好的时光永远是青春,推荐几本青春爱情小说
八字身旺/身强、身弱哪种命好?身旺身弱有什么区别?
桥本香菜:中日文化交流的"双生中华娘"
世界上最高的活火山:奥霍斯-德尔萨拉多山
英超联赛:利物浦主场2-0击败阿斯顿维拉,萨拉赫、努内兹建功
家里养什么鱼好?家里养鱼几条最好?
史上最轻铝罐、7倍保质期延长、一次性香料棒......起底日本包装大奖TOP作品
爱情的化学效应:解析大脑中的"爱情鸡尾酒"
病例分析|胸痛伴ST段抬高就一定是心梗吗?这个病因 一周后公布诊断结果和治疗
液压油粘度测量方法与表示方式详解
欧盟CE认证指南:定义、模式与申请流程详解
如何有效运用量比指标进行分析?这些量比指标的应用有哪些限制条件?
重塑海域、海岸、海港优势 向“海洋经济强县”挺进
钾肥巨头董事长被留置 百亿亚钾国际何去何从?
5种RS485电路 自动切换方向的方法、优劣势对比
电影经济不止票房
有一种生不如死,叫“反流性食管炎”,4种方法给它“治”得服服帖帖
折现回收期是什么
贷款卡分期还款方案:定义、种类及还款途径全解析
怎样格式化硬盘?四种硬盘格式化方法(含详细图文步骤)
重庆四天三夜旅游攻略:从景点到美食的全方位体验
射频开关:从原理到应用,揭秘无线通信核心组件的神奇奥秘
出版合同中的版权归属与利益分配:作者必知的那些“坑”
宝宝感冒宜吃什么食物
上海科学家提出多靶点多功效药物设计新方法
厨师以后的前景怎么样?厨师行业有前途吗?厨师的未来前景大揭秘!你想知道的都在这里