重学Qt——多媒体

多媒体

多媒体模块

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"

说明

  1. 创建 QMediaPlayer 实例: QMediaPlayer *player = new QMediaPlayer(this); 创建媒体播放器对象。
  2. 设置媒体文件:使用 setMedia() 方法指定要播放的音频或视频文件路径。
  3. 播放控制:使用 play() , pause() , 和 stop() 方法分别控制播放、暂停和停止。
  4. 音量控制:通过 setVolume() 方法调整音量。音量滑块用于实时调节音量。
  5. 信号与槽:使用 Qt 的信号槽机制连接按钮的点击事件以控制播放。

常见用法

  • 音频播放器:用于构建简单的音乐播放器应用。
  • 视频播放:结合 QVideoWidget 可实现视频播放功能。
  • 流媒体播放:支持从 URL 播放在线音频和视频流。

录制音频

QMediaRecorder

QMediaRecorder 是 Qt Multimedia 模块中的一个类,用于录制音频和视频。它提供了简单的接口,使开发者能够将录制功能集成到应用程序中。

主要功能和特性

  1. 音频录制:支持将音频数据录制到文件中。
  2. 视频录制:可以录制视频流,包括来自摄像头的视频。
  3. 格式支持:可以选择多种文件格式,如 MP4、AVI、WAV 等。
  4. 录制控制:提供开始、停止录制的控制方法。
  5. 音量和质量调整:可以设置录制时的音量和视频质量。
使用 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"

说明

  1. 创建音频格式:使用 QAudioFormat 定义录音的参数,例如采样率、通道数和样本大小。
  2. 创建 QAudioInput:用于捕获音频输入的数据流。
  3. 创建 QMediaRecorder:关联音频输入和录音器,使用 setOutputLocation() 指定录音文件的保存路径。
  4. 控制录音:通过 record() 和 stop() 方法开始和停止录音。
  5. 信号与槽:通过按钮触发录音开始和结束。

常见用法

  • 音频录音应用:构建录音机或语音备忘录应用。
  • 会议记录:用于录制会议或访谈音频。
  • 声音注释:用户可以为文档或图片添加音频注释。

采集和播放原始音频数据

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 的图形视图功能,能够处理多种视频格式,并支持实时视频流的显示。

主要特性

  1. 视频播放:可以直接展示视频数据,包括本地文件或网络流。
  2. 与其他 Qt 组件的集成:可以与 QMediaPlayer 结合使用,以便更好地控制视频播放。
  3. 自定义界面:支持通过绘制和布局定制视频显示区域。
播放视频

以下是一个简单的示例,展示如何使用 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"

说明

  1. 创建 QVideoWidget :实例化一个 QVideoWidget 对象用于显示视频。
  2. 创建 QMediaPlayer :实例化 QMediaPlayer 来管理和播放视频流。
  3. 设置视频输出:调用 setVideoOutput() 方法,将 QVideoWidget 设置为视频输出界面。
  4. 加载视频:使用 setMedia() 方法加载本地或网络视频。
  5. 控制播放:链接按钮的点击信号到 QMediaPlayer 的播放和停止槽。

QGraphicsVideoItem

QGraphicsVideoItem 是 Qt Multimedia 模块中的一个类,主要用于在 QGraphicsScene 中显示视频。它允许视频内容直接嵌入到图形项中,从而与其他图形元素(如文本、图形或其他自定义项)一起使用。

主要特性

  1. 集成性强:可以与 QGraphicsView 和 QGraphicsScene 轻松集成,使得在复杂界面中显示视频变得简单。
  2. 多媒体支持:支持多种视频格式,能够处理本地文件和实时视频流。
  3. 自定义能力:可以与其他图形项共同使用,支持丰富的自定义和动画效果。
使用 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"

说明

  1. 创建 QGraphicsScene 和 QGraphicsView :首先创建一个图形场景和视图,用于展示图形项。
  2. 实例化 QGraphicsVideoItem :创建一个 QGraphicsVideoItem ,用于视频展示。
  3. 设置视频输出:将视频播放器的输出设置为 QGraphicsVideoItem 。
  4. 加载视频:调用 setMedia() 方法加载视频文件。
  5. 控制播放:通过按钮控制视频的播放和停止。

摄像头操作

QMediaCaptureSession

QMediaCaptureSession 是 Qt Multimedia 模块中的一个类,用于捕获多媒体内容,如音频和视频。它提供了一种简便的方式来管理媒体输入(如摄像头和麦克风)和输出配置。

