首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Qt | windows视频播放器小项目

Qt | windows视频播放器小项目

原创
作者头像
Qt历险记
发布2024-10-28 22:08:12
发布2024-10-28 22:08:12
8410
举报
文章被收录于专栏:Qt6 研发工程师Qt6 研发工程师

点击上方"蓝字"关注我们

01、前言

>>>Windows平台如果播放不了视频,记得下载编解码工具:https://www.mediaplayercodecpack.com/#google_vignette media.player.codec.pack.v4.6.0.setup.exe

下载后双击安装。

02、videowidget.pro

>>>(.pro 文件)中引入 multimedia 和 multimediawidgets 模块的声明。通过添加这行代码,您可以在项目中使用 Qt 提供的多媒体相关功能,例如音频和视频播放、捕捉等。

代码语言:javascript
复制
TEMPLATE = appTARGET = videowidget​QT += multimedia multimediawidgets​HEADERS = \    videoplayer.h​SOURCES = \    main.cpp \    videoplayer.cpp​QT+=widgets​

03、videoplayer.h

>>>QMediaPlayer 是 Qt Multimedia 模块中的一个类,用于处理多媒体内容的播放,如音频和视频。使用 QMediaPlayer,您可以轻松地加载多媒体文件、控制播放、暂停、停止以及获取播放状态等。

代码语言:javascript
复制
#ifndef VIDEOPLAYER_H  // 防止重复包含头文件#define VIDEOPLAYER_H​#include <QMediaPlayer>  // 引入 QMediaPlayer 类,负责媒体播放#include <QWidget>      // 引入 QWidget 类,作为所有用户界面对象的基类​QT_BEGIN_NAMESPACE  // 开始 Qt 命名空间class QAbstractButton; // 前向声明 QAbstractButton 类class QSlider;        // 前向声明 QSlider 类class QLabel;        // 前向声明 QLabel 类class QUrl;          // 前向声明 QUrl 类QT_END_NAMESPACE    // 结束 Qt 命名空间​// 定义 VideoPlayer 类,继承自 QWidgetclass VideoPlayer : public QWidget{    Q_OBJECT  // 必须在定义 QObject 类和其子类时使用,支持信号和槽机制public:    VideoPlayer(QWidget *parent = nullptr);  // 构造函数,接受一个父级 QWidget 指针    ~VideoPlayer();                           // 析构函数​    void setUrl(const QUrl &url);  // 设置视频播放的 URL​public slots:  // 公有槽函数,供其他对象调用    void openFile();  // 打开文件    void play();      // 播放视频​private slots:  // 私有槽函数,仅用于内部使用    void mediaStateChanged(QMediaPlayer::State state);  // 媒体状态变化处理    void positionChanged(qint64 position);              // 媒体播放位置变化处理    void durationChanged(qint64 duration);              // 媒体时长变化处理    void setPosition(int position);                      // 设置播放位置    void handleError();                                  // 处理错误​private:    QMediaPlayer* m_mediaPlayer;  // 媒体播放器对象指针    QAbstractButton *m_playButton; // 播放按钮对象指针    QSlider *m_positionSlider;     // 播放进度滑块对象指针    QLabel *m_errorLabel;         // 错误信息标签对象指针};​#endif  // 结束防止重复包含头文件​

04、main.cpp

>>>QCommandLineParser 是 Qt 框架中的一个类,用于解析命令行参数。它提供了一种简便的方式来处理命令行输入,使得程序可以根据用户提供的参数来执行不同的功能。 QCommandLineOption 是 Qt 框架中的一个类,用于表示命令行参数的选项。它是 QCommandLineParser 的配合使用的一部分,允许开发者定义可用的命令行选项。

