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