Qt 6.0 提供了强大的多媒体功能用于音频和视频播放。以下是使用 Qt 6.0 进行音频视频播放的主要方法和类:
核心类
-
QMediaPlayer - 主要的媒体播放类
-
QAudioOutput - 音频输出控制
-
QVideoWidget - 视频显示组件
-
QMediaDevices - 音频设备管理
基本音频播放
#include <QMediaPlayer>
#include <QAudioOutput>
// 创建播放器和音频输出
QMediaPlayer *player = new QMediaPlayer;
QAudioOutput *audioOutput = new QAudioOutput;
// 设置音频输出
player->setAudioOutput(audioOutput);
// 设置播放源(可以是本地文件或网络URL)
player->setSource(QUrl::fromLocalFile("/path/to/audio.mp3"));
// 播放
player->play();
基本视频播放
#include <QMediaPlayer>
#include <QAudioOutput>
#include <QVideoWidget>
// 创建播放器、音频输出和视频窗口
QMediaPlayer *player = new QMediaPlayer;
QAudioOutput *audioOutput = new QAudioOutput;
QVideoWidget *videoWidget = new QVideoWidget;
// 设置视频输出
player->setVideoOutput(videoWidget);
// 设置音频输出
player->setAudioOutput(audioOutput);
// 显示视频窗口
videoWidget->show();
// 设置播放源
player->setSource(QUrl::fromLocalFile("/path/to/video.mp4"));
// 播放
player->play();
播放控制
// 暂停
player->pause();
// 停止
player->stop();
// 设置音量 (0.0 - 1.0)
audioOutput->setVolume(0.8);
// 跳转到特定位置 (毫秒)
player->setPosition(5000); // 跳转到5秒位置
// 循环播放
player->setLoops(QMediaPlayer::Infinite);
信号和槽
// 连接状态改变信号
connect(player, &QMediaPlayer::playbackStateChanged, [](QMediaPlayer::PlaybackState state) {
qDebug() << "Playback state changed:" << state;
});
// 连接位置改变信号
connect(player, &QMediaPlayer::positionChanged, [](qint64 pos) {
qDebug() << "Position:" << pos;
});
// 连接持续时间改变信号
connect(player, &QMediaPlayer::durationChanged, [](qint64 dur) {
qDebug() << "Duration:" << dur;
});
// 错误处理
connect(player, &QMediaPlayer::errorOccurred, [](QMediaPlayer::Error error, const QString &errorString) {
qDebug() << "Error:" << errorString;
});
支持的格式
Qt 6.0 支持多种音频和视频格式,具体取决于平台和安装的编解码器。常见支持的格式包括:
-
音频: MP3, WAV, AAC, OGG
-
视频: MP4, AVI, MKV (取决于编解码器)
注意事项
-
在 Qt 6 中,多媒体模块进行了重大重构,与 Qt 5 的 API 有较大不同
-
需要在项目文件 (.pro) 中添加多媒体模块:
QT += multimedia
-
某些平台可能需要安装额外的编解码器包
-
对于高级功能,可以查看 QMediaCaptureSession 和 QCamera 类
完整示例 (视频播放器)
#include <QApplication>
#include <QMediaPlayer>
#include <QAudioOutput>
#include <QVideoWidget>
#include <QPushButton>
#include <QSlider>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFileDialog>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget window;
QVBoxLayout layout(&window);
// 视频显示
QVideoWidget *videoWidget = new QVideoWidget;
layout.addWidget(videoWidget);
// 控制按钮
QHBoxLayout controlLayout;
QPushButton *openButton = new QPushButton("Open");
QPushButton *playButton = new QPushButton("Play");
QPushButton *pauseButton = new QPushButton("Pause");
QPushButton *stopButton = new QPushButton("Stop");
controlLayout.addWidget(openButton);
controlLayout.addWidget(playButton);
controlLayout.addWidget(pauseButton);
controlLayout.addWidget(stopButton);
layout.addLayout(&controlLayout);
// 进度条
QSlider *positionSlider = new QSlider(Qt::Horizontal);
layout.addWidget(positionSlider);
// 创建播放器
QMediaPlayer *player = new QMediaPlayer(&window);
QAudioOutput *audioOutput = new QAudioOutput(&window);
player->setAudioOutput(audioOutput);
player->setVideoOutput(videoWidget);
// 连接按钮信号
QObject::connect(openButton, &QPushButton::clicked, [&]() {
QString file = QFileDialog::getOpenFileName(&window, "Open Media File");
if (!file.isEmpty()) {
player->setSource(QUrl::fromLocalFile(file));
}
});
QObject::connect(playButton, &QPushButton::clicked, player, &QMediaPlayer::play);
QObject::connect(pauseButton, &QPushButton::clicked, player, &QMediaPlayer::pause);
QObject::connect(stopButton, &QPushButton::clicked, player, &QMediaPlayer::stop);
// 更新进度条
QObject::connect(player, &QMediaPlayer::positionChanged, positionSlider, [=](qint64 pos) {
positionSlider->setValue(pos);
});
QObject::connect(player, &QMediaPlayer::durationChanged, positionSlider, [=](qint64 dur) {
positionSlider->setRange(0, dur);
});
QObject::connect(positionSlider, &QSlider::sliderMoved, player, &QMediaPlayer::setPosition);
window.resize(800, 600);
window.show();
return app.exec();
}
这个示例创建了一个简单的视频播放器,包含打开文件、播放、暂停、停止功能和进度条控制。