Qt视频播放器[QMediaPlayer+QVideowidget]

news/2025/1/11 1:33:51/

目录

  • 参考
  • 一、安装K-Lite 解码器
  • 二、Qt代码结构
    • VideoPlayer.pro
    • main.cpp
    • videoplayer.h 播放器
    • videoplayer.cpp 播放器
    • videoplayer.ui 播放器
    • playerslider.h 自定义进度条
    • playerslider.cpp 自定义进度条
  • 效果
  • 源码文件
  • 错误解决

参考

Qt实现视频播放器

Qt播放视频报错 DirectShowPlayerService::doRender: Unresolved error code 0x80040266

安装K-Lite 解码器

本代码在Window10下运行,利用qMediaPlayerqvideowidget实现视频文件mp4的播放,并且提供进度显示,还可以通过拖动进度条来变换播放位置

一、安装K-Lite 解码器

K-Lite 是一个万能解码器,它可以扩展播放器功能,使其能解码更多格式。

安装K-Lite 解码器

或者在官网K-Lite官网

二、Qt代码结构

在这里插入图片描述

VideoPlayer.pro

QT       += core gui
QT	+= multimedia      #使用多媒体模块
QT += multimediawidgets #使用QVideoWidget视频显示组件
greaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11 #c++17在使用emit时会出错# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \playerslider.cpp \videoplayer.cppHEADERS += \playerslider.h \videoplayer.hFORMS += \videoplayer.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += targetRESOURCES += \res.qrc

main.cpp

#include "videoplayer.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);videoplayer w;w.show();return a.exec();
}

videoplayer.h 播放器

