基于Qt实现视频播放器功能

目录

  • 一、功能介绍
  • 二、代码
  • 三、运行

一、功能介绍 基于Qt实现视频播放器功能
文章图片

能实现视频播放

二、代码 mainwindow.h
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include #include #include #include #include #include #include #include #include #include #include /* 媒体信息结构体 */struct MediaObjectInfo {QString fileName; // 用于保存视频文件名QString filePath; // 用于保存视频文件路径}; class MainWindow : public QMainWindow{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr); ~MainWindow(); /* 属性 */private:QMediaPlayer *videoPlayer; // 媒体播放器,用于播放视频QMediaPlaylist *mediaPlaylist; // 媒体列表QVideoWidget *videoWidget; // 视频显示窗口QListWidget *videoListWidget; // 视频列表QSlider *playProgressScrollBar; // 播放进度条QSlider *volumeScrollBar; // 音量条QPushButton *pushButton[5]; // 视频播放器按钮QHBoxLayout *hBoxLayout[3]; // 水平布局QWidget *hWidget[3]; // 水平容器QLabel *label[2]; // 标签文本QWidget *vWidget[2]; // 垂直容器QVBoxLayout *vBoxLayout[2]; // 垂直布局/* 函数 */public:void initWidget(); // 初始化窗口void mediaPlayerInit(); // 媒体播放初始化void scanVideoFiles(); // 扫描本地视频文件/* 槽函数 */public slots:void SltBtnPlayClicked(); // 播放点击void SltBtnNextClicked(); // 下一首点击void SltBtnVolumeDownClicked(); // 声音加点击void SltBtnVolumeUpClicked(); // 声音减点击void SltBtnFullScreenClicked(); // 全屏点击void SltVideoListWidgetCliked(QListWidgetItem*); // 视频列表点击void SltMediaPlaylistCurrentIndexChanged(int); // 媒体当前项改变void SltMediaPlayerStateChanged(QMediaPlayer::State); // 媒体播放状态改变void SltMediaPlayerDurationChanged(qint64); // 媒体时长发生变化void SltMediaPlayerPositionChanged(qint64); // 媒体当前播放时间发生变化void SltPlayProgressScrollBarReleased(); // 播放进度条void SltVolumeScrollBarReleased(); // 音量进度条void resizeEvent(QResizeEvent *event); }; #endif // MAINWINDOW_H

