编程进阶网 编程进阶网
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • README
  • Android提升进阶

  • iOS开发和进阶

  • Web开发和进阶

  • Linux应用开发

    • README
    • QML基础入门

    • QT核心库实践

      • README
      • 核心功能基础
      • 并发与多线程
      • 文件与IO系统
      • 日期与时间处理
      • 网络与序列化
      • QT事件系统
      • 信号与槽机制
      • 多媒体的应用
        • 8.1 多媒体介绍
          • 8.1.1 多媒体支持
          • 8.1.2 多媒体模块概述
        • 8.2 音频播放
          • 8.2.1 QMediaPlayer介绍
          • 8.2.2 QMediaPlayer功能
          • 8.2.3 QMediaPlayer作用
          • 8.2.4 核心方法API
          • 8.2.5 QMediaPlayer原理
          • 8.2.6 QMediaPlayer信号槽
          • 8.2.7 综合播放案例
          • 8.2.8 音频效果处理
        • 8.3 音频录制
          • 8.3.1 QAudioRecorder介绍
        • 8.4 视频播放
          • 8.4.1 视频播放案例
          • 8.4.2 视频录制
        • 8.5 QCamera
          • 8.5.1 QCamera介绍
          • 8.5.2 图像捕捉
      • 容器类和算法
      • 高级编程技巧
    • Linux实践开发

  • Apps
  • Linux应用开发
  • QT核心库实践
杨充
2025-09-08
目录

多媒体的应用

# 08.多媒体的应用

# 目录介绍

  • 8.1 多媒体介绍
    • 8.1.1 多媒体支持
    • 8.1.2 多媒体模块概述
  • 8.2 音频播放
    • 8.2.1 QMediaPlayer介绍
    • 8.2.2 QMediaPlayer功能
    • 8.2.3 QMediaPlayer作用
    • 8.2.4 核心方法API
    • 8.2.5 QMediaPlayer原理
    • 8.2.6 QMediaPlayer信号槽
    • 8.2.7 综合播放案例
    • 8.2.8 音频效果处理
  • 8.3 音频录制
    • 8.3.1 QAudioRecorder介绍
  • 8.4 视频播放和录制
    • 8.4.1 视频播放
    • 8.4.2 视频录制
  • 8.5 QCamera
    • 8.5.1 QCamera介绍
    • 8.5.2 图像捕捉

# 8.1 多媒体介绍

# 8.1.1 多媒体支持

Qt 提供了丰富的多媒体支持,涵盖了音频、视频、摄像头、图像处理等功能。

# 8.1.2 多媒体模块概述

Qt 多媒体模块位于 QtMultimedia 库中,提供了以下功能:

  • 音频播放与录制
  • 视频播放与录制
  • 摄像头访问
  • 图像捕捉与处理
  • 音频效果处理

要使用 Qt 多媒体模块,需要在项目文件(.pro)中添加以下配置:

QT += multimedia
1

# 8.2 音频播放

# 8.2.1 QMediaPlayer介绍

QMediaPlayer 用于播放音频文件。

#include <QMediaPlayer>
#include <QUrl>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    // 创建媒体播放器
    QMediaPlayer player;
    // 设置音频文件
    player.setMedia(QUrl::fromLocalFile("/path/to/audio.mp3"));
    // 播放音频
    player.play();
    // 监听播放状态
    QObject::connect(&player, &QMediaPlayer::stateChanged, [](QMediaPlayer::State state) {
        if (state == QMediaPlayer::PlayingState) {
            qDebug() << "Audio is playing!";
        }
    });

    return app.exec();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 8.2.2 QMediaPlayer功能

QMediaPlayer 提供了以下主要功能:

  • (1) 媒体播放:支持播放多种格式的音频和视频文件(如 MP3、WAV、MP4 等)。支持从本地文件、网络流或内存中加载媒体内容。
  • (2) 播放控制:播放/暂停:开始或暂停媒体播放。停止:停止播放并释放资源。跳转:跳转到指定时间点播放。循环播放:设置媒体是否循环播放。
  • (3) 状态和错误处理:提供媒体播放状态(如播放中、暂停、停止、错误等)。捕获并处理播放错误(如文件不存在、格式不支持等)。
  • (4) 元数据访问:获取媒体的元数据(如标题、作者、时长、封面等)。
  • (5) 音量控制:设置和获取播放音量。
  • (6) 视频输出:支持将视频渲染到 QVideoWidget 或自定义的 QAbstractVideoSurface。
  • (7) 信号与槽机制:通过信号与槽机制,实时响应播放状态、位置、音量等变化。

