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

 

需求

  实现录屏功能。

 

原理

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

 

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

项目实战:Qt+FFmpeg录屏应用(支持帧率、清晰度设置)的更多相关文章

  1. 【原创】FFMPEG录屏入门指南

    下载ffmpeg 点击 ffmpeg官网,选择windows,然后点击Windows builds from gyan.dev: 也可以直接点击 https://www.gyan.dev/ffmpeg ...

  2. ffmpeg 录屏 screen capture recorder

    ffmpeg在Linux下用X11grab进行屏幕录像,在Windows下用DirectShow滤镜 首先需要安装一个软件,screen capture recorder 编译好的下载地址是: htt ...

  3. Unity 利用FFmpeg实现录屏、直播推流、音频视频格式转换、剪裁等功能

    目录 一.FFmpeg简介. 二.FFmpeg常用参数及命令. 三.FFmpeg在Unity 3D中的使用. 1.FFmpeg 录屏. 2.FFmpeg 推流. 3.FFmpeg 其他功能简述. 一. ...

  4. 【原创】推流录屏软件OBS使用教程--录屏

    之前有录屏需要,写了一篇关于ffmpeg录屏的文章,反响还不错,但是直接用ffmpeg门槛有些高,今天写一篇图形界面的录屏推流工具OBS的使用教程.这次先写OBS的录屏教程 下载安装 点击 OBS官网 ...

  5. Android项目实战--手机卫士开发系列教程

    <ignore_js_op> banner131010.jpg (71.4 KB, 下载次数: 0) 下载附件  保存到相册 2 分钟前 上传   Android项目实战--手机卫士01- ...

  6. 项目实战:Qt+Ffmpeg+OpenCV相机程序(打开摄像头、支持多种摄像头、分辨率调整、翻转、旋转、亮度调整、拍照、录像、回放图片、回放录像)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  7. 基于FFMpeg的C#录屏全攻略

    最近负责一个录屏的小项目,需要录制Windows窗口内容并压缩保存到指定文件夹,本想使用已有的录屏软件,但是本着学习的态度去探索了FFMpeg,本文主要介绍基于FFMpeg开源项目的C#录屏软件开发. ...

  8. FFmpeg获取DirectShow设备数据(摄像头,录屏)

    这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘.本文所述的方法主要是对应Windows平台的. 1.       列设备 ffmpeg -list_devic ...

  9. 【转】FFmpeg获取DirectShow设备数据(摄像头,录屏)

    这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘.本文所述的方法主要是对应Windows平台的. 1.       列设备 ffmpeg -list_devic ...

  10. Qt编写自定义控件35-GIF录屏控件

    一.前言 在平时的写作过程中,经常需要将一些操作动作和效果图截图成gif格式,使得涵盖的信息更全面更生动,有时候可以将整个操作过程和运行效果录制成MP4,但是文件体积比较大,而且很多网站不便于上传,基 ...

随机推荐

  1. [转帖]如何在 Linux 中使用ss命令监控网络连接

    https://zhuanlan.zhihu.com/p/99421574 ss命令是用于在Linux系统上显示与网络套接字相关的信息的工具. 该工具显示netstat命令的更多详细信息,该命令用于显 ...

  2. [转帖]jmeter 使用beanshell 编写脚本

    目录 一.介绍 1.1 介绍 1.2 下载&启动 二.jmeter中创建beanshell脚本 三.jmeter与beanshell 数据交互 3.1 例子1 beanshell 将变量传给j ...

  3. [转帖]window10下如何安装fio

    1.fio下载地址(实测有效): https://github.com/axboe/fio/releaseshttps://github.com/axboe/fio/releases 其他的地址如​​ ...

  4. [转帖]sudo 命令_su、sudo、sudo su、sudo -i的用法和区别

    sudo 命令 1.sudo 简介 sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等.这样不仅减少了root用户 ...

  5. [转帖]QPS、TPS、RT、并发数、吞吐量理解和性能优化深入思考

    https://baijiahao.baidu.com/s?id=1675704570461446033&wfr=spider&for=pc 吞吐量 在了解qps.tps.rt.并发数 ...

  6. ESXi 虚拟机性能情况简单验证

    1.虚拟化的CPU超售问题. 经过查找资料, 发现 ESXi 5.5 的版本 一个 物理CPU的Core 可以虚拟出 25个vCPU, 升级到ESXi6.0 之后可以虚拟化32个vCPU. 所以虚拟化 ...

  7. vue3中retive的错误用法导致数据不跟新

    retive的错误用法 <template> <div> 司藤的信息==>{{ objInfo }} <button @click="handerHttp ...

  8. border多层渐变

    .content { margin-top: 19px; border-top: 1px dashed rgba(113, 183, 248, 0.6) !important; border-left ...

  9. 遇到一个bug,组件不更新内容

    解决办法 当v-if的值发生变化时,组件都会被重新渲染一遍.因此,利用v-if指令的特性,可以达到强制刷新组件的目的. <template> <comp v-if="upd ...

  10. 三星发布990 EVO SSD:同时支持PCIe 4.0和PCIe 5.0

    1月8日消息,三星发布了新款产品--990 EVO SSD,这是首款同时支持了PCIe 4.0 x4及PCIe 5.0 x2通道的SSD. 据了解,990 EVO面向中端市场,为2280 M.2规格, ...