ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Qt 多媒体全解|视频播放、录音、摄像头实时预览

Qt 多媒体全解|视频播放、录音、摄像头实时预览

模块说明

Qt Multimedia 统一管理音视频、录音、摄像头、媒体播放,Qt5/Qt6 通用。

工程引入模块

pro

QT += multimedia multimediawidgets

cmake

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 } }

四、常见问题与适配

  1. Windows 摄像头 / 麦克风无法打开系统隐私设置 → 允许应用访问相机、麦克风。
  2. Linux 无声音 / 无画面安装依赖:sudo apt install libpulse-dev libcamera-dev
  3. 格式不支持Qt 默认支持 MP4、WAV;播放 FLV、MKV 需要额外安装解码器。
  4. Qt6 接口变化Qt6 多媒体底层重构,API 大体兼容,部分音频枚举、设置项略有调整。

小结

Qt Multimedia 一套模块覆盖播放、录音、摄像三大场景,QWidget 适合传统桌面,QML 适合简洁动态界面,是音视频类软件的基础方案。

返回列表