#ifndef VIDEOPLAYER_H
#define VIDEOPLAYER_H#include <QWidget>
#include <QtMultimedia>
#include <QVideoWidget> // 视频显示组件窗口
#include"playerslider.h"QT_BEGIN_NAMESPACE
namespace Ui { class videoplayer; }
QT_END_NAMESPACE
class PlayerSlider;
class videoplayer : public QWidget
{Q_OBJECT
public:videoplayer(QWidget *parent = nullptr);~videoplayer();bool m_bReLoad;// 已经载入还没设置进度条最大值private:Ui::videoplayer *ui;QVideoWidget *m_pPlayerWidget;// 视频显示组件QMediaPlayer * m_pPlayer;//媒体播放器类public slots:void    OnSetMediaFile(void);//载入void    OnSlider(qint64); // 信号内容的位置已更改为位置,以毫秒表示,进度条也要变void    OnDurationChanged(qint64);// 信号表示内容的持续时间已更改为时长,以毫秒表示,进度条 的最大值和最小值void    OnStateChanged(QMediaPlayer::State);// Player对象的状态已经改变};
#endif // VIDEOPLAYER_H

videoplayer.cpp 播放器

#include "videoplayer.h"
#include "ui_videoplayer.h"#include <QFileDialog> //文件选择窗口
#include<QDebug>
videoplayer::videoplayer(QWidget *parent): QWidget(parent), ui(new Ui::videoplayer)
{ui->setupUi(this);setWindowTitle("播放器");setWindowIcon(QIcon(":/icon/icon.webp"));// 图标setFixedSize(800,600);//设置固定大小// 1.放置播放窗口m_pPlayer = new QMediaPlayer;//媒体播放器类m_pPlayerWidget = new QVideoWidget;// 视频显示组件窗口m_pPlayer->setVideoOutput(m_pPlayerWidget);//视频输出:设置视频输出,允许用户将视频渲染到自定义的视频输出设备上。ui->verticalLayout->addWidget(m_pPlayerWidget);//将视频显示组件窗口添加到QVBoxLayout垂直布局// 设置视频小部件是否自动填充背景。true则视频小部件将自动填充背景,以便在视频播放期间保持视觉效果。m_pPlayerWidget->setAutoFillBackground(true);// 2.界面美化QPalette qplte;// 调色板qplte.setColor(QPalette::Window, QColor(0,0,0));// 透明m_pPlayerWidget->setPalette(qplte);// 设置窗口部件的调色板// 3. 槽函数//载入connect(ui->BtnLoad, SIGNAL(clicked()), this, SLOT(OnSetMediaFile()));//播放connect(ui->BtnPlay, SIGNAL(clicked()), m_pPlayer, SLOT(play()));// 对QMediaPlayer媒体播放器操作//停止connect(ui->BtnStop, SIGNAL(clicked()), m_pPlayer, SLOT(stop()));// 对QMediaPlayer媒体播放器操作// Player对象的状态已经改变。connect(m_pPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(OnStateChanged(QMediaPlayer::State)));ui->BtnStop->setEnabled(false);// 停止:默认不可用//设置滑块行为m_bReLoad = true;ui->slider->setEnabled(false);// 进度条:默认不可用// 信号内容的位置已更改为位置,以毫秒表示,进度条也要变connect(m_pPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(OnSlider(qint64)));// 信号表示内容的持续时间已更改为时长,以毫秒表示,第一次为进度条 的最大值和最小值connect(m_pPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(OnDurationChanged(qint64)));// 进度条:鼠标移动位置;setPosition()设置当前播放的位置,实现跳转播放的功能connect(ui->slider, SIGNAL(sigProgress(qint64)), m_pPlayer, SLOT(setPosition(qint64)));}videoplayer::~videoplayer()
{delete m_pPlayer;delete m_pPlayerWidget;delete ui;
}
//载入
void videoplayer::OnSetMediaFile()
{QFileDialog dialog(this);//文件选择窗口dialog.setFileMode(QFileDialog::AnyFile);//设置文件模式(文件/文件夹):任意文件,无论是否存在QStringList fileNames;if (dialog.exec())fileNames = dialog.selectedFiles();// 存所有选择的文件if(!fileNames.empty()){qDebug()<<"文件名:"<<fileNames[0];m_pPlayer->setMedia(QUrl::fromLocalFile(fileNames[0]));// 设置媒体信息m_bReLoad = true;ui->slider->setValue(0);//进度条数字在0(开始位置)setWindowTitle(fileNames[0]);}
}
// 信号内容的位置已更改为位置,以毫秒表示,进度条也要变
void videoplayer::OnSlider(qint64 i64Pos)
{// 自定义的位置移动==setValue(i64Pos);ui->slider->setProgress(i64Pos);
}
// 信号表示内容的持续时间已更改为时长,以毫秒表示,进度条 的最大值和最小值
void videoplayer::OnDurationChanged(qint64 i64Duration)
{// 第一次i64Duration 为最大值if(i64Duration > 0 && m_bReLoad) // 最大值>0并且 已经载入还没设置进度条最大值{ui->slider->setRange(0, i64Duration);ui->minTime->setText(QString::number(0));QTime time = QTime::fromMSecsSinceStartOfDay(i64Duration);ui->maxTime->setText(time.toString("hh:mm:ss:zzz"));m_bReLoad = false;// 不能再设置进度条最大值}
}
// Player对象的状态已经改变
void videoplayer::OnStateChanged(QMediaPlayer::State enumState)
{if(QMediaPlayer::StoppedState == enumState)//停止{ui->BtnPlay->setEnabled(true);ui->BtnStop->setEnabled(false);ui->slider->setEnabled(false);}else if(QMediaPlayer::PlayingState == enumState)// 播放{ui->BtnPlay->setEnabled(false);ui->BtnStop->setEnabled(true);ui->slider->setEnabled(true);}
}

videoplayer.ui 播放器

在这里插入图片描述

playerslider.h 自定义进度条

#ifndef PLAYERSLIDER_H
#define PLAYERSLIDER_H#include <QObject>
#include <QSlider>
#include <QMouseEvent>class PlayerSlider : public QSlider
{Q_OBJECT
signals:void sigProgress(qint64 i64Pos);public:PlayerSlider(QWidget * parent = 0);bool    m_bPressed;void    setProgress(qint64);void    mousePressEvent(QMouseEvent *e)override;// 按下void    mouseMoveEvent(QMouseEvent *e)override;// 移动void    mouseReleaseEvent(QMouseEvent *e)override;// 抬起释放
};#endif // PLAYERSLIDER_H

playerslider.cpp 自定义进度条

作用:

  • 接收QMediaPlaer设置的进度信息,更新进度条;
  • 当用户操作进度条时,不再让进度条响应QMediaPlaer设置的进度信息;
  • 当用户完成对进度条的拖动后,向QMediaPlaer发送播放位置更新信息。
#include "playerslider.h"PlayerSlider::PlayerSlider(QWidget * parent) : QSlider(parent)
{m_bPressed = false;// 是否允许进度条的进度设置
}
// 进度条的进度设置
void PlayerSlider::setProgress(qint64 i64Progress)
{if(!m_bPressed)setValue(i64Progress);
}
// 按下
void PlayerSlider::mousePressEvent(QMouseEvent *e)
{m_bPressed = true;//用户操作进度条时,不再让进度条响应QMediaPlaer设置的进度信息;QSlider::mousePressEvent(e);//必须有这句,否则手动不能移动滑块
}
// 移动
void PlayerSlider::mouseMoveEvent(QMouseEvent *e)
{QSlider::mouseMoveEvent(e);//必须有这句,否则手动不能移动滑块
}
// 抬起释放
void PlayerSlider::mouseReleaseEvent(QMouseEvent *e)
{m_bPressed = false;qint64 i64Pos = (qint64)value();emit sigProgress(i64Pos);// 发出位置改变信号QSlider::mouseReleaseEvent(e);//必须有这句,否则手动不能移动滑块
}

效果

  • 启动
    在这里插入图片描述

  • 播放
    在这里插入图片描述

源码文件

有道云:QT视频播放器

错误解决

  • 报错
error: undefined reference to `PlayerSlider::sigProgress(long long)'
debug/playerslider.o: In function `PlayerSlider::mouseReleaseEvent(QMouseEvent*)':....
.....VideoPlayer/playerslider.cpp:29: undefined reference to `PlayerSlider::sigProgress(long long)'
  • 解决
    在这里插入图片描述

VideoPlayer.pro文件
CONFIG += c++17改为CONFIG += c++11


http://www.ppmy.cn/news/498271.html

相关文章

视频播放器基础知识

1.视频播放器原理 播放一个视频文件的流程如下&#xff1a; 2.常用播放器 1&#xff09; 跨平台系列&#xff08;非DirectShow框架&#xff09; VLC&#xff0c; Mplayer&#xff0c; ffplay…… 2&#xff09; Windows系列&#xff08;DirectShow框架&#xff09; 完美解码&am…

android视频播放器api,03.视频播放器Api说明

03.视频播放器Api说明 目录介绍01.最简单的播放 02.如何切换视频内核 03.切换视频模式 04.切换视频清晰度 05.视频播放监听 06.列表中播放处理 07.悬浮窗口播放 08.其他重要功能Api 09.播放多个视频 10.VideoPlayer相关Api 11.Controller相关Api 12.边播放边缓存api 13.类似抖音…

阿里云视频播放器

文章目录 视频播放器介绍实战引入脚本文件和 css 文件初始化视频播放器播放地址播放播放凭证播放&#xff08;推荐&#xff09; test代码 总结&#xff1a; 视频播放器介绍 阿里云的视频播放器类比 HTML5视频播放标签video和音频播放标签audio标签 只是阿里云视频播放器是针对…

java 调用本地播放器_Java调用本地播放器播放视频文件

java调用本地播放器播放视频文件. 呼叫本地播放器无法播放指定文件的描述. public class OpenExe extends HttpServlet { //打开本地播放器并播放视频 public static void openExe(String file) { Runtime rn Runtime.getRuntime(); Process p null; try { p rn.exec("…

java视频播放器制作_java创建简易视频播放器

java创建简易视频播放器 发布时间:2020-09-23 04:28:09 来源:脚本之家 阅读:98 作者:南柯一梦xihe 最近有个多媒体的作业,要求使用visualC++和OpenCV编写一个简易的视频播放器,对于C/C++残疾者而言是不可能的,于是萌生了用Java编写的想法。具体经验分享一下。 目标:制作…

Android VideoView 视频播放器 仿抖音

前言 最近项目有个需求 , 做个类似抖音的视频效果. 又因为包大小的问题不使用第三方SDK,所以使用原生的VideoView开发了一下, 搭配RecyclerView和PageSnapHelper来实现抖音的效果. 全部代码: github 看一下实现流程: 首先创建了一个继承自ConstraintLayout的View,用来实现自己…

最简单的基于DirectShow的示例:视频播放器自定义版

最简单的基于DirectShow的示例文章列表&#xff1a; 最简单的基于DirectShow的示例&#xff1a;视频播放器 最简单的基于DirectShow的示例&#xff1a;视频播放器图形界面版 最简单的基于DirectShow的示例&#xff1a;视频播放器自定义版 最简单的基于DirectShow的示例&…

<C++> C++11 新的类功能

C11 新的类功能 1.默认成员函数 原来C类中&#xff0c;有6个默认成员函数&#xff1a; 构造函数析构函数拷贝构造函数拷贝赋值重载取地址重载const取地址重载 最后重要的是前4个&#xff0c;后两个用处不大。默认成员函数就是我们不写编译器会生成一个默认的。 C11 新增了两…