mainwindow.cpp
#include "mainwindow.h"#include #include QString videoFilePath = "/home/luatao/qt/videoplayer/myVideo"; MainWindow::MainWindow(QWidget *parent): QMainWindow(parent){initWidget(); // 初始化窗口mediaPlayerInit(); // 媒体播放初始化scanVideoFiles(); // 扫描本地视频/* 按钮连接信号槽 */connect(pushButton[0], SIGNAL(clicked()), this, SLOT(SltBtnPlayClicked())); // 播放connect(pushButton[1], SIGNAL(clicked()),this, SLOT(SltBtnNextClicked())); // 下一首connect(pushButton[2], SIGNAL(clicked()), this, SLOT(SltBtnVolumeDownClicked())); // 声音减connect(pushButton[3], SIGNAL(clicked()), this, SLOT(SltBtnVolumeUpClicked())); // 声音加connect(pushButton[4], SIGNAL(clicked()),this, SLOT(SltBtnFullScreenClicked())); // 全屏/* 列表连接信号槽 */connect(videoListWidget, SIGNAL(itemClicked(QListWidgetItem*)),this, SLOT(SltVideoListWidgetCliked(QListWidgetItem*))); /* 媒体连接信号槽 */connect(mediaPlaylist,SIGNAL(currentIndexChanged(int)),this,SLOT(SltMediaPlaylistCurrentIndexChanged(int))); connect(videoPlayer,SIGNAL(stateChanged(QMediaPlayer::State)),this,SLOT(SltMediaPlayerStateChanged(QMediaPlayer::State))); connect(videoPlayer, SIGNAL(durationChanged(qint64)),this,SLOT(SltMediaPlayerDurationChanged(qint64))); connect(videoPlayer,SIGNAL(positionChanged(qint64)), this,SLOT(SltMediaPlayerPositionChanged(qint64))); /* 滚动条连接*/connect(playProgressScrollBar, SIGNAL(sliderReleased()), this, SLOT(SltPlayProgressScrollBarReleased())); connect(volumeScrollBar, SIGNAL(sliderReleased()),this, SLOT(SltVolumeScrollBarReleased())); }MainWindow::~MainWindow(){}/** * @brief Widget::initWidget * 初始化窗口 */void MainWindow::initWidget(){this->setGeometry(0, 0, 800, 480); QPalette pal; pal.setColor(QPalette::WindowText, Qt::white); // 设置窗口文字为白色/* 构造对象 */for (int i = 0; i < 3; i++) {/* 水平容器 */hWidget[i] = new QWidget(); hWidget[i]->setAutoFillBackground(true); /* 水平布局 */hBoxLayout[i] = new QHBoxLayout(); }for (int i = 0; i < 2; i++) {/* 垂直容器 */vWidget[i] = new QWidget(); vWidget[i]->setAutoFillBackground(true); /* 垂直布局 */vBoxLayout[i] = new QVBoxLayout(); }/* 标签 */for (int i = 0; i < 2; i++) {label[i] = new QLabel(); }/* 按键 */for (int i = 0; i < 5; i++) {pushButton[i] = new QPushButton(); pushButton[i]->setMaximumSize(44, 44); pushButton[i]->setMinimumSize(44, 44); }/* 设置按钮的属性 */pushButton[0]->setCheckable(true); // 播放pushButton[4]->setCheckable(true); // 全屏/* 设置样式名*/vWidget[0]->setObjectName("vWidget0"); vWidget[1]->setObjectName("vWidget1"); hWidget[1]->setObjectName("hWidget1"); hWidget[2]->setObjectName("hWidget2"); pushButton[0]->setObjectName("btn_play"); pushButton[1]->setObjectName("btn_next"); pushButton[2]->setObjectName("btn_volumedown"); pushButton[3]->setObjectName("btn_volumeup"); pushButton[4]->setObjectName("btn_screen"); QFont font; font.setPixelSize(18); // 字体大小label[0]->setFont(font); label[1]->setFont(font); pal.setColor(QPalette::WindowText, Qt::white); label[0]->setPalette(pal); label[1]->setPalette(pal); label[0]->setText("00:00"); // 播放时间显示label[1]->setText("/00:00"); /* 播放进度条 */playProgressScrollBar = new QSlider(Qt::Horizontal); // 水平方向playProgressScrollBar->setMaximumHeight(15); playProgressScrollBar->setObjectName("durationSlider"); /* 声音滚动条 */volumeScrollBar = new QSlider(Qt::Horizontal); volumeScrollBar->setRange(0, 100); volumeScrollBar->setMaximumWidth(80); volumeScrollBar->setObjectName("volumeSlider"); volumeScrollBar->setValue(50); // 中间值/* 视频列表 */videoListWidget = new QListWidget(); videoListWidget->setObjectName("listWidget"); videoListWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 隐藏垂直滚动条videoListWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 隐藏水平滚动条/* 视频窗口 */videoWidget = new QVideoWidget(); videoWidget->setStyleSheet("border-image: none; " "background: transparent; ""border:none"); videoWidget->setMinimumSize(500, 480); // 视频窗口大小/* 下面是界面布局 *//* H0 布局 */vWidget[0]->setMinimumSize(300, 480); vWidget[0]->setMaximumWidth(300); hBoxLayout[0]->addWidget(videoWidget); // 视频窗口 左边hBoxLayout[0]->addWidget(vWidget[0]); // 右边 垂直窗口hWidget[0]->setLayout(hBoxLayout[0]); hBoxLayout[0]->setContentsMargins(0, 0, 0, 0); setCentralWidget(hWidget[0]); // 只有Qmainwindow才能创建中心布局Qwidget不行/* V0 布局 */QSpacerItem *vSpacer0 = new QSpacerItem(0, 80,QSizePolicy::Minimum,QSizePolicy::Maximum); vBoxLayout[0]->addWidget(videoListWidget); // 添加视频列表vBoxLayout[0]->addSpacerItem(vSpacer0); vBoxLayout[0]->setContentsMargins(0, 0, 0, 0); vWidget[0]->setLayout(vBoxLayout[0]); /* V1 布局 *//* 底板部件布局 */hWidget[1]->setMaximumHeight(15); hWidget[2]->setMinimumHeight(65); vBoxLayout[1]->addWidget(hWidget[1]); vBoxLayout[1]->addWidget(hWidget[2]); vBoxLayout[1]->setAlignment(Qt::AlignCenter); vWidget[1]->setLayout(vBoxLayout[1]); vWidget[1]->setParent(this); vWidget[1]->setGeometry(0, this->height() - 80, this->width(), 80); vBoxLayout[1]->setContentsMargins(0, 0, 0, 0); /* 位于最上层 */vWidget[1]->raise(); /* H1 布局 */hBoxLayout[1]->addWidget(playProgressScrollBar); // 播放进度条hBoxLayout[1]->setContentsMargins(0, 0, 0, 0); hWidget[1]->setLayout(hBoxLayout[1]); /* H2 布局 */QSpacerItem *hSpacer0 = new QSpacerItem(300, 80,QSizePolicy::Expanding,QSizePolicy::Maximum); hBoxLayout[2]->addSpacing(20); hBoxLayout[2]->addWidget(pushButton[0]); hBoxLayout[2]->addSpacing(10); hBoxLayout[2]->addWidget(pushButton[1]); hBoxLayout[2]->addSpacing(10); hBoxLayout[2]->addWidget(pushButton[2]); hBoxLayout[2]->addWidget(volumeScrollBar); hBoxLayout[2]->addWidget(pushButton[3]); hBoxLayout[2]->addWidget(label[0]); hBoxLayout[2]->addWidget(label[1]); hBoxLayout[2]->addSpacerItem(hSpacer0); hBoxLayout[2]->addWidget(pushButton[4]); hBoxLayout[2]->addSpacing(20); hBoxLayout[2]->setContentsMargins(0, 0, 0, 0); hBoxLayout[2]->setAlignment(Qt::AlignLeft | Qt::AlignTop); hWidget[2]->setLayout(hBoxLayout[2]); }/** * @brief MainWindow::mediaPlayerInit * 媒体初始化 */void MainWindow::mediaPlayerInit(){videoPlayer = new QMediaPlayer(this); mediaPlaylist = new QMediaPlaylist(this); // 播放列表mediaPlaylist->clear(); videoPlayer->setPlaylist(mediaPlaylist); videoPlayer->setVideoOutput(videoWidget); // 设置视频输出窗口mediaPlaylist->setPlaybackMode(QMediaPlaylist::Loop); // 设置播放模式,Loop 是列循环videoPlayer->setVolume(50); // 设置默认软件音量为 50%}/** * @brief MainWindow::scanVideoFiles * 扫描视频文件 */void MainWindow::scanVideoFiles(){//QDir dir(QCoreApplication::applicationDirPath()+ "/myVideo"); QDir dir(videoFilePath); // 视频文件路径QDir dirbsolutePath(dir.absolutePath()); // 绝对路径//qDebug() << dirbsolutePath << endl; if (dirbsolutePath.exists()) { // 如果目录存在QStringList filter; // 定义过滤器/* 包含所有 xx 后缀的文件 */filter << "*.mp4" << "*.mkv" << "*.wmv" << "*.avi"; /* 获取该目录下的所有文件 */QFileInfoList files = dirbsolutePath.entryInfoList(filter, QDir::Files); for (int i = 0; i < files.count(); i++) {MediaObjectInfo info; /* 使用 utf-8 编码 */info.fileName = QString::fromUtf8(files.at(i).fileName().toUtf8().data()); info.filePath = QString::fromUtf8(files.at(i).filePath().toUtf8().data()); /* 媒体列表添加视频 */if (mediaPlaylist->addMedia(QUrl::fromLocalFile(info.filePath))) {/* 添加到容器数组里储存 *///mediaObjectInfo.append(info); /* 添加视频名字至列表 */videoListWidget->addItem(info.fileName); } else {qDebug()<errorString().toUtf8().data()<< endl; qDebug()<< " Error number:"<< mediaPlaylist->error()<< endl; }}}else{qDebug()<< "目录不存在 "<< endl; }}/** * @brief MainWindow::SltBtnPlayClicked * 播放点击 */void MainWindow::SltBtnPlayClicked(){int state = videoPlayer->state(); // 获取播放的状态switch (state) {case QMediaPlayer::StoppedState:/* 媒体播放 */videoPlayer->play(); break; case QMediaPlayer::PlayingState:/* 媒体暂停 */videoPlayer->pause(); break; case QMediaPlayer::PausedState:videoPlayer->play(); break; }}/** * @brief MainWindow::SltBtnNextClicked * 下一首点击 */void MainWindow::SltBtnNextClicked(){videoPlayer->stop(); // 停止播放int count = mediaPlaylist->mediaCount(); // 获取播放列表的视频个数if (0 == count)return; /* 列表下一个 */mediaPlaylist->next(); videoPlayer->play(); }/** * @brief MainWindow::SltBtnVolumeDownClicked * 声音减点击 */void MainWindow::SltBtnVolumeDownClicked(){/* 点击每次音量-5 */volumeScrollBar->setValue(volumeScrollBar->value() - 5); videoPlayer->setVolume(volumeScrollBar->value()); }/** * @brief MainWindow::SltBtnVolumeUpClicked * 声音加点击 */void MainWindow::SltBtnVolumeUpClicked(){/* 点击每次音量+5 */volumeScrollBar->setValue(volumeScrollBar->value() + 5); videoPlayer->setVolume(volumeScrollBar->value()); }/** * @brief MainWindow::SltBtnFullScreenClicked * 全屏点击 */void MainWindow::SltBtnFullScreenClicked(){/* 全屏/非全屏操作 */vWidget[0]->setVisible(!pushButton[4]->isChecked()); }/** * @brief MainWindow::SltVideoListWidgetCliked * 视频列表点击 * @param item */void MainWindow::SltVideoListWidgetCliked(QListWidgetItem *item){videoPlayer->stop(); mediaPlaylist->setCurrentIndex(videoListWidget->row(item)); // 选中点击的项videoPlayer->play(); }/** * @brief MainWindow::SltMediaPlaylistCurrentIndexChanged * 媒体当前项发生改变 选中播放列表 * @param index */void MainWindow::SltMediaPlaylistCurrentIndexChanged(int index){if (-1 == index)return; /* 设置列表正在播放的项 */videoListWidget->setCurrentRow(index); }/** * @brief MainWindow::SltMediaPlayerStateChanged * 媒体播放状态发生改变 * @param state */void MainWindow::SltMediaPlayerStateChanged(QMediaPlayer::State state){switch (state) {case QMediaPlayer::StoppedState:pushButton[0]->setChecked(false); break; case QMediaPlayer::PlayingState:pushButton[0]->setChecked(true); break; case QMediaPlayer::PausedState:pushButton[0]->setChecked(false); break; }}/** * @brief MainWindow::SltMediaPlayerDurationChanged * 媒体播放时长发生变化 * @param duration */void MainWindow::SltMediaPlayerDurationChanged(qint64 duration){playProgressScrollBar->setRange(0, duration / 1000); // 设置播放进度条的范围int second = duration / 1000; int minute = second / 60; second %= 60; QString mediaDuration; mediaDuration.clear(); if (minute >= 10)mediaDuration = QString::number(minute, 10); elsemediaDuration = "0" + QString::number(minute, 10); if (second >= 10)mediaDuration = mediaDuration + ":" + QString::number(second, 10); elsemediaDuration = mediaDuration + ":0" + QString::number(second, 10); /* 显示媒体总长度时间 */label[1]->setText("/" + mediaDuration); }/** * @brief MainWindow::SltMediaPlayerPositionChanged * 媒体当前播放时间发生变化 * @param position */void MainWindow::SltMediaPlayerPositionChanged(qint64 position){if (!playProgressScrollBar->isSliderDown()) // 进度条没有按下playProgressScrollBar->setValue(position / 1000); int second = position / 1000; int minute = second / 60; second %= 60; QString mediaPosition; mediaPosition.clear(); if (minute >= 10)mediaPosition = QString::number(minute, 10); elsemediaPosition = "0" + QString::number(minute, 10); if (second >= 10)mediaPosition = mediaPosition + ":" + QString::number(second, 10); elsemediaPosition = mediaPosition + ":0" + QString::number(second, 10); /* 显示现在播放的时间 */label[0]->setText(mediaPosition); }/** * @brief MainWindow::SltPlayProgressScrollBarReleased * 播放进度条释放 */void MainWindow::SltPlayProgressScrollBarReleased(){/* 设置媒体播放的位置 */videoPlayer->setPosition(playProgressScrollBar->value() * 1000); }/** * @brief MainWindow::SltVolumeScrollBarReleased * 音量进度条释放 */void MainWindow::SltVolumeScrollBarReleased(){/* 设置音量 */videoPlayer->setVolume(volumeScrollBar->value()); }/** * @brief MainWindow::resizeEvent * 重绘窗口 * @param event */void MainWindow::resizeEvent(QResizeEvent *event){Q_UNUSED(event); vWidget[1]->setGeometry(0, this->height() - 80, this->width(), 80); }