代码语言:javascript
复制
#include "videoplayer.h"  // 引入视频播放器头文件​#include <QtWidgets/QApplication>  // 引入 QApplication 类#include <QtWidgets/QDesktopWidget> // 引入 QDesktopWidget 类,用于获取桌面信息#include <QtCore/QCommandLineParser> // 引入 QCommandLineParser 类,用于解析命令行参数#include <QtCore/QCommandLineOption> // 引入 QCommandLineOption 类,表示命令行选项#include <QtCore/QDir>                // 引入 QDir 类,用于目录操作​​#include <QDebug>​// 主函数,程序的入口int main(int argc, char *argv[]){    QApplication app(argc, argv); // 创建 QApplication 对象,管理图形用户界面应用程序的控制流和主要设置​    QCoreApplication::setApplicationName("Qt历险记 视屏播放器"); // 设置应用程序名称    QCoreApplication::setOrganizationName("QtProject");           // 设置组织名称    QGuiApplication::setApplicationDisplayName(QCoreApplication::applicationName()); // 设置应用程序显示名称    QCoreApplication::setApplicationVersion(QT_VERSION_STR);      // 设置应用程序版本    QCommandLineParser parser; // 创建命令行解析器    parser.setApplicationDescription("Qt Video Widget Example"); // 设置应用程序描述    parser.addHelpOption();     // 添加帮助选项    parser.addVersionOption();  // 添加版本选项    parser.addPositionalArgument("url", QDir::toNativeSeparators("‪C:\\Users\sujieyin.BAIN\\Videos\\video(25).mp4"));     // 添加位置参数,表示要打开的 URL    parser.process(app);        // 处理命令行参数​    qDebug() << "parser.positionalArguments().constFirst() = " << parser.positionalArguments() << endl;​    VideoPlayer player;         // 创建 VideoPlayer 对象    if (!parser.positionalArguments().isEmpty()) { // 如果有位置参数        const QUrl url = QUrl::fromUserInput(parser.positionalArguments().constFirst(),                                              QDir::currentPath(), QUrl::AssumeLocalFile); // 获取 URL​        player.setUrl(url); // 设置视频播放器的 URL    }​    const QRect availableGeometry = QApplication::desktop()->availableGeometry(&player); // 获取屏幕上可用的几何矩形    player.resize(availableGeometry.width() / 6, availableGeometry.height() / 4); // 设置播放器大小    player.show(); // 显示播放器​    return app.exec(); // 进入应用程序的主事件循环}​

05、videoplayer.cpp

>>>QVideoWidget 是 Qt 框架中用于显示视频的组件。它可以与 QMediaPlayer 类一起使用,以便播放视频内容。 QUrl 是 Qt 框架中的一个类,用于处理和操作统一资源定位符(URI)。它提供了一种简单的方法来表示和解析 URL,包括处理 URL 的各个组成部分,例如协议、主机、路径和查询参数等。

