Qt 多媒体 #
多媒体模块概述 #
text
┌─────────────────────────────────────────────────────────────┐
│ Qt Multimedia 模块 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 音频: │
│ ├── QMediaPlayer - 媒体播放器 │
│ ├── QAudioOutput - 音频输出 │
│ └── QSoundEffect - 音效播放 │
│ │
│ 视频: │
│ ├── QVideoWidget - 视频显示控件 │
│ └── QVideoSink - 视频数据接收 │
│ │
│ 相机: │
│ ├── QCamera - 相机设备 │
│ ├── QMediaCaptureSession - 捕获会话 │
│ └── QImageCapture - 图像捕获 │
│ │
└─────────────────────────────────────────────────────────────┘
音频播放 #
QMediaPlayer 基本使用 #
cpp
#include <QMediaPlayer>
#include <QAudioOutput>
class AudioPlayer : public QWidget
{
Q_OBJECT
public:
AudioPlayer(QWidget *parent = nullptr) : QWidget(parent)
{
player = new QMediaPlayer(this);
audioOutput = new QAudioOutput(this);
player->setAudioOutput(audioOutput);
// 连接信号
connect(player, &QMediaPlayer::positionChanged,
this, &AudioPlayer::onPositionChanged);
connect(player, &QMediaPlayer::durationChanged,
this, &AudioPlayer::onDurationChanged);
connect(player, &QMediaPlayer::playbackStateChanged,
this, &AudioPlayer::onStateChanged);
}
void play(const QString &filePath)
{
player->setSource(QUrl::fromLocalFile(filePath));
player->play();
}
void pause() { player->pause(); }
void stop() { player->stop(); }
void setPosition(qint64 position) { player->setPosition(position); }
void setVolume(float volume) { audioOutput->setVolume(volume); }
void setMuted(bool muted) { audioOutput->setMuted(muted); }
private slots:
void onPositionChanged(qint64 position)
{
// 更新进度条
progressSlider->setValue(position);
}
void onDurationChanged(qint64 duration)
{
progressSlider->setRange(0, duration);
}
void onStateChanged(QMediaPlayer::PlaybackStateChanged state)
{
switch (state) {
case QMediaPlayer::PlayingState:
qDebug() << "Playing";
break;
case QMediaPlayer::PausedState:
qDebug() << "Paused";
break;
case QMediaPlayer::StoppedState:
qDebug() << "Stopped";
break;
}
}
private:
QMediaPlayer *player;
QAudioOutput *audioOutput;
QSlider *progressSlider;
};
音效播放 #
cpp
#include <QSoundEffect>
// 播放短音效
QSoundEffect *effect = new QSoundEffect(this);
effect->setSource(QUrl::fromLocalFile(":/sound.wav"));
effect->setVolume(0.5f);
effect->play();
// 循环播放
effect->setLoopCount(QSoundEffect::Infinite);
effect->play();
// 停止
effect->stop();
视频播放 #
基本使用 #
cpp
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QAudioOutput>
class VideoPlayer : public QWidget
{
Q_OBJECT
public:
VideoPlayer(QWidget *parent = nullptr) : QWidget(parent)
{
player = new QMediaPlayer(this);
audioOutput = new QAudioOutput(this);
videoWidget = new QVideoWidget(this);
player->setAudioOutput(audioOutput);
player->setVideoOutput(videoWidget);
// 布局
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(videoWidget);
// 控制按钮
QHBoxLayout *controls = new QHBoxLayout;
QPushButton *playBtn = new QPushButton("Play");
QPushButton *stopBtn = new QPushButton("Stop");
QSlider *volumeSlider = new QSlider(Qt::Horizontal);
controls->addWidget(playBtn);
controls->addWidget(stopBtn);
controls->addWidget(volumeSlider);
layout->addLayout(controls);
connect(playBtn, &QPushButton::clicked, this, &VideoPlayer::play);
connect(stopBtn, &QPushButton::clicked, player, &QMediaPlayer::stop);
connect(volumeSlider, &QSlider::valueChanged, [this](int value) {
audioOutput->setVolume(value / 100.0f);
});
}
void openFile(const QString &filePath)
{
player->setSource(QUrl::fromLocalFile(filePath));
}
void play() { player->play(); }
void pause() { player->pause(); }
void stop() { player->stop(); }
private:
QMediaPlayer *player;
QAudioOutput *audioOutput;
QVideoWidget *videoWidget;
};
相机操作 #
基本使用 #
cpp
#include <QCamera>
#include <QMediaCaptureSession>
#include <QImageCapture>
#include <QVideoWidget>
class CameraWidget : public QWidget
{
Q_OBJECT
public:
CameraWidget(QWidget *parent = nullptr) : QWidget(parent)
{
// 创建相机
camera = new QCamera(QMediaDevices::defaultVideoInput(), this);
// 创建捕获会话
captureSession = new QMediaCaptureSession(this);
captureSession->setCamera(camera);
// 视频显示
videoWidget = new QVideoWidget(this);
captureSession->setVideoOutput(videoWidget);
// 图像捕获
imageCapture = new QImageCapture(this);
captureSession->setImageCapture(imageCapture);
// 布局
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(videoWidget);
QPushButton *captureBtn = new QPushButton("Capture");
layout->addWidget(captureBtn);
connect(captureBtn, &QPushButton::clicked, this, &CameraWidget::captureImage);
connect(imageCapture, &QImageCapture::imageCaptured,
this, &CameraWidget::onImageCaptured);
// 启动相机
camera->start();
}
~CameraWidget()
{
camera->stop();
}
private slots:
void captureImage()
{
imageCapture->capture();
}
void onImageCaptured(int id, const QImage &image)
{
QString fileName = QString("capture_%1.jpg").arg(id);
image.save(fileName);
qDebug() << "Image saved:" << fileName;
}
private:
QCamera *camera;
QMediaCaptureSession *captureSession;
QVideoWidget *videoWidget;
QImageCapture *imageCapture;
};
下一步 #
现在你已经掌握了多媒体功能,接下来学习 国际化,了解 Qt 的多语言支持!
最后更新:2026-03-29