当前位置:   article > 正文

【项目实战】Qt6 录制屏幕、录制声音生成MP4、AVI、MA3等(完整源码,可直接编译使用)_qt6如何将屏幕图像采集为媒体流

qt6如何将屏幕图像采集为媒体流


前言

  本文将详细介绍如何利用Qt6多媒体模块中的QMediaCaptureSession、QMediaRecorder、QScreenCapture、QAudioInput、QMediaFormat等功能,实现对屏幕和声音的录制,并生成常见的媒体格式文件,如MP4、AVI、MA3等。我们将探讨如何利用这些功能来实现灵活的视频和音频参数设置,以满足不同需求下的录制和生成要求。我们将重点讨论如何配置视频和音频参数,包括分辨率、帧率、编解码器选择、音频采样率、声道设置等。通过本文,您将了解如何利用Qt6的多媒体模块,轻松实现对屏幕和声音的录制,并生成您所需的多媒体格式文件。


完整源码已上传,但审核较慢,如有需要可先收藏。

一、运行截图

在这里插入图片描述
在这里插入图片描述

二、项目目录结构

testrecord/                  项目目录
├── capturerecorder.cpp      录制功能类源文件
├── capturerecorder.h        录制功能类头文件
├── images                   界面图标根目录
│   ├── app.ico              应用程序图标
│   ├── info-circle.png
│   ├── open-folder.png
│   ├── pause.png
│   ├── refresh.png
│   ├── select-folder.png
│   ├── start.png
│   └── stop.png
├── main.cpp                主函数所在文件
├── resource.qrc            qt资源文件
├── testrecord.pro          qt项目文件
├── widget.cpp              主界面源文件
├── widget.h                主界面头文件
└── widget.ui               主界面ui

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

三、项目文件配置

1.添加模块 multimedia

QT       += core gui multimedia
  • 1

2. 修改应用程序图标

RC_ICONS = images/app.ico
  • 1

四、使用到的Qt技术

1. QMediaCaptureSession

  QMediaCaptureSession类是Qt6多媒体模块中的一个重要类,它提供了对多媒体捕获会话的控制和管理功能。通过QMediaCaptureSession类,您可以轻松地管理和控制多媒体捕获设备,如摄像头、麦克风等,实现对视频和音频的捕获。该类提供了开始、暂停、停止捕获会话的方法,以及捕获状态的监控功能,让您可以方便地管理捕获过程。另外,QMediaCaptureSession类还提供了信号和槽机制,让您可以方便地与其他多媒体类进行交互,实现更复杂的多媒体处理功能。

项目中使用到:

m_session->setAudioInput(m_audioInput);  //声音输入
m_session->setScreenCapture(m_screen);   //屏幕图像输入
m_session->setRecorder(m_recorder);      //录制
  • 1
  • 2
  • 3

2. QMediaRecorder

  QMediaRecorder类是Qt6多媒体模块中的一个重要类,它提供了对音频和视频的录制功能。通过QMediaRecorder类,您可以轻松地实现对音频和视频的录制,并生成常见的媒体格式文件,如MP4、AVI、MA3等。该类提供了开始录制、暂停录制、停止录制的方法,以及录制状态的监控功能,让您可以方便地管理录制过程。另外,QMediaRecorder类还提供了丰富的配置选项,包括视频参数和音频参数的设置,如分辨率、帧率、编解码器选择、音频采样率、声道设置等,让您可以根据实际需求进行灵活的配置。

项目中使用到:

m_recorder->record(); //开始录制
m_recorder->stop();   //停止录制
m_recorder->pause();  //暂停录制
m_recorder->setQuality((QMediaRecorder::Quality)quality); //设置视频质量
  • 1
  • 2
  • 3
  • 4

3. QScreenCapture

屏幕捕获

项目中使用到:

m_screen->setScreen(qApp->primaryScreen()); //设置要录制的屏幕
m_screen->setActive(true); 	//激活录制
  • 1
  • 2

4. QAudioInput

  QAudioInput类是Qt中用于音频输入的类,它提供了对音频输入设备(如麦克风)的访问和控制。通过QAudioInput类,您可以实现对音频输入设备的录制,获取音频数据,并进行处理或存储。该类可以用于实时音频采集、语音识别、音频分析等应用场景。

项目中使用到:

//获取默认输入设备
m_audioInput = new QAudioInput(QMediaDevices::defaultAudioInput(), this);
  • 1
  • 2

5. QMediaFormat

  用于设置打包格式、视频编码器、音频编码器等参数。

项目中使用到:

m_mediaFormat.setFileFormat((QMediaFormat::FileFormat)format); //设置打包格式
m_mediaFormat.setVideoCodec((QMediaFormat::VideoCodec)codec);//设置视频编码
  • 1
  • 2

五、主界面类

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDateTime>
#include "capturerecorder.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void slotRefreshAudioInput();//刷新声音输入设备
    void slotOpenDirClicked();   //打开输出目录
    void slotSelectDirClicked(); //选择输出目录
    void slotRestoreClicked();   //恢复默认设置
    void slotStart();            //开始/暂停录制
    void slotStop();             //停止录制
    void slotDurationChanged(qint64 duration); //录制时长
    void slotRecorderStateChanged(QMediaRecorder::RecorderState state);
private:
    Ui::Widget          *ui;
    bool                m_running = false;
    bool                m_paused = false;
    CaptureRecorder*    m_pCapture = nullptr;
    QDateTime           m_duration;//录制时长
};
#endif // WIDGET_H

  • 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

具体实现,参见完整源码工程

六、录制类

#pragma once
#include <QMediaRecorder>
#include <QMediaFormat>
class QMediaCaptureSession;
class QMediaRecorder;
class QScreenCapture;
class QAudioInput;

class CaptureRecorder  : public QObject
{
    Q_OBJECT

public:
    CaptureRecorder(QObject *parent);
    ~CaptureRecorder();
    /**
     * 开始录制
     */
    void record();
    /**
     * 停止录制
     */
    void stop();
    /**
     * 暂停录制
     */
    void pause();
    /**
     * 恢复录制
     */
    void resume();
    /**
     * 是否录制中
     */
    bool isAvailable() const;

    /**
     * 开启录制屏幕
     */
    void enableScreenCapture(bool enable);

    /**
     * 设置文件输出格式
     */
    void setFileFormat(int format);
    /**
     * 设置视频编码器
     */
    void setVideoCodec(int codec);
    /**
     * 设置视频帧率
     */
    void setVideoFrameRate(qreal frameRate);
    /**
     * 设置比特率
     */
    void setVideoBitRate(int bitRate);

    /**
     * 设置录制质量
     */
    void setQuality(int quality);

    /**
     * 设置输出路径
     */
    void setOutputLocation(const QString &location);
signals:
     void durationChanged(qint64 duration);
     void recorderStateChanged(QMediaRecorder::RecorderState state);
private:
    QMediaFormat            m_mediaFormat;
    QMediaCaptureSession*   m_session = nullptr;
    QMediaRecorder*         m_recorder = nullptr;
    QScreenCapture*         m_screen = nullptr;
    QAudioInput*            m_audioInput = nullptr;
};

  • 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

具体实现,参见完整源码工程

七、工程下载(完整源码)

https://download.csdn.net/download/yegu001/88772210


总结

✍结尾 ❤️ 感谢您的支持和鼓励关注不迷路✍

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/91219
推荐阅读
相关标签
  

闽ICP备14008679号