# 8.2.3 QMediaPlayer作用

QMediaPlayer 的主要作用是为 Qt 应用程序提供多媒体播放能力,适用于以下场景:

  • 音频播放:播放背景音乐、提示音、语音等。
  • 视频播放:播放本地或网络视频。
  • 流媒体:支持实时流媒体播放(如网络电台、直播等)。
  • 多媒体应用:用于开发音乐播放器、视频播放器、多媒体演示等应用。

# 8.2.4 核心方法API

以下是 QMediaPlayer 的常用方法:

方法 描述
setMedia(const QMediaContent &media) 设置媒体内容(文件路径或 URL)。
play() 开始播放。
pause() 暂停播放。
stop() 停止播放。
setPosition(qint64 position) 跳转到指定时间点(毫秒)。
setVolume(int volume) 设置音量(0-100)。
state() 获取当前播放状态。
duration() 获取媒体总时长(毫秒)。
position() 获取当前播放位置(毫秒)。
setVideoOutput(QVideoWidget *output) 设置视频输出到 QVideoWidget。

播放状态

  • state():获取当前播放状态(PlayingState、PausedState、StoppedState)。
  • mediaStatus():获取媒体状态(NoMedia、LoadedMedia、BufferingMedia 等)。

# 8.2.5 QMediaPlayer原理

QMediaPlayer 的工作原理基于 Qt 的多媒体模块,其核心流程如下:

(1) 媒体加载:使用 setMedia() 方法加载媒体文件或 URL。媒体内容可以是本地文件、网络资源或内存数据。

(2) 解码与播放:QMediaPlayer 依赖于底层的多媒体框架(如 GStreamer、DirectShow、AVFoundation 等)进行媒体解码。解码后的音频数据通过音频设备输出,视频数据通过 QVideoWidget 或自定义渲染器显示。

(3) 状态管理:QMediaPlayer 维护一个内部状态机,通过 state() 方法获取当前状态。包括以下状态:

  • StoppedState:停止状态。无论是手动调用 stop() 方法,还是播放结束,播放器都会进入 StoppedState。
  • PlayingState:播放中。
  • PausedState:暂停状态。

(4) 信号与槽:QMediaPlayer 通过信号与槽机制通知状态变化和事件,例如:

  • stateChanged(QMediaPlayer::State state):播放状态变化时触发。
  • mediaStatusChanged(QMediaPlayer::MediaStatus status):媒体状态变化时触发。
  • positionChanged(qint64 position):播放位置变化时触发。
  • durationChanged(qint64 duration):媒体总时长变化时触发。
  • error(QMediaPlayer::Error error):发生错误时触发。

(5) 资源管理:播放完成后,调用 stop() 方法释放资源。使用 setMedia(nullptr) 清除当前媒体内容。

# 8.2.6 QMediaPlayer信号槽

以下是 QMediaPlayer 的常用信号:

信号 描述
stateChanged(QMediaPlayer::State state) 播放状态变化时触发。
positionChanged(qint64 position) 播放位置变化时触发。
durationChanged(qint64 duration) 媒体时长变化时触发。
errorOccurred(QMediaPlayer::Error error, const QString &errorString) 播放出错时触发。
mediaStatusChanged(QMediaPlayer::MediaStatus status) 媒体状态变化时触发(如加载中、加载完成等)。
// 监听播放状态
QObject::connect(&player, &QMediaPlayer::stateChanged, [](QMediaPlayer::State state) {
    qDebug() << "State changed:" << state;
});

// 监听媒体状态
QObject::connect(&player, &QMediaPlayer::mediaStatusChanged, [](QMediaPlayer::MediaStatus status) {
    qDebug() << "Media status changed:" << status;
});

// 监听播放位置
QObject::connect(&player, &QMediaPlayer::positionChanged, [](qint64 position) {
    qDebug() << "Position changed:" << position;
});

