Qt实现一个简单的视频播放器

目录

[1 工程配置](#1 工程配置)

[1.1 创建新工程](#1.1 创建新工程)

[1.2 ui界面配置](#1.2 ui界面配置)

[1.3 .pro配置](#1.3 .pro配置)

[2 代码](#2 代码)

[2.1 main.c代码](#2.1 main.c代码)

[2.2 widget.c](#2.2 widget.c)

[2.3 widget.h](#2.3 widget.h)


本文主要记述了如何使用Qt编写一个简单的视频播放器,整个示例采用Qt自带组件就可以完成。可以实现视频的播放和暂停等功能。

1 工程配置

1.1 创建新工程

如下步骤,创建一个名为13-video_player_demo的工程文件,选择基于QWidget就可以,带上ui文件。

1.2 ui界面配置

界面就有四个组件:垂直布局、三个按钮

1.3 .pro配置

在.pro文件内加入:

cpp 复制代码
multimedia multimediawidgets

即:

cpp 复制代码
QT       += core gui multimedia multimediawidgets

2 代码

2.1 main.c代码

cpp 复制代码
#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

2.2 widget.c

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QFileInfo>
#include <QFileDialog>
#include <QDir>
#include <QMessageBox>
#include <QVBoxLayout>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 创建实例化对象
    player = new QMediaPlayer(this);       
    videoplayer = new QVideoWidget(this);
    // 将videoplayer添加到verticalLayout里面,不然将单独开个页面
    ui->verticalLayout->addWidget(videoplayer);
    // 将videoplayer设置为player的输出
    player->setVideoOutput(videoplayer);
    // 当视频状态发送变化时触发
    connect(player, SIGNAL(stateChanged(QMediaPlayer::State)), SLOT(OnStateChange(QMediaPlayer::State)));
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_btn_Import_clicked()
{

    QString strCurrentPath = QDir::homePath();
    QString stdDlgTitle = "请选择视频文件";
    QString strFilter = "MP4 File(*.mp4);;All File(*.*)";
    QString strAllFiles = QFileDialog::getOpenFileName(this, stdDlgTitle,
                                                       strCurrentPath,strFilter);
    if(strAllFiles.isEmpty()) {
        QMessageBox::information(this,"错误","打开视频文件失败,请重新检查",QMessageBox::Yes|QMessageBox::No);
        return;
    }

    QFileInfo fileInfos(strAllFiles);
    qDebug() << "File info: " << fileInfos.fileName() << ", path: " << fileInfos.filePath();

    player->setMedia(QUrl::fromLocalFile(strAllFiles));
    player->play();  // 播放
}

void Widget::on_btn_play_clicked()
{
    player->play();  // 播放
}

void Widget::on_btn_pause_clicked()
{
    player->pause();  // 停止播放
}

void Widget::OnStateChange(QMediaPlayer::State state)
{
    qDebug() << "state change";
    //播放器状态变化
    bool isPlaying = (state==QMediaPlayer::PlayingState);
    ui->btn_play->setEnabled(!isPlaying);
    ui->btn_pause->setEnabled(isPlaying);
}

2.3 widget.h

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QVideoWidget>
#include <QMediaPlayer>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    QVideoWidget    *videoplayer;
    QMediaPlayer    *player;

private slots:
    void on_btn_Import_clicked();

    void on_btn_play_clicked();

    void on_btn_pause_clicked();

    void OnStateChange(QMediaPlayer::State state);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

3 注意

1 有时候需要在Linux系统上下载想要的视频软件

2 直接从windows上拉个文件到Linux上,可能由于编码原因不能播放

可以在Linux上录一段视频

可以进行转码

相关推荐
ShineWinsu40 分钟前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
吴名氏.1 小时前
Java转AI Agent教程(第十二周)检索与切分
java·开发语言·人工智能·ai·ai agent
瑞雪兆丰年兮2 小时前
JavaWeb-day10-SpringBootWeb案例
java·开发语言·javaweb·web
Elastic 中国社区官方博客2 小时前
更少的位数,相同的召回率:DiskBBQ 更保守的自动校准扫描
大数据·运维·开发语言·人工智能·elasticsearch·搜索引擎
三雷科技2 小时前
第6章第4节:自定义分词器
开发语言·c#
Adellle3 小时前
设计模式指南 (Java 版) ㊁
java·开发语言·设计模式
Delightrs3 小时前
Rust LeetCode238 算法题解
开发语言·算法·rust
云上工程笔记4 小时前
SRT字幕一键转手绘动画:srt-whiteboard-animation的复刻实录
大数据·开发语言·javascript·人工智能·机器学习
zhanghaha13144 小时前
C# 系列教程_12 字符串 string 保姆级系统教程(面向新手,大量示例 + 原理讲解)
开发语言·数据库·c#
eggwyw4 小时前
PHP8.5怎么用ffmpeg提取视频里的字幕轨道
开发语言·php