1. 从零开始:你的第一个QMediaPlayer播放器
如果你刚接触Qt的多媒体模块,可能会觉得QMediaPlayer有点复杂,毕竟它背后关联着系统底层的编解码器和硬件加速。但别担心,我刚开始用的时候也踩过不少坑,后来发现只要把几个核心对象的关系理清楚,上手其实非常快。今天我就带你从创建一个最简单的播放器开始,一步步深入到播放列表、状态控制和性能优化。
简单来说,QMediaPlayer是Qt提供的一个“播放引擎”,它负责媒体文件的解码、播放控制(播放、暂停、停止)以及播放状态的维护。但它自己并不负责“显示”。对于音频,它把解码后的PCM数据交给系统的音频输出设备;对于视频,它需要一个“画布”来承载画面,这就是QVideoWidget(或者更灵活的QGraphicsVideoItem)出场的时候了。你可以把QMediaPlayer想象成一台DVD机,把QVideoWidget想象成电视机。DVD机负责读碟解码,电视机负责显示画面。没有电视机,DVD机也能工作(播放音频),但你看不到图像。
我们先来搞定环境。在你的Qt项目文件(.pro)里,必须添加下面这两行,否则编译会报错,提示找不到相关的头文件和库。这是我刚开始最容易忘记的一步。
QT += multimedia multimediawidgets
第一行 multimedia 引入了核心的多媒体类,比如QMediaPlayer、QMediaContent。第二行 multimediawidgets 则引入了与界面显示相关的类,主要是QVideoWidget。如果你的程序只需要播放音频,不加multimediawidgets也可以,但为了通用性,我建议你一开始就都加上。
接下来,我们看看创建一个能播放本地视频文件的最小化程序需要几步。下面的代码我加了很多注释,你可以直接复制到你的main.cpp里试试,记得把视频文件路径换成你自己的。
#include <QApplication>
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QFileDialog>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 1. 创建播放引擎
QMediaPlayer *player = new QMediaPlayer;
// 2. 创建视频显示“画布”
QVideoWidget *videoWidget = new QVideoWidget;
videoWidget->resize(800, 600); // 设置一个初始窗口大小
videoWidget->show(); // 显示窗口
// 3. 将播放引擎的输出连接到画布上
player->setVideoOutput(videoWidget);
// 4. 选择一个媒体文件
// 这里为了演示,我们弹出一个文件选择对话框。实际项目中,路径可能是固定的或从网络获取。
QString filePath = QFileDialog::getOpenFileName(nullptr, "选择媒体文件", QDir::homePath(), "视频文件 (*.mp4 *.avi *.mkv);;音频文件 (*.mp3 *.wav)");
if (filePath.isEmpty()) {
qDebug() << "未选择文件,程序退出。";
return -1;
}
// 5. 设置要播放的媒体内容
// QUrl::fromLocalFile 将本地文件路径转换为QMediaPlayer能识别的QUrl格式。
player->setMedia(QUrl::fromLocalFile(filePath));
// 6. 开始播放!
player->play();
// 连接一个信号,方便我们观察状态
QObject::connect(player, &QMediaPlayer::stateChanged, [](QMediaPlayer::State state){
if(state == QMediaPlayer::PlayingState) {
qDebug() << "播放器状态:正在播放";
} else if(state == QMediaPlayer::PausedState) {
qDebug() << "播放器状态:已暂停";
} else if(state == QMediaPlayer::StoppedState) {
qDebug() << "播放器状态:已停止";
}
});
return app.exec();
}
运行这个程序,它会先弹出一个窗口让你选一个视频或音频文件,选中后就会在另一个窗口里开始播放。虽然简陋


1066

被折叠的 条评论
为什么被折叠?



