Qt 多媒体全解|视频播放、录音、摄像头实时预览
模块说明
Qt Multimedia 统一管理音视频、录音、摄像头、媒体播放,Qt5/Qt6 通用。
工程引入模块
pro
QT += multimedia multimediawidgetscmake
find_package(Qt6 REQUIRED COMPONENTS Multimedia MultimediaWidgets) target_link_libraries(App PRIVATE Qt6::Multimedia Qt6::MultimediaWidgets)一、功能 1:音视频播放器(QWidget + QML 双版本)
1. QWidget 版本(QMediaPlayer + QVideoWidget)
cpp
运行
#include <QApplication> #include <QMainWindow> #include <QMediaPlayer> #include <QVideoWidget> #include <QPushButton> #include <QVBoxLayout> int main(int argc, char *argv[]) { QApplication a(argc, argv); QMainWindow w; w.resize(800, 500); QMediaPlayer *player = new QMediaPlayer(&w); QVideoWidget *videoWidget = new QVideoWidget(&w); QPushButton *btnPlay = new QPushButton("播放/暂停"); QVBoxLayout *lay = new QVBoxLayout; lay->addWidget(videoWidget); lay->addWidget(btnPlay); QWidget *central = new QWidget; central->setLayout(lay); w.setCentralWidget(central); // 绑定视频输出窗口 player->setVideoOutput(videoWidget); // 媒体源(本地文件/网络流) player->setMedia(QUrl::fromLocalFile("D:/test.mp4")); connect(btnPlay, &QPushButton::clicked, [=](){ if(player->state() == QMediaPlayer::PlayingState) player->pause(); else player->play(); }); w.show(); return a.exec(); }2. QML 版本(简洁推荐)
qml
import QtQuick 2.15 import QtQuick.Window 2.15 import QtMultimedia 5.15 Window { width: 800 height: 450 visible: true MediaPlayer { id: mediaPlayer source: "qrc:/video/test.mp4" } VideoOutput { anchors.fill: parent source: mediaPlayer } MouseArea { anchors.fill: parent onClicked: { if(mediaPlayer.playbackState === MediaPlayer.PlayingState) mediaPlayer.pause() else mediaPlayer.play() } } }二、功能 2:音频录音(麦克风录制)
基于QAudioRecorder实现麦克风录音,支持保存为wav格式。
cpp
运行
#include <QApplication> #include <QMainWindow> #include <QAudioRecorder> #include <QPushButton> #include <QVBoxLayout> #include <QUrl> int main(int argc, char *argv[]) { QApplication a(argc, argv); QMainWindow w; w.resize(300,200); QAudioRecorder *recorder = new QAudioRecorder(&w); QPushButton *btnRec = new QPushButton("开始录音"); QPushButton *btnStop = new QPushButton("停止录音"); QVBoxLayout *lay = new QVBoxLayout; lay->addWidget(btnRec); lay->addWidget(btnStop); QWidget *cen = new QWidget; cen->setLayout(lay); w.setCentralWidget(cen); // 设置保存路径 QString savePath = "D:/record.wav"; recorder->setOutputLocation(QUrl::fromLocalFile(savePath)); connect(btnRec, &QPushButton::clicked, recorder, &QAudioRecorder::record); connect(btnStop, &QPushButton::clicked, recorder, &QAudioRecorder::stop); w.show(); return a.exec(); }三、功能 3:摄像头实时预览
调用本地摄像头,实时画面显示,基于QCamera。
cpp
运行
#include <QApplication> #include <QMainWindow> #include <QCamera> #include <QCameraViewfinder> #include <QVBoxLayout> int main(int argc, char *argv[]) { QApplication a(argc, argv); QMainWindow w; w.resize(640, 480); QCamera *camera = new QCamera; QCameraViewfinder *viewFinder = new QCameraViewfinder; camera->setViewfinder(viewFinder); camera->start(); // 启动摄像头 QVBoxLayout *lay = new QVBoxLayout; lay->addWidget(viewFinder); QWidget *cen = new QWidget; cen->setLayout(lay); w.setCentralWidget(cen); w.show(); return a.exec(); }QML 摄像头版本
qml
import QtQuick 2.15 import QtQuick.Window 2.15 import QtMultimedia 5.15 Window { width: 640 height: 480 visible: true Camera { id: camera } VideoOutput { anchors.fill: parent source: camera } }四、常见问题与适配
- Windows 摄像头 / 麦克风无法打开系统隐私设置 → 允许应用访问相机、麦克风。
- Linux 无声音 / 无画面安装依赖:
sudo apt install libpulse-dev libcamera-dev - 格式不支持Qt 默认支持 MP4、WAV;播放 FLV、MKV 需要额外安装解码器。
- Qt6 接口变化Qt6 多媒体底层重构,API 大体兼容,部分音频枚举、设置项略有调整。
小结
Qt Multimedia 一套模块覆盖播放、录音、摄像三大场景,QWidget 适合传统桌面,QML 适合简洁动态界面,是音视频类软件的基础方案。
