多媒体
多媒体模块
Qt 6多媒体模块概述
Qt 6多媒体模块是在 Qt 6.2中正式发布的,相对于Qt 5,这是一个几乎全新的模块。
| 对比内容 | Qt 5实现多媒体 | Qt 6多媒体模块的改进与特点 |
|---|---|---|
| 模块结构 | 基于插件的结构,需要多个插件实现完整功能,维护困难。 | 采用单一后端设计,方便维护和扩展。 |
| 维护难度 | 由于依赖多个插件,维护起来相对困难。 | 后端结构简化,维护更为方便。 |
| 开放后端API的便利性 | 后端API对用户开放,不利于API稳定性的保持及用户使用起来有不便。 | 后端隐藏,用户无需直接操作后端API,更易于使用。 |
| 扩展性 | 由于后端API开放,扩展性虽然看似好但不易控制升级与扩展的平衡。 | 设计时考虑跨平台使用不同后端,便于未来扩展新功能或集成其他多媒体框架。 |
| 平台兼容性 | 难于实现完全跨平台,因为不同平台的多媒体后端存在差异。 | 在编译时确定使用的后端,实现真正的跨平台支持。例如Linux上使用GStreamer,Windows上使用WMF等。 |
Qt 6多媒体模块功能
- 访问原始音频设备并进行输入输出。
- 播放低延迟音效文件,如WAV文件。
- 播放压缩的音频和视频文件,如MP3、MP4、WMV等格式。
- 录制音频并进行压缩,生成MP3、WMA等格式文件。
- 使用摄像头进行预览、拍照和录像。
- 解压音频文件到内存进行处理。
Qt 6多媒体模块子模块
- Qt Multimedia模块:提供多媒体编程的大部分类。
- Qt Multimedia Widgets模块:提供多媒体编程的界面组件类,如QVideoWidget。
如何在项目中使用Qt 6多媒体模块
- 需要在项目配置文件(.pro文件)中加入特定语句以使用这两个模块。具体语句为:加入Qt Multimedia和Qt Multimedia Widgets模块的引用。
新的类:
- QT += multimedia
- QT += multimediawidgets
类名称
| 类名 | 描述 |
|---|---|
| QMediaPlayer | 播放多媒体内容(音频和视频),提供播放、暂停、停止等控制。 |
| QVideoWidget | 显示视频内容的控件,常与 QMediaPlayer 一起使用。 |
| QMediaCaptureSession | 捕获媒体数据的机制,通常与 QCamera 一起使用。 |
| QCamera | 访问和控制摄像头硬件,提供各种设置和属性。 |
| QAudioInput | 捕获音频输入,通常与麦克风等音频输入设备关联。 |
| QAudioOutput | 播放音频输出,控制音频播放的不同参数。 |
| QMediaRecorder | 录制音频和视频内容,基于其他多媒体类实现录制功能。 |
| QMediaDevices | 发现和访问系统中的多媒体设备,如摄像头和音频设备。 |
| QMediaFormat | 表示媒体内容的格式和属性,如音频和视频格式。 |
| QVideoSink | 处理视频数据的接收和传递。 |
| QAudioSource | 从音频输入设备获取音频数据。 |
| QAudioSink | 将音频数据写入文件或其他目的地,通常用于录制音频。 |
播放音频
QMediaPlayer
QMediaPlayer 是 Qt Multimedia 模块中的一个类,用于播放音频和视频文件。它提供了丰富的功能,使开发者能够轻松地集成多媒体播放功能到应用程序中。
主要功能和特性
- 支持多种格式:可以播放多种音频和视频格式,如 MP3、WAV、MP4、AVI 等。
- 控制播放:提供播放、暂停、停止、跳转等控制功能。
- 音量和音调控制:可以设置播放音量和播放速度。
- 媒体信息:能获取媒体文件的元数据,比如标题、艺术家、时长等。
- 视频输出:可以将视频播放输出到自定义的小部件中。
使用 QMediaPlayer 播放音频文件
示例:
cpp
#include <QApplication>
#include <QMediaPlayer>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QSlider>
#include <QLabel>
class MediaPlayerWidget : public QWidget {
Q_OBJECT
public:
MediaPlayerWidget(QWidget *parent = nullptr) : QWidget(parent) {
player = new QMediaPlayer(this);
// 创建按钮和滑块
QPushButton *playButton = new QPushButton("Play", this);
QPushButton *pauseButton = new QPushButton("Pause", this);
QPushButton *stopButton = new QPushButton("Stop", this);
QSlider *volumeSlider = new QSlider(Qt::Horizontal, this);
volumeSlider->setRange(0, 100);
volumeSlider->setValue(50); // 默认音量为50%
// 布局
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(playButton);
layout->addWidget(pauseButton);
layout->addWidget(stopButton);
layout->addWidget(new QLabel("Volume:"));
layout->addWidget(volumeSlider);
// 连接信号与槽
connect(playButton, &QPushButton::clicked, this, &MediaPlayerWidget::playMedia);
connect(pauseButton, &QPushButton::clicked, player, &QMediaPlayer::pause);
connect(stopButton, &QPushButton::clicked, player, &QMediaPlayer::stop);
connect(volumeSlider, &QSlider::valueChanged, player, &QMediaPlayer::setVolume);
// 设置媒体文件
player->setMedia(QUrl::fromLocalFile("/path/to/your/audiofile.mp3"));
}
private slots:
void playMedia() {
player->play();
}
private:
QMediaPlayer *player;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MediaPlayerWidget widget;
widget.resize(300, 200);
widget.show();
return app.exec();
}
#include "main.moc"
说明
- 创建 QMediaPlayer 实例: QMediaPlayer *player = new QMediaPlayer(this); 创建媒体播放器对象。
- 设置媒体文件:使用 setMedia() 方法指定要播放的音频或视频文件路径。
- 播放控制:使用 play() , pause() , 和 stop() 方法分别控制播放、暂停和停止。
- 音量控制:通过 setVolume() 方法调整音量。音量滑块用于实时调节音量。
- 信号与槽:使用 Qt 的信号槽机制连接按钮的点击事件以控制播放。
常见用法
- 音频播放器:用于构建简单的音乐播放器应用。
- 视频播放:结合 QVideoWidget 可实现视频播放功能。
- 流媒体播放:支持从 URL 播放在线音频和视频流。
录制音频
QMediaRecorder
QMediaRecorder 是 Qt Multimedia 模块中的一个类,用于录制音频和视频。它提供了简单的接口,使开发者能够将录制功能集成到应用程序中。
主要功能和特性
- 音频录制:支持将音频数据录制到文件中。
- 视频录制:可以录制视频流,包括来自摄像头的视频。
- 格式支持:可以选择多种文件格式,如 MP4、AVI、WAV 等。
- 录制控制:提供开始、停止录制的控制方法。
- 音量和质量调整:可以设置录制时的音量和视频质量。
使用 QMediaRecorder 进行音频录制
示例:
cpp
#include <QApplication>
#include <QMediaRecorder>
#include <QAudioInput>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>
class AudioRecorderWidget : public QWidget {
Q_OBJECT
public:
AudioRecorderWidget(QWidget *parent = nullptr) : QWidget(parent) {
// 创建音频输入
QAudioFormat format;
format.setSampleRate(44100);
format.setChannelCount(2);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
audioInput = new QAudioInput(format, this);
recorder = new QMediaRecorder(audioInput, this);
// 创建按钮
QPushButton *startButton = new QPushButton("Start Recording", this);
QPushButton *stopButton = new QPushButton("Stop Recording", this);
// 布局
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(startButton);
layout->addWidget(stopButton);
// 连接信号与槽
connect(startButton, &QPushButton::clicked, this, &AudioRecorderWidget::startRecording);
connect(stopButton, &QPushButton::clicked, this, &AudioRecorderWidget::stopRecording);
// 设置保存路径
recorder->setOutputLocation(QUrl::fromLocalFile("/path/to/your/audiofile.wav"));
}
private slots:
void startRecording() {
recorder->record();
}
void stopRecording() {
recorder->stop();
}
private:
QMediaRecorder *recorder;
QAudioInput *audioInput;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
AudioRecorderWidget widget;
widget.resize(300, 200);
widget.show();
return app.exec();
}
#include "main.moc"
说明
- 创建音频格式:使用 QAudioFormat 定义录音的参数,例如采样率、通道数和样本大小。
- 创建 QAudioInput:用于捕获音频输入的数据流。
- 创建 QMediaRecorder:关联音频输入和录音器,使用 setOutputLocation() 指定录音文件的保存路径。
- 控制录音:通过 record() 和 stop() 方法开始和停止录音。
- 信号与槽:通过按钮触发录音开始和结束。
常见用法
- 音频录音应用:构建录音机或语音备忘录应用。
- 会议记录:用于录制会议或访谈音频。
- 声音注释:用户可以为文档或图片添加音频注释。
采集和播放原始音频数据
QAudioInput
音频采集通常需要使用 QAudioInput 类。这个类可以用来从麦克风等音频输入设备采集音频流。
采集音频数据
示例:
cpp
#include <QApplication>
#include <QAudioInput>
#include <QFile>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
class AudioCaptureWidget : public QWidget {
Q_OBJECT
public:
AudioCaptureWidget(QWidget *parent = nullptr) : QWidget(parent) {
QAudioFormat format;
format.setSampleRate(44100);
format.setChannelCount(1);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
audioInput = new QAudioInput(format, this);
file = new QFile("output.raw", this);
file->open(QIODevice::WriteOnly);
QPushButton *startButton = new QPushButton("Start Recording", this);
QPushButton *stopButton = new QPushButton("Stop Recording", this);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(startButton);
layout->addWidget(stopButton);
connect(startButton, &QPushButton::clicked, this, &AudioCaptureWidget::startRecording);
connect(stopButton, &QPushButton::clicked, this, &AudioCaptureWidget::stopRecording);
}
~AudioCaptureWidget() {
if (file->isOpen()) {
file->close();
}
}
private slots:
void startRecording() {
audioInput->start(file);
}
void stopRecording() {
audioInput->stop();
}
private:
QAudioInput *audioInput;
QFile *file;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
AudioCaptureWidget widget;
widget.resize(300, 200);
widget.show();
return app.exec();
}
#include "main.moc"
说明
- 格式设置:通过 QAudioFormat 设置采样率、通道数、样本大小、编码格式等。
- 打开文件:使用 QFile 打开一个文件以写入采集的数据。
- 开始和停止采集:通过 start() 和 stop() 方法控制音频的开始与结束。
播放音频数据
播放原始音频数据可以使用 QAudioOutput 类。这个类可以用来将音频数据流发送到音频输出设备(如扬声器)。
示例:
cpp
#include <QApplication>
#include <QAudioOutput>
#include <QFile>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
class AudioPlaybackWidget : public QWidget {
Q_OBJECT
public:
AudioPlaybackWidget(QWidget *parent = nullptr) : QWidget(parent) {
QAudioFormat format;
format.setSampleRate(44100);
format.setChannelCount(1);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
audioOutput = new QAudioOutput(format, this);
file = new QFile("output.raw", this);
file->open(QIODevice::ReadOnly);
QPushButton *playButton = new QPushButton("Play Audio", this);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(playButton);
connect(playButton, &QPushButton::clicked, this, &AudioPlaybackWidget::playAudio);
}
~AudioPlaybackWidget() {
if (file->isOpen()) {
file->close();
}
}
private slots:
void playAudio() {
audioOutput->start(file);
}
private:
QAudioOutput *audioOutput;
QFile *file;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
AudioPlaybackWidget widget;
widget.resize(300, 200);
widget.show();
return app.exec();
}
#include "main.moc"
说明
- 格式设置:与音频采集相同,需设置 QAudioFormat 。
- 读取文件:使用 QFile 打开包含音频数据的文件以进行读取。
- 播放音频:通过 start() 方法将音频数据流传递给 QAudioOutput 进行播放。
播放视频文件
QVideoWidget
QVideoWidget 是 Qt Multimedia 模块中的一个类,用于在应用程序中显示视频。它结合了 Qt 的图形视图功能,能够处理多种视频格式,并支持实时视频流的显示。
主要特性
- 视频播放:可以直接展示视频数据,包括本地文件或网络流。
- 与其他 Qt 组件的集成:可以与 QMediaPlayer 结合使用,以便更好地控制视频播放。
- 自定义界面:支持通过绘制和布局定制视频显示区域。
播放视频
以下是一个简单的示例,展示如何使用 QVideoWidget 和 QMediaPlayer 播放视频。
示例:
cpp
#include <QApplication>
#include <QVideoWidget>
#include <QMediaPlayer>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
class VideoPlayer : public QWidget {
Q_OBJECT
public:
VideoPlayer(QWidget *parent = nullptr) : QWidget(parent) {
player = new QMediaPlayer(this);
videoWidget = new QVideoWidget(this);
player->setVideoOutput(videoWidget);
player->setMedia(QUrl::fromLocalFile("path/to/your/video.mp4"));
QPushButton *playButton = new QPushButton("Play", this);
QPushButton *stopButton = new QPushButton("Stop", this);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(videoWidget);
layout->addWidget(playButton);
layout->addWidget(stopButton);
connect(playButton, &QPushButton::clicked, player, &QMediaPlayer::play);
connect(stopButton, &QPushButton::clicked, player, &QMediaPlayer::stop);
}
private:
QMediaPlayer *player;
QVideoWidget *videoWidget;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
VideoPlayer player;
player.resize(640, 480);
player.show();
return app.exec();
}
#include "main.moc"
说明
- 创建 QVideoWidget :实例化一个 QVideoWidget 对象用于显示视频。
- 创建 QMediaPlayer :实例化 QMediaPlayer 来管理和播放视频流。
- 设置视频输出:调用 setVideoOutput() 方法,将 QVideoWidget 设置为视频输出界面。
- 加载视频:使用 setMedia() 方法加载本地或网络视频。
- 控制播放:链接按钮的点击信号到 QMediaPlayer 的播放和停止槽。
QGraphicsVideoItem
QGraphicsVideoItem 是 Qt Multimedia 模块中的一个类,主要用于在 QGraphicsScene 中显示视频。它允许视频内容直接嵌入到图形项中,从而与其他图形元素(如文本、图形或其他自定义项)一起使用。
主要特性
- 集成性强:可以与 QGraphicsView 和 QGraphicsScene 轻松集成,使得在复杂界面中显示视频变得简单。
- 多媒体支持:支持多种视频格式,能够处理本地文件和实时视频流。
- 自定义能力:可以与其他图形项共同使用,支持丰富的自定义和动画效果。
使用 QGraphicsVideoItem 来播放视频
示例:如何使用 QGraphicsVideoItem 来播放视频。
cpp
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsVideoItem>
#include <QMediaPlayer>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
class VideoPlayer : public QWidget {
Q_OBJECT
public:
VideoPlayer(QWidget *parent = nullptr) : QWidget(parent) {
scene = new QGraphicsScene(this);
view = new QGraphicsView(scene, this);
player = new QMediaPlayer(this);
videoItem = new QGraphicsVideoItem();
scene->addItem(videoItem);
player->setVideoOutput(videoItem);
player->setMedia(QUrl::fromLocalFile("path/to/your/video.mp4"));
QPushButton *playButton = new QPushButton("Play", this);
QPushButton *stopButton = new QPushButton("Stop", this);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(view);
layout->addWidget(playButton);
layout->addWidget(stopButton);
connect(playButton, &QPushButton::clicked, player, &QMediaPlayer::play);
connect(stopButton, &QPushButton::clicked, player, &QMediaPlayer::stop);
}
private:
QGraphicsScene *scene;
QGraphicsView *view;
QMediaPlayer *player;
QGraphicsVideoItem *videoItem;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
VideoPlayer player;
player.resize(640, 480);
player.show();
return app.exec();
}
#include "main.moc"
说明
- 创建 QGraphicsScene 和 QGraphicsView :首先创建一个图形场景和视图,用于展示图形项。
- 实例化 QGraphicsVideoItem :创建一个 QGraphicsVideoItem ,用于视频展示。
- 设置视频输出:将视频播放器的输出设置为 QGraphicsVideoItem 。
- 加载视频:调用 setMedia() 方法加载视频文件。
- 控制播放:通过按钮控制视频的播放和停止。
摄像头操作
QMediaCaptureSession
QMediaCaptureSession 是 Qt Multimedia 模块中的一个类,用于捕获多媒体内容,如音频和视频。它提供了一种简便的方式来管理媒体输入(如摄像头和麦克风)和输出配置。
主要特性
- 音视频捕获:支持从摄像头和麦克风捕获音频和视频流。
- 灵活性:可以动态控制捕获设备的选择和参数设置。
- 信号与槽:使用 Qt 的信号与槽机制,能够方便地处理捕获的音视频数据。
- 多媒体处理:与其他多媒体类(如 QVideoSink , QAudioSink )结合使用,轻松管理音视频流。
适用场景
- 视频会议应用
- 录音和录像软件
- 安全监控系统
视频捕获
示例:如何使用 QMediaCaptureSession 进行视频捕获。
cpp
#include <QApplication>
#include <QCamera>
#include <QMediaCaptureSession>
#include <QCameraViewfinder>
#include <QCameraInfo>
#include <QVBoxLayout>
#include <QWidget>
class VideoCapture : public QWidget {
Q_OBJECT
public:
VideoCapture(QWidget *parent = nullptr) : QWidget(parent) {
auto camera = new QCamera(QCameraInfo::defaultCamera(), this);
auto viewfinder = new QCameraViewfinder(this);
session = new QMediaCaptureSession(this);
session->setCamera(camera);
camera->setViewfinder(viewfinder);
camera->start();
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(viewfinder);
setLayout(layout);
}
private:
QMediaCaptureSession *session;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
VideoCapture capture;
capture.resize(640, 480);
capture.show();
return app.exec();
}
#include "main.moc"
说明
- 创建摄像头实例:使用 QCamera 和 QCameraInfo 获取默认摄像头。
- 创建视频查看器:使用 QCameraViewfinder 显示摄像头捕获的视频。
- 初始化捕获会话:使用 QMediaCaptureSession 来管理捕获,调用 setCamera() 方法将摄像头添加到会话中。
- 启动摄像头:调用 start() 方法开始视频捕获。
使用 Qt 实现摄像头拍照操作
在 Qt Multimedia 中,摄像头拍照操作主要通过 QCamera 和 QCameraImageCapture 类来实现。以下是摄像头拍照的基本概念和 示例:。
主要组件
- QCamera:用于访问和控制摄像头设备。
- QCameraImageCapture:用于捕获照片,处理图像和保存文件。
基本步骤
- 初始化摄像头:选择并初始化一个摄像头。
- 创建图像捕获对象:用于执行拍照操作。
- 连接信号槽:处理拍照完成的事件。
- 开始摄像头:启动摄像头。
- 拍照操作:调用拍照方法并保存图像。
示例:
cpp
#include <QApplication>
#include <QCamera>
#include <QCameraImageCapture>
#include <QCameraViewfinder>
#include <QVBoxLayout>
#include <QPushButton>
#include <QWidget>
#include <QDir>
#include <QDateTime>
class CameraCapture : public QWidget {
Q_OBJECT
public:
CameraCapture(QWidget *parent = nullptr) : QWidget(parent) {
camera = new QCamera(QCameraInfo::defaultCamera(), this);
viewfinder = new QCameraViewfinder(this);
imageCapture = new QCameraImageCapture(camera, this);
camera->setViewfinder(viewfinder);
camera->start();
QPushButton *captureButton = new QPushButton("Capture", this);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(viewfinder);
layout->addWidget(captureButton);
connect(captureButton, &QPushButton::clicked, this, &CameraCapture::captureImage);
connect(imageCapture, &QCameraImageCapture::imageCaptured, this, &CameraCapture::imageSaved);
setLayout(layout);
}
private slots:
void captureImage() {
QString fileName = QDir::homePath() + "/capture_" + QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss") + ".jpg";
imageCapture->capture(fileName); // Capturing the image
}
void imageSaved(int id, const QString &file) {
qDebug() << "Image saved to:" << file; // Log the saved image path
}
private:
QCamera *camera;
QCameraViewfinder *viewfinder;
QCameraImageCapture *imageCapture;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
CameraCapture capture;
capture.resize(640, 480);
capture.show();
return app.exec();
}
#include "main.moc"
说明
- 创建摄像头:使用 QCameraInfo::defaultCamera() 获取默认摄像头。
- 设置查看器:将 QCameraViewfinder 作为摄像头的查看器,以显示实时画面。
- 创建图像捕获对象:使用 QCameraImageCapture 进行图像捕获。
- 布局:使用 QVBoxLayout 布局,不带按钮和查看器。
- 连接信号槽:当点击捕获按钮时,调用 captureImage() 方法。捕获完成后,会触发 imageCaptured 信号。
- 保存图像:生成文件名并调用 capture() 方法保存图像。
使用 Qt 实现摄像头录像操作
在 Qt Multimedia 中,摄像头录像操作可以通过 QCamera 和 QMediaRecorder 类来实现。以下是摄像头录像的基本概念和使用示例。
主要组件
- QCamera:用于访问和控制摄像头设备。
- QMediaRecorder:用于录制音频和视频。
基本步骤
- 初始化摄像头:选择并初始化一个摄像头。
- 创建媒体录制对象:设置录制参数。
- 连接信号槽:处理录制状态和完成事件。
- 开始摄像头:启动摄像头以进行实时预览。
- 开始/停止录制:控制录制的开始和结束。
示例:
cpp
#include <QApplication>
#include <QCamera>
#include <QMediaRecorder>
#include <QCameraViewfinder>
#include <QVBoxLayout>
#include <QPushButton>
#include <QWidget>
#include <QDir>
#include <QDateTime>
#include <QDebug>
class VideoCapture : public QWidget {
Q_OBJECT
public:
VideoCapture(QWidget *parent = nullptr) : QWidget(parent) {
camera = new QCamera(QCameraInfo::defaultCamera(), this);
viewfinder = new QCameraViewfinder(this);
mediaRecorder = new QMediaRecorder(camera, this);
camera->setViewfinder(viewfinder);
camera->start();
QPushButton *recordButton = new QPushButton("Start Recording", this);
connect(recordButton, &QPushButton::clicked, this, &VideoCapture::toggleRecording);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(viewfinder);
layout->addWidget(recordButton);
setLayout(layout);
// 设置录制文件路径
QString fileName = QDir::homePath() + "/video_" + QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss") + ".mp4";
mediaRecorder->setOutputLocation(QUrl::fromLocalFile(fileName));
mediaRecorder->setMediaStatus(QMediaRecorder::Recording);
}
private slots:
void toggleRecording() {
if (mediaRecorder->status() == QMediaRecorder::RecordingStatus::Recording) {
mediaRecorder->stop();
qDebug() << "Recording stopped.";
} else {
mediaRecorder->record();
qDebug() << "Recording started.";
}
}
private:
QCamera *camera;
QCameraViewfinder *viewfinder;
QMediaRecorder *mediaRecorder;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
VideoCapture capture;
capture.resize(640, 480);
capture.show();
return app.exec();
}
#include "main.moc"
说明
- 创建摄像头:使用 QCameraInfo::defaultCamera() 获取默认摄像头。
- 设置查看器:将 QCameraViewfinder 作为摄像头的查看器,以显示实时画面。
- 创建媒体录制对象:使用 QMediaRecorder 进行视频录制。
- 配置录制路径:设置输出文件的路径和格式(如 MP4)。
- 布局:使用 QVBoxLayout 布局放置查看器和按钮。
- 控制录制:通过 toggleRecording() 方法控制录像的开始和停止。