案例分享:Qt+FFmpeg录屏应用(支持帧率、清晰度设置)

35 篇文章 23 订阅
14 篇文章 28 订阅

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/109827936
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

合作案例专栏:案例分享(体验Demo可下载,只定制)


需求

  实现录屏功能。


原理

  使用抓屏模块按照指定范围和帧率抓屏,同时使用录像模块按照指定图像大小和帧率录制。


Demo

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


体验下载地址

  CSDN:https://download.csdn.net/download/qq21497936/13126842
  QQ群:1047134658(点击“文件”搜索“ffmpegRecord”,群内与博文同步更新)


v1.0.0

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

#ifndef RECORDWIDGET_H
#define RECORDWIDGET_H

#include <QWidget>
#include <QThread>
#include <QFileDialog>
#include <QDateTime>
#include "GrabWindowManager.h"
#include "FFmpegRecordManager.h"

namespace Ui {
class RecordWidget;
}

class RecordWidget : public QWidget
{
    Q_OBJECT

public:
    explicit RecordWidget(QWidget *parent = 0);
    ~RecordWidget();

protected slots:
    void slot_timeChange(int time);

private slots:
    void on_pushButton_startRecord_clicked();
    void on_pushButton_stopRecord_clicked();
    void on_pushButton_browser_clicked();

private:
    Ui::RecordWidget *ui;

    GrabWindowManager *_pGrabWindowManager;         // 抓屏管理类
    QThread *_pGrabWindowManagerThread;             // 抓屏线程

    FFmpegRecordManager *_pFFmpegRecordManager;     // 录制管理类
    QThread *_pFFmpegRecordManagerThread;           // 录制线程
};

#endif // RECORDWIDGET_H
#include "RecordWidget.h"
#include "ui_RecordWidget.h"
#include <QDateTime>

RecordWidget::RecordWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::RecordWidget),
    _pGrabWindowManager(0),
    _pGrabWindowManagerThread(0)
{
    ui->setupUi(this);

    QString version = "v1.0.0";
    setWindowTitle(QString("录屏Demo %1(作者:红胖子(AAA红模仿) QQ:21497936 微信:yangsir198808 博客地址:blog.csdn.net/qq21497936)").arg(version));

    // 初始化抓屏线程
    _pGrabWindowManagerThread = new QThread();
    _pGrabWindowManager = new GrabWindowManager();
    _pGrabWindowManager->moveToThread(_pGrabWindowManagerThread);
    connect(_pGrabWindowManager, SIGNAL(signal_timeChange(int)),
            this, SLOT(slot_timeChange(int)));
    _pGrabWindowManagerThread->start();
    // 初始化录制线程
    _pFFmpegRecordManagerThread = new QThread();
    _pFFmpegRecordManager = new FFmpegRecordManager();
    _pFFmpegRecordManager->moveToThread(_pFFmpegRecordManagerThread);
    connect(_pFFmpegRecordManagerThread, SIGNAL(started()),
            _pFFmpegRecordManager, SLOT(slot_start()));
    _pFFmpegRecordManagerThread->start();
    // 关联信号
    connect(_pGrabWindowManager, SIGNAL(signal_grapWindow(QImage)),
            _pFFmpegRecordManager, SLOT(slot_encoderOneFrame(QImage)));
    // 按键状态初始化
    ui->pushButton_startRecord->setEnabled(true);
    ui->pushButton_stopRecord->setEnabled(false);
    ui->lineEdit_dirPath->setReadOnly(true);
    ui->lineEdit_dirPath->setText(QCoreApplication::applicationDirPath());
    ui->lineEdit_value->setValidator(new QIntValidator(1, 100));
    ui->lineEdit_fps->setValidator(new QIntValidator(5, 50));
}

RecordWidget::~RecordWidget()
{
    delete ui;
}

void RecordWidget::slot_timeChange(int time)
{
    ui->label_time->setText(QString("%1%2:%3%4").arg(time/60/10)
                                                 .arg(time/60%10)
                                                 .arg(time%60/10)
                                                 .arg(time%10));
}