主要特性

  1. 音视频捕获:支持从摄像头和麦克风捕获音频和视频流。
  2. 灵活性:可以动态控制捕获设备的选择和参数设置。
  3. 信号与槽:使用 Qt 的信号与槽机制,能够方便地处理捕获的音视频数据。
  4. 多媒体处理:与其他多媒体类(如 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"

说明

  1. 创建摄像头实例:使用 QCamera 和 QCameraInfo 获取默认摄像头。
  2. 创建视频查看器:使用 QCameraViewfinder 显示摄像头捕获的视频。
  3. 初始化捕获会话:使用 QMediaCaptureSession 来管理捕获,调用 setCamera() 方法将摄像头添加到会话中。
  4. 启动摄像头:调用 start() 方法开始视频捕获。
使用 Qt 实现摄像头拍照操作

在 Qt Multimedia 中,摄像头拍照操作主要通过 QCamera 和 QCameraImageCapture 类来实现。以下是摄像头拍照的基本概念和 示例:。

主要组件

  1. QCamera:用于访问和控制摄像头设备。
  2. QCameraImageCapture:用于捕获照片,处理图像和保存文件。

基本步骤

  1. 初始化摄像头:选择并初始化一个摄像头。
  2. 创建图像捕获对象:用于执行拍照操作。
  3. 连接信号槽:处理拍照完成的事件。
  4. 开始摄像头:启动摄像头。
  5. 拍照操作:调用拍照方法并保存图像。

示例:

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"

说明

  1. 创建摄像头:使用 QCameraInfo::defaultCamera() 获取默认摄像头。
  2. 设置查看器:将 QCameraViewfinder 作为摄像头的查看器,以显示实时画面。
  3. 创建图像捕获对象:使用 QCameraImageCapture 进行图像捕获。
  4. 布局:使用 QVBoxLayout 布局,不带按钮和查看器。
  5. 连接信号槽:当点击捕获按钮时,调用 captureImage() 方法。捕获完成后,会触发 imageCaptured 信号。
  6. 保存图像:生成文件名并调用 capture() 方法保存图像。
使用 Qt 实现摄像头录像操作

在 Qt Multimedia 中,摄像头录像操作可以通过 QCamera 和 QMediaRecorder 类来实现。以下是摄像头录像的基本概念和使用示例。

主要组件

  1. QCamera:用于访问和控制摄像头设备。
  2. QMediaRecorder:用于录制音频和视频。

基本步骤

  1. 初始化摄像头:选择并初始化一个摄像头。
  2. 创建媒体录制对象:设置录制参数。
  3. 连接信号槽:处理录制状态和完成事件。
  4. 开始摄像头:启动摄像头以进行实时预览。
  5. 开始/停止录制:控制录制的开始和结束。

示例:

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"

说明

  1. 创建摄像头:使用 QCameraInfo::defaultCamera() 获取默认摄像头。
  2. 设置查看器:将 QCameraViewfinder 作为摄像头的查看器,以显示实时画面。
  3. 创建媒体录制对象:使用 QMediaRecorder 进行视频录制。
  4. 配置录制路径:设置输出文件的路径和格式(如 MP4)。
  5. 布局:使用 QVBoxLayout 布局放置查看器和按钮。
  6. 控制录制:通过 toggleRecording() 方法控制录像的开始和停止。
相关推荐
yugi9878382 小时前
基于Qt的图像处理系统
开发语言·图像处理·qt
努力努力再努力wz15 小时前
【Qt入门系列】:按钮组件全解析:从 QAbstractButton 到快捷键事件、单选与复选机制
c语言·开发语言·数据结构·c++·git·qt·github
奇树谦16 小时前
QML 开发前端界面详解:从入门到示例实战
qt
我在人间贩卖青春17 小时前
重学Qt——网络编程
qt
caicai_xiaobai21 小时前
Notepad++手动安装 Hex-Editor 插件
qt
郝学胜-神的一滴1 天前
Qt 高级开发 015:C++ 原生实现信号槽机制
开发语言·c++·qt·软件构建·用户界面
我在人间贩卖青春1 天前
重学Qt——数据可视化
qt
sycmancia1 天前
Qt——查找对话框的功能实现
开发语言·qt
x秀x1 天前
双击EXE启动程序,出现QT动态链接库报错,解决方法
开发语言·qt