代码语言:javascript
复制
#include "videoplayer.h"  // 引入自定义的视频播放器头文件​#include <QtWidgets>      // 引入Qt Widgets模块#include <QVideoWidget>   // 引入QVideoWidget类,用于视频显示​// VideoPlayer构造函数,初始化界面和播放器VideoPlayer::VideoPlayer(QWidget *parent)    : QWidget(parent)  // 调用基类构造函数{    // 创建媒体播放器对象,并指定视频输出为 QVideoSurface    m_mediaPlayer = new QMediaPlayer(this, QMediaPlayer::VideoSurface);    QVideoWidget *videoWidget = new QVideoWidget;  // 创建视频显示窗口​    // 创建“打开”按钮    QAbstractButton *openButton = new QPushButton(tr("Open..."));    // 连接按钮点击信号到打开文件槽    connect(openButton, &QAbstractButton::clicked, this, &VideoPlayer::openFile);​    // 创建播放按钮    m_playButton = new QPushButton;    m_playButton->setEnabled(false);  // 初始禁用按钮    m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));  // 设置图标为播放​    // 连接播放按钮点击信号到播放槽    connect(m_playButton, &QAbstractButton::clicked,            this, &VideoPlayer::play);​    // 创建进度滑块    m_positionSlider = new QSlider(Qt::Horizontal);    m_positionSlider->setRange(0, 0);  // 设置初始范围​    // 连接滑块移动信号到设置位置槽    connect(m_positionSlider, &QAbstractSlider::sliderMoved,            this, &VideoPlayer::setPosition);​    // 创建错误信息标签    m_errorLabel = new QLabel;    m_errorLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);  // 设置尺寸策略​    // 创建控制布局,水平布局    QBoxLayout *controlLayout = new QHBoxLayout;    controlLayout->setContentsMargins(0, 0, 0, 0);  // 设置内容边距为零    controlLayout->addWidget(openButton);  // 添加打开按钮    controlLayout->addWidget(m_playButton); // 添加播放按钮    controlLayout->addWidget(m_positionSlider); // 添加进度滑块​    // 创建主布局,垂直布局    QBoxLayout *layout = new QVBoxLayout;    layout->addWidget(videoWidget); // 添加视频窗口    layout->addLayout(controlLayout); // 添加控制组件布局    layout->addWidget(m_errorLabel); // 添加错误标签​    setLayout(layout); // 设置主布局​    // 设置媒体播放器的视频输出为videoWidget    m_mediaPlayer->setVideoOutput(videoWidget);    // 连接媒体播放器的各种状态和位置变化信号到相应的槽函数    connect(m_mediaPlayer, &QMediaPlayer::stateChanged,            this, &VideoPlayer::mediaStateChanged);    connect(m_mediaPlayer, &QMediaPlayer::positionChanged, this, &VideoPlayer::positionChanged);    connect(m_mediaPlayer, &QMediaPlayer::durationChanged, this, &VideoPlayer::durationChanged);    connect(m_mediaPlayer, QOverload<QMediaPlayer::Error>::of(&QMediaPlayer::error),            this, &VideoPlayer::handleError); // 错误处理}​// VideoPlayer析构函数VideoPlayer::~VideoPlayer(){}​// 打开文件的槽函数void VideoPlayer::openFile(){    QFileDialog fileDialog(this); // 创建文件对话框    fileDialog.setAcceptMode(QFileDialog::AcceptOpen); // 设置为打开模式    fileDialog.setWindowTitle(tr("Open Movie")); // 设置窗口标题    QStringList supportedMimeTypes = m_mediaPlayer->supportedMimeTypes(); // 获取支持的MIME类型    if (!supportedMimeTypes.isEmpty())        fileDialog.setMimeTypeFilters(supportedMimeTypes); // 设置MIME类型过滤    // 设置默认打开目录为视频目录或用户主目录    fileDialog.setDirectory(QStandardPaths::standardLocations(QStandardPaths::MoviesLocation).value(0, QDir::homePath()));    if (fileDialog.exec() == QDialog::Accepted) // 如果用户选择了文件        setUrl(fileDialog.selectedUrls().constFirst()); // 设置URL}​// 设置视频URL的函数// Windows平台如果播放不了视频,记得下载编解码工具:https://www.mediaplayercodecpack.com/#google_vignette// media.player.codec.pack.v4.6.0.setup.exevoid VideoPlayer::setUrl(const QUrl &url){    m_errorLabel->setText(QString()); // 清除错误信息    setWindowFilePath(url.isLocalFile() ? url.toLocalFile() : QString()); // 设置窗口文件路径    m_mediaPlayer->setMedia(url); // 设置媒体源    m_playButton->setEnabled(true); // 启用播放按钮}​// 播放或暂停视频的槽函数void VideoPlayer::play(){    switch (m_mediaPlayer->state()) {    case QMediaPlayer::PlayingState: // 如果当前是播放状态        m_mediaPlayer->pause(); // 则暂停        break;    default: // 否则播放        m_mediaPlayer->play();        break;    }}​// 媒体状态变化处理的槽函数void VideoPlayer::mediaStateChanged(QMediaPlayer::State state){    switch(state) {    case QMediaPlayer::PlayingState: // 如果媒体正在播放        m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause)); // 更改按钮图标为暂停        break;    default: // 其他状态        m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); // 更改按钮图标为播放        break;    }}​// 播放位置变化的槽函数void VideoPlayer::positionChanged(qint64 position){    m_positionSlider->setValue(position); // 更新滑块位置}​// 媒体时长变化的槽函数void VideoPlayer::durationChanged(qint64 duration){    m_positionSlider->setRange(0, duration); // 更新滑块范围}​// 设置媒体播放位置的槽函数void VideoPlayer::setPosition(int position){    m_mediaPlayer->setPosition(position); // 设置媒体当前播放位置}​// 错误处理的槽函数void VideoPlayer::handleError(){    m_playButton->setEnabled(false); // 禁用播放按钮    const QString errorString = m_mediaPlayer->errorString(); // 获取错误信息    QString message = "Error: ";    if (errorString.isEmpty()) // 如果错误信息为空        message += " #" + QString::number(int(m_mediaPlayer->error())); // 显示错误代码    else        message += errorString; // 显示错误信息    m_errorLabel->setText(message); // 更新错误标签显示}​

10、演示

>>>安装编解码工具后,双击安装。

点击ctrl+r 运行 目前我测试了gif和MP4,其他文件应该也可以,留给大家完成。

基于Qt MP3音频播放器示例(可制作音频播放器)

基于Qt 音乐播放器mp3(进阶)

Qt | 视频播放器(multimedia、multimediawidgets)

AI+Qt6.5.3+ubuntu20.04+FFmpeg音视频编解码(播放一个中秋节快乐视频为例)

实现音视频编解码(播放一个中秋节快乐视频为例)Qt | AI+Qt6.5.3+ubuntu20.04+FFmpeg

总结

>>>年底了家人们,赚到钱没有??? 千万别学我,一贫如洗。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 点击上方"蓝字"关注我们
  • 01、前言
  • 02、videowidget.pro
  • 03、videoplayer.h
  • 04、main.cpp
  • 05、videoplayer.cpp
  • 10、演示
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档