Qt——多媒体(音频、视频播放)
播放音频
要使用多媒体音频功能,需要先引入multimedia
模块
在camke
中,加入如下语句:
find_package(Qt6 COMPONENTS Network REQUIRED)
target_link_libraries(your_target_name PRIVATE Qt6::multimedia)
播放音频主要涉及到三个类:
QAudioOutput
,音频输出类,和**QMediaPlayer
**搭配使用
方法 | 功能 |
---|---|
setVolume | 设置音量 |
QMediaPlayer
,媒体播放器,主要用于长音频输出
方法 | 功能 |
---|---|
setAudioOutput | 设置音频输出 |
setSource | 设置资源文件 |
play | 开始播放 |
pause | 暂停播放,恢复播放时,从暂停的地方继续 |
stop | 停止播放,恢复播放时,从头开始播放 |
QSoundEffct
,声音播放器,主要用于短音频输出。其不需要搭配QAudioOutput
使用
方法 | 功能 |
---|---|
setSource | 设置资源文件 |
play | 开始播放 |
setVolume | 设置音量 |
例如,可以实现一个简单的音乐播放器,包含如下功能
- 从本地选择歌曲
- 播放/暂停歌曲
- 显示歌曲播放进度
- 点击进度条,实现快进
Widget
:
// widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QMediaPlayer>
#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();void on_toolButton_clicked();void updateProgressBar(qint64 position);void updateSong(int percent);private:Ui::Widget *ui;QMediaPlayer *player_ = nullptr;
};
#endif // WIDGET_H// widget.cpp
#include "widget.h"#include <QAudioOutput>
#include <QDebug>
#include <QFileDialog>
#include <QMessageBox>
#include <thread>#include "./ui_widget.h"
#include "progressbar.h"Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 创建音频输出QAudioOutput *audio_output = new QAudioOutput(this);// 创建播放器,并设置资源和输出player_ = new QMediaPlayer(this);player_->setAudioOutput(audio_output);// 设置音量大小audio_output->setVolume(20);// 设置播放键初始图标和状态ui->toolButton->setCheckable(false);ui->toolButton->setIcon(QIcon(":/play"));// 设置进度条基本信息ui->progressBar->setValue(0);ui->progressBar->setMinimum(0);ui->progressBar->setMaximum(1000);ui->progressBar->setTextVisible(false);// 监控播放错误connect(player_, &QMediaPlayer::errorOccurred,[this](QMediaPlayer::Error error, const QString &errorString) {qDebug() << "Error:" << errorString;QMessageBox::warning(this, "播放错误", errorString);});// 监控播放进度connect(player_, &QMediaPlayer::positionChanged, this, &Widget::updateProgressBar);// 监控进度条变化connect(ui->progressBar, &ProgressBar::updateSong, this, &Widget::updateSong);
}Widget::~Widget() { delete ui; }void Widget::on_pushButton_clicked() {QString path = QFileDialog::getOpenFileName();player_->setSource(QUrl::fromLocalFile(path));int index = path.lastIndexOf('/');QString song;if (index != -1) {song = path.mid(index + 1);}ui->label->setText("当前正在播放: " + song);ui->progressBar->setValue(0); // 初始化进度条
}void Widget::on_toolButton_clicked() {if (ui->toolButton->isCheckable() == true) {// 暂停音乐ui->toolButton->setIcon(QIcon(":/play"));ui->toolButton->setCheckable(false);player_->pause();} else {// 播放音乐ui->toolButton->setIcon(QIcon(":/pause"));ui->toolButton->setCheckable(true);player_->play();}
}// 根据播放进度, 更新进度条
void Widget::updateProgressBar(qint64 position) {qint64 total_len = player_->duration();ui->progressBar->setValue(1000 * position / total_len);
}// 根据进度条,更新播放进度
void Widget::updateSong(int percent) {qDebug() << percent;qint64 cur_position = player_->duration() * percent / 100;player_->setPosition(cur_position);
}
progressBar
:
// progressBar.h
#ifndef PROGRESSBAR_H
#define PROGRESSBAR_H#include <QMouseEvent>
#include <QProgressBar>class ProgressBar : public QProgressBar {Q_OBJECTpublic:ProgressBar(QWidget* parent = nullptr);void mousePressEvent(QMouseEvent* event);signals:void updateSong(int percent);
};#endif // PROGRESSBAR_H// progressBar.cpp
#include "progressbar.h"ProgressBar::ProgressBar(QWidget* parent) : QProgressBar(parent) {}void ProgressBar::mousePressEvent(QMouseEvent* event) {int pos = event->x();int width = this->width();this->setValue(this->maximum() * pos / width);emit updateSong(100 * pos / width);
}
播放视频
要使用多媒体视频功能,需要先引入模块:multimediawidgets
在CMakeLists.txt
中加入如下语句:
find_package(Qt6 REQUIRED COMPONENTS MultimediaWidgets)
target_link_libraries(mytarget PRIVATE Qt6::MultimediaWidgets)
主要涉及到三个类:
QVideoWidget
,作为视频播放的载体,配合 QMediaPlayer 实现完整的视频播放功能。
方法 | 功能 |
---|---|
setFullScreen | 设置全屏 |
setBrightness() | 调节亮度 |
setContrast | 调节对比度 |
QAudioOutput
,音频输出类,和**QMediaPlayer
**搭配使用
方法 | 功能 |
---|---|
setVolume | 设置音量 |
QMediaPlayer
,媒体播放器
方法 | 功能 |
---|---|
setVideoOutput | 设置视频输出 |
setSource | 设置资源文件 |
play | 开始播放 |
pause | 暂停播放,恢复播放时,从暂停的地方继续 |
stop | 停止播放,恢复播放时,从头开始播放 |
实例:
// widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QMediaPlayer>
#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();private:Ui::Widget *ui;QMediaPlayer *player_ = nullptr;
};
#endif // WIDGET_H// widget.cpp
#include "widget.h"#include <QAudioOutput>
#include <QFileDialog>
#include <QMessageBox>
#include <QVBoxLayout>
#include <QVideoWidget>#include "./ui_widget.h"Widget::Widget(QWidget* parent) : QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// qputenv("QT_MEDIA_BACKEND", "windows"); // Windows 平台使用软件解码// 创建视频播放载体QVideoWidget* video_widget = new QVideoWidget(this);// 创建音频播放载体QAudioOutput* audio_output = new QAudioOutput(this);// 创建播放器player_ = new QMediaPlayer(this);player_->setVideoOutput(video_widget);player_->setAudioOutput(audio_output);player_->audioOutput()->setVolume(20);// 设置垂直布局QVBoxLayout* layout = new QVBoxLayout();layout->addWidget(video_widget);layout->addWidget(ui->pushButton);this->setLayout(layout);connect(player_, &QMediaPlayer::errorOccurred, this,[this](QMediaPlayer::Error error, const QString& errorString) {qDebug() << "ERROR: " << errorString;QMessageBox::critical(this, "播放视频", errorString);exit(-1);});
}Widget::~Widget() { delete ui; }void Widget::on_pushButton_clicked() {QString path = QFileDialog::getOpenFileName();player_->setSource(QUrl::fromLocalFile(path));player_->play();
}