QT 屏幕录制

qt6.5.0屏幕录制

记录一下本次开发踩到的坑,qt开发屏幕录制最坑的点是m_screen_caputure->setActive(true);
录制前需要先激活屏幕捕获。不然会直接报找不到编码器的错误。其他废话不多说,直接上代码
widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMediaRecorder>
#include <QMediaCaptureSession>
#include <QScreenCapture>
#include <QAudioInput>
#include <QMediaFormat>
#include <QMediaDevices>
#include <QAudioDevice>
#include <QTimer>
#include <QTime>

QT_BEGIN_NAMESPACE
namespace Ui {
   
   
class Widget;
}

QT_END_NAMESPACE

class Widget : public QWidget
{
   
   
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private:
    void initSrceen();//初始化屏幕
    void initAudioDev();//初始化音频设备
    void initVideoCodec();//初始化视频编码格式
    void initAudioCodec();//初始化音频编码格式
    void initFileFormat();//初始化文件格式
    void initQuality();//初始化音视频质量
    void updateStateEnable(bool bl);//更新控件使能

    void showRecordDuration();//显示录制时长
    void showError(QMediaRecorder::Error error, const QString &errorString);//显示错误信息
private slots: 
    void on_btn_start_record_clicked();

    void on_btn_stop_record_clicked();

    void on_btn_pause_record_clicked();

    void on_comboBox_video_encode_format_currentIndexChanged(int index);

    void on_comboBox_audio_encode_format_currentIndexChanged(int index);

    void on_comboBox_file_format_currentIndexChanged(int index);

    void on_comboBox_video_quality_currentIndexChanged(int index);

    void on_comboBox_audio_currentIndexChanged(int index);

    void on_comboBox_screen_currentIndexChanged(int index);

    void on_tbtn_set_dir_clicked();

private:
    Ui::Widget *ui;
    QMediaCaptureSession m_captureSession;
    QMediaRecorder m_recorder;

    QScreenCapture *m_screen_caputure = nullptr;
    QScreen *m_srceen = nullptr;

    QAudioDevice m_dev;
    QAudioInput m_audio;

    QMediaFormat format;

    //屏幕设备列表
    QList<QScreen *> m_screenList;

    //音频设备列表
    QList<QAudioDevice> m_audioInputList;

    QTimer *m_timer;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include 
Qt中实现屏幕录制和窗口录制的功能可以通过多种方式完成,具体取决于项目需求以及使用的Qt版本。 ### 使用 Qt6 多媒体类进行屏幕录制 Qt6 提供了更强大的多媒体支持功能,可以使用 `QMediaCaptureSession`、`QScreenCapture` 和 `QMediaRecorder` 类来实现屏幕录制。这些类为开发人员提供了便捷的方式来捕获屏幕内容并将其保存为视频文件[^1]。 - **QScreenCapture**:该类用于捕获整个屏幕的内容。它最低需要 Qt6.5 版本,并且能够与 `QMediaCaptureSession` 结合使用以指定捕获源。 - **QMediaRecorder**:这个类负责将捕获到的数据编码成视频文件。通过设置不同的参数,可以控制输出视频的质量和格式。 - **QWindowCapture**:如果目标是特定窗口而非整个桌面,则可利用此类来捕获单个窗口的内容。此外,静态函数 `QList<QCapturableWindow> capturableWindows()` 可用来列举当前系统中所有可录制的窗口[^1]。 UI部分推荐使用 QML 来构建用户界面,这样可以让应用程序具有更加现代化和响应式的外观。 ### 示例代码(基于 Qt6) ```cpp // 创建媒体捕获会话 QMediaCaptureSession captureSession; // 初始化屏幕捕获对象 QScreenCapture *screenCapture = new QScreenCapture(); captureSession.setVideoSource(screenCapture); // 设置媒体记器 QMediaRecorder *recorder = new QMediaRecorder(); captureSession.setRecorder(recorder); // 配置视频编码选项 QVideoEncoderSettings settings; settings.setCodec("video/x-raw"); settings.setResolution(1920, 1080); // 设置分辨率 settings.setBitRate(2048); // 比特率 settings.setFrameRate(30); // 帧率 recorder->setVideoSettings(settings); // 指定输出文件路径 recorder->setOutputLocation(QUrl::fromLocalFile("path/to/output.mp4")); // 开始录制 recorder->record(); ``` ### 利用 FFmpeg 进行自定义编码 对于那些希望对视频编码过程有更多控制权的情况,可以在 Qt 项目中集成 FFmpeg 库。这通常涉及到直接处理原始像素数据并将它们传递给 FFmpeg 的 API 来生成最终的视频文件[^3]。这种方法虽然复杂度较高,但同时也提供了极大的灵活性。 要在 .pro 文件中链接 FFmpeg 库,添加如下行: ```qmake LIBS += -lavcodec -lavformat -lavutil -lswscale ``` 然后,在 C++ 源码中包含必要的头文件并编写相应的初始化、读取帧数据、编码及清理资源的逻辑。 ### 其他方法 除了上述现代的方法外,还可以考虑使用较旧版本 Qt 中提供的 `QScreen` 和 `QVideoEncoder` 类来实现基础的屏幕录制功能[^2]。不过需要注意的是,随着新版本 Qt 的发布,某些旧有的类可能会被标记为废弃或者不再推荐使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雷久虎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值