main.cpp
#include "mainwindow.h"#include #include int main(int argc, char *argv[]){QApplication a(argc, argv); /* 指定文件 */QFile file(":/style.qss"); /* 判断文件是否存在 */if (file.exists() ) {/* 以只读的方式打开 */file.open(QFile::ReadOnly); /* 以字符串的方式保存读出的结果 */QString styleSheet = QLatin1String(file.readAll()); /* 设置全局样式 */qApp->setStyleSheet(styleSheet); /* 关闭文件 */file.close(); }MainWindow w; w.show(); return a.exec(); }

style.qss
QWidget {border-image:url(:/images/bg.png); }QLabel {border-image:none; }QWidget#hWidget1 {border-image:none; background:transparent; }QWidget#hWidget2 {border-image:none; background:transparent; }QWidget#vWidget1 {border-image:url(:/images/mask.png); background:#24252a; }QWidget#vWidget0 {border-image:none; }QListWidget#listWidget {color:white; font-size: 15px; border:none; background: "#20ffffff"; border-image:none; }QListWidgetlistWidget:item:active {background: transparent; }QListWidget#listWidget:item {background: transparent; height:60; }QListWidget#listWidget:item:selected {color:#5edcf3; background: transparent; }QListWidget#listWidget:item:hover {background: transparent; color:#5edcf3; border:none; }QPushButton#btn_play {border-image:url(:/icons/btn_play1.png); }QPushButton#btn_play:hover {border-image:url(:/icons/btn_play2.png); }QPushButton#btn_play:checked {border-image:url(:/icons/btn_pause1.png); }QPushButton#btn_play:checked:hover {border-image:url(:/icons/btn_pause2.png); }QPushButton#btn_next {border-image:url(:/icons/btn_next1.png); }QPushButton#btn_next:hover {border-image:url(:/icons/btn_next2.png); }QPushButton#btn_volumedown {border-image:url(:/icons/btn_volumedown1.png); }QPushButton#btn_volumedown:hover {border-image:url(:/icons/btn_volumedown2.png); }QPushButton#btn_volumeup {border-image:url(:/icons/btn_volumeup1.png); }QPushButton#btn_volumeup:hover {border-image:url(:/icons/btn_volumeup2.png); }QSlider#durationSlider:handle:horizontal {border-image:url(:/icons/handle.png); }QSlider#durationSlider {border-image:none; }QSlider#durationSlider:add-page:horizontal {border-image:url(:/images/add_page.png); }QSlider#volumeSlider {border-image:none; }QSlider#volumeSlider:handle:horizontal {border-image:url(:/icons/handle.png); }QSlider#volumeSlider:handle:horizontal {background:transparent; }QSlider#volumeSlider:add-page:horizontal {border-image:url(:/images/add_page.png); }QPushButton#btn_screen {border-image:url(:/icons/btn_fullscreen1.png); }QPushButton#btn_screen:hover {border-image:url(:/icons/btn_fullscreen2.png); }QPushButton#btn_screen:checked {border-image:url(:/icons/btn_screen1.png); }QPushButton#btn_screen:checked:hover {border-image:url(:/icons/btn_screen2.png); }


三、运行 基于Qt实现视频播放器功能
文章图片

基于Qt实现视频播放器功能
文章图片

【基于Qt实现视频播放器功能】到此这篇关于基于Qt实现视频播放器功能的文章就介绍到这了,更多相关Qt--视频播放器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    推荐阅读