// 监听错误
QObject::connect(&player, QOverload<QMediaPlayer::Error>::of(&QMediaPlayer::error), [](QMediaPlayer::Error error) {
    qDebug() << "Error occurred:" << error;
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 8.2.7 综合播放案例

#include <QCoreApplication>
#include <QMediaPlayer>
#include <QAudioOutput>
#include <QDebug>
#include <QFileInfo>

class AudioPlayer : public QObject {
    Q_OBJECT

public:
    AudioPlayer(const QString &filePath, QObject *parent = nullptr)
        : QObject(parent), m_player(new QMediaPlayer(this)), m_audioOutput(new QAudioOutput(this)) {
        // 设置音频输出
        m_player->setAudioOutput(m_audioOutput);

        // 设置媒体文件
        QFileInfo fileInfo(filePath);
        if (!fileInfo.exists()) {
            qWarning() << "File does not exist:" << filePath;
            QCoreApplication::exit(1);
            return;
        }
        m_player->setSource(QUrl::fromLocalFile(filePath));

        // 连接信号和槽
        connect(m_player, &QMediaPlayer::stateChanged, this, &AudioPlayer::onStateChanged);
        connect(m_player, &QMediaPlayer::mediaStatusChanged, this, &AudioPlayer::onMediaStatusChanged);
        connect(m_player, &QMediaPlayer::errorOccurred, this, &AudioPlayer::onErrorOccurred);

        // 开始播放
        m_player->play();
    }

private slots:
    // 处理播放状态变化
    void onStateChanged(QMediaPlayer::PlaybackState state) {
        switch (state) {
        case QMediaPlayer::StoppedState:
            qDebug() << "State: Stopped";
            break;
        case QMediaPlayer::PlayingState:
            qDebug() << "State: Playing";
            break;
        case QMediaPlayer::PausedState:
            qDebug() << "State: Paused";
            break;
        }
    }

    // 处理媒体状态变化
    void onMediaStatusChanged(QMediaPlayer::MediaStatus status) {
        switch (status) {
        case QMediaPlayer::NoMedia:
            qDebug() << "MediaStatus: No Media";
            break;
        case QMediaPlayer::LoadingMedia:
            qDebug() << "MediaStatus: Loading Media";
            break;
        case QMediaPlayer::LoadedMedia:
            qDebug() << "MediaStatus: Media Loaded";
            break;
        case QMediaPlayer::StalledMedia:
            qDebug() << "MediaStatus: Media Stalled";
            break;
        case QMediaPlayer::BufferingMedia:
            qDebug() << "MediaStatus: Buffering Media";
            break;
        case QMediaPlayer::BufferedMedia:
            qDebug() << "MediaStatus: Media Buffered";
            break;
        case QMediaPlayer::EndOfMedia:
            qDebug() << "MediaStatus: End of Media";
            QCoreApplication::quit(); // 播放结束后退出程序
            break;
        case QMediaPlayer::InvalidMedia:
            qDebug() << "MediaStatus: Invalid Media";
            break;
        }
    }

    // 处理播放错误
    void onErrorOccurred(QMediaPlayer::Error error, const QString &errorString) {
        qWarning() << "Error:" << errorString;
        switch (error) {
        case QMediaPlayer::NoError:
            break;
        case QMediaPlayer::ResourceError:
            qWarning() << "Resource Error: Unable to load media.";
            break;
        case QMediaPlayer::FormatError:
            qWarning() << "Format Error: Unsupported media format.";
            break;
        case QMediaPlayer::NetworkError:
            qWarning() << "Network Error: Network issue occurred.";
            break;
        case QMediaPlayer::AccessDeniedError:
            qWarning() << "Access Denied Error: Permission issue.";
            break;
        default:
            qWarning() << "Unknown Error.";
            break;
        }
        QCoreApplication::exit(1); // 发生错误时退出程序
    }

private:
    QMediaPlayer *m_player;
    QAudioOutput *m_audioOutput;
};

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    if (argc < 2) {
        qWarning() << "Usage: ./AudioPlayer <audio_file_path>";
        return 1;
    }

    QString filePath = argv[1];
    AudioPlayer player(filePath);

    return app.exec();
}

#include "main.moc"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125

# 8.2.8 音频效果处理

QAudioEffect 用于处理音频效果,如均衡器、混响等。

#include <QMediaPlayer>
#include <QAudioEffect>
#include <QUrl>

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    // 创建媒体播放器
    QMediaPlayer player;
    player.setMedia(QUrl::fromLocalFile("/path/to/audio.mp3"));

    // 创建音频效果(例如均衡器)
    QAudioEffect *effect = new QAudioEffect(&player);
    effect->setEffectType(QAudioEffect::EqualizerEffect);
    effect->setEnabled(true);

    // 播放音频
    player.play();

    return app.exec();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 8.3 音频录制

# 8.3.1 QAudioRecorder介绍

QAudioRecorder 用于录制音频。

#include <QAudioRecorder>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    // 创建音频录制器
    QAudioRecorder recorder;

    // 设置输出文件
    recorder.setOutputLocation(QUrl::fromLocalFile("/path/to/recording.wav"));

    // 开始录制
    recorder.record();

    qDebug() << "Recording started!";

    // 停止录制
    QTimer::singleShot(5000, [&recorder]() {
        recorder.stop();
        qDebug() << "Recording stopped!";
    });

    return app.exec();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 8.4 视频播放

# 8.4.1 视频播放案例

QMediaPlayer 结合 QVideoWidget 可以播放视频。

#include <QApplication>
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QUrl>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建媒体播放器和视频窗口
    QMediaPlayer player;
    QVideoWidget videoWidget;
    // 设置视频文件
    player.setMedia(QUrl::fromLocalFile("/path/to/video.mp4"));
    // 将视频输出到窗口
    player.setVideoOutput(&videoWidget);
    // 显示窗口并播放视频
    videoWidget.show();
    player.play();

    return app.exec();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 8.4.2 视频录制

QCamera 和 QMediaRecorder 用于录制视频。

#include <QApplication>
#include <QCamera>
#include <QMediaRecorder>
#include <QCameraViewfinder>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建摄像头和视图
    QCamera camera;
    QCameraViewfinder viewfinder;

    // 设置摄像头视图
    camera.setViewfinder(&viewfinder);

    // 创建媒体录制器
    QMediaRecorder recorder(&camera);

    // 设置输出文件
    recorder.setOutputLocation(QUrl::fromLocalFile("/path/to/recording.mp4"));

    // 显示摄像头视图
    viewfinder.show();

    // 开始录制
    camera.start();
    recorder.record();

    qDebug() << "Recording started!";

    // 停止录制
    QTimer::singleShot(10000, [&recorder]() {
        recorder.stop();
        qDebug() << "Recording stopped!";
    });

    return app.exec();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

# 8.5 QCamera

# 8.5.1 QCamera介绍

QCamera 用于访问摄像头并显示实时画面。

#include <QApplication>
#include <QCamera>
#include <QCameraViewfinder>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    // 创建摄像头和视图
    QCamera camera;
    QCameraViewfinder viewfinder;
    // 设置摄像头视图
    camera.setViewfinder(&viewfinder);
    // 显示摄像头视图
    viewfinder.show();
    // 启动摄像头
    camera.start();
    return app.exec();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 8.5.2 图像捕捉

QCameraImageCapture 用于从摄像头捕捉静态图像。

#include <QApplication>
#include <QCamera>
#include <QCameraImageCapture>
#include <QCameraViewfinder>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    // 创建摄像头和视图
    QCamera camera;
    QCameraViewfinder viewfinder;
    camera.setViewfinder(&viewfinder);
    // 创建图像捕捉器
    QCameraImageCapture imageCapture(&camera);
    // 显示摄像头视图
    viewfinder.show();
    // 启动摄像头
    camera.start();
    // 捕捉图像
    imageCapture.capture("/path/to/capture.jpg");
    return app.exec();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
上次更新: 2026/06/10, 11:13:41
信号与槽机制
容器类和算法

← 信号与槽机制 容器类和算法→

最近更新
01
信号崩溃快速排查
06-15
02
CoreDump破案
06-15
03
perf火焰图实战
06-15
更多文章>
Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式