若该文为原创文章,转载请注明原文出处
本文章博客地址: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. 【转帖】mysql一个索引块有多少指针_深刻理解MySQL系列之索引

    索引 查找一条数据的过程 先看下InnoDB的逻辑存储结构:node 表空间:能够看作是InnoDB存储引擎逻辑结构的最高层,全部的数据都存放在表空间中.默认有个共享表空间ibdata1.若是启用in ...

  2. K8S 知识点

    1. K8S集群大小 在 v1.7 版本中,Kubernetes 支持集群节点(node)数可达1000个.更具体地说,我们配置能够支持所有如下条件: 不超过2000个节点 不超过总共6000个 po ...

  3. CS231N Assignment1 SVM 笔记

    svm.ipynb 为SVM实现一个完全矢量化的损失函数 为其解析梯度实现完全矢量化表达式 使用数值梯度检查实现结果 使用验证集调整学习率和正则化 使用 SGD 优化损失函数 可视化最终学习权重 第一 ...

  4. 2022 倒带 - NutUI

    作者:京东零售 于明明 前言 时光飞逝,流年似水,让我们倒带 2022,回首这跌宕起伏一年走过的 "升级之路". NutUI 表现如何? 成绩单等着您打分! 2022 是 NutU ...

  5. http 中使用 gzip 输出内容时,如何预先压缩前一半页面?

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 背景是这样:要输出一个很大的动态页面,不开 gzip 压缩 ...

  6. 【遇到一个怪异的问题】使用embed来加载模版,只要写在init()函数中就会导致HTTP服务出错

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 经过反复测试,只要换一个写法就能开启/重现这个怪异的问题. ...

  7. docker的架构及工作原理(详解)

    目录 一.docker架构图 二.Client 客户端 三.Host 主机(docker引擎) 四.Image 镜像 五.Container 容器 六.镜像分层 可写的容器层 七.Volume 数据卷 ...

  8. SQL 训练题目

    title: SQL 训练题目 date: 2023-7-15 01:45:50 tags: - SQL 训练 一. 查询 "01" 课程比 "02" 课程成绩 ...

  9. PaddleNLP通用信息抽取技术UIE【一】产业应用实例:信息抽取{实体关系抽取、中文分词、精准实体标。情感分析等}、文本纠错、问答系统、闲聊机器人、定制训练

    相关文章: 1.快递单中抽取关键信息[一]----基于BiGRU+CR+预训练的词向量优化 2.快递单信息抽取[二]基于ERNIE1.0至ErnieGram + CRF预训练模型 3.快递单信息抽取[ ...

  10. 从嘉手札<2024-1-29>

    补一下以前的几篇日记 2018-4-6 当一个人不在纠结没有什么 而是开始珍视他所拥有的一切的时候 才算得上真正的成熟 个人的意志 不能因受到社会的压力而软弱 也不能受到自然的压力而萎缩 而应当如冬日 ...