void RecordWidget::on_pushButton_startRecord_clicked()
{
    slot_timeChange(0);

    QScreen *pScreen = QGuiApplication::primaryScreen();
    QRect rect = pScreen->availableGeometry();

    _pFFmpegRecordManager->setFps(ui->lineEdit_fps->text().toInt());
    _pFFmpegRecordManager->setWidthIn(rect.width());
    _pFFmpegRecordManager->setHeightIn(rect.height());
    _pFFmpegRecordManager->setWidthOut(rect.width());
    _pFFmpegRecordManager->setHeightOut(rect.height());
    _pFFmpegRecordManager->setValue(ui->lineEdit_value->text().toInt());
    _pFFmpegRecordManager->slot_startEncoder(QString("%1/%2.mp4")
                                             .arg(ui->lineEdit_dirPath->text())
                                             .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh_mm_ss")),
                                             AV_PIX_FMT_BGRA);

    _pGrabWindowManager->slot_startGrabWindow(rect.x(),
                                              rect.y(),
                                              rect.width(),
                                              rect.height(),
                                              ui->lineEdit_fps->text().toInt());

    ui->pushButton_startRecord->setEnabled(false);
    ui->pushButton_stopRecord->setEnabled(true);
    ui->pushButton_browser->setEnabled(false);
    ui->lineEdit_fps->setEnabled(false);
    ui->lineEdit_value->setEnabled(false);
}

void RecordWidget::on_pushButton_stopRecord_clicked()
{
    _pGrabWindowManager->slot_stopGrabWindow();
    _pFFmpegRecordManager->slot_stopEncoder();
    ui->pushButton_startRecord->setEnabled(true);
    ui->pushButton_stopRecord->setEnabled(false);
    ui->pushButton_browser->setEnabled(true);
    ui->lineEdit_fps->setEnabled(true);
    ui->lineEdit_value->setEnabled(true);
}

void RecordWidget::on_pushButton_browser_clicked()
{
    QString dir = QFileDialog::getExistingDirectory(0, "保存到文件夹", ".");
    if(dir.isEmpty())
    {
        return;
    }
    ui->lineEdit_dirPath->setText(dir);
}

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/109827936

  • 19
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
您好!要在Qt中使用FFmpeg进行屏幕和音频录制,您需要以下步骤: 1. 首先,确保您已经正确安装了FFmpeg库,并且在Qt项目中配置了相应的链接器设置。 2. 创建一个Qt项目,并在需要录制屏幕和音频的位置添加以下代码段: ```cpp #include <QProcess> void startRecording() { QString outputFileName = "output.mp4"; // 设置输出文件名和路径 // 构建FFmpeg命令行参数 QStringList ffmpegArgs; ffmpegArgs << "-f" << "x11grab" << "-s" << "1366x768" << "-i" << ":0.0" << "-f" << "pulse" << "-ac" << "2" << "-i" << "default" << "-vcodec" << "libx264" << "-preset" << "ultrafast" << "-acodec" << "aac" << "-strict" << "experimental" << outputFileName; // 启动FFmpeg进程进行录制 QProcess ffmpegProcess; ffmpegProcess.start("ffmpeg", ffmpegArgs); ffmpegProcess.waitForStarted(); } void stopRecording() { // 停止FFmpeg进程 QProcess::execute("pkill", QStringList() << "ffmpeg"); } ``` 上述代码片段定义了两个函数 `startRecording` 和 `stopRecording`,分别用于开始录制和停止录制。 `startRecording` 函数中,我们设置了输出文件名和路径,并构建了一个包含必要参数的FFmpeg命令行参数列表。然后,我们使用`QProcess`类启动FFmpeg进程,并等待它开始。 `stopRecording` 函数中,我们使用`QProcess::execute`函数停止FFmpeg进程。 请注意,上述代码是一个简单示例,您可能需要根据您的特定需求进行修改和调整。 希望这能帮到您!如有其他问题,请随时提问。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

长沙红胖子Qt(长沙创微智科)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值