项目实战:Qt+FFmpeg录屏应用(支持帧率、清晰度设置)
若该文为原创文章,转载请注明原文出处
本文章博客地址: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录屏应用(支持帧率、清晰度设置)的更多相关文章
- 【原创】FFMPEG录屏入门指南
下载ffmpeg 点击 ffmpeg官网,选择windows,然后点击Windows builds from gyan.dev: 也可以直接点击 https://www.gyan.dev/ffmpeg ...
- ffmpeg 录屏 screen capture recorder
ffmpeg在Linux下用X11grab进行屏幕录像,在Windows下用DirectShow滤镜 首先需要安装一个软件,screen capture recorder 编译好的下载地址是: htt ...
- Unity 利用FFmpeg实现录屏、直播推流、音频视频格式转换、剪裁等功能
目录 一.FFmpeg简介. 二.FFmpeg常用参数及命令. 三.FFmpeg在Unity 3D中的使用. 1.FFmpeg 录屏. 2.FFmpeg 推流. 3.FFmpeg 其他功能简述. 一. ...
- 【原创】推流录屏软件OBS使用教程--录屏
之前有录屏需要,写了一篇关于ffmpeg录屏的文章,反响还不错,但是直接用ffmpeg门槛有些高,今天写一篇图形界面的录屏推流工具OBS的使用教程.这次先写OBS的录屏教程 下载安装 点击 OBS官网 ...
- Android项目实战--手机卫士开发系列教程
<ignore_js_op> banner131010.jpg (71.4 KB, 下载次数: 0) 下载附件 保存到相册 2 分钟前 上传 Android项目实战--手机卫士01- ...
- 项目实战:Qt+Ffmpeg+OpenCV相机程序(打开摄像头、支持多种摄像头、分辨率调整、翻转、旋转、亮度调整、拍照、录像、回放图片、回放录像)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- 基于FFMpeg的C#录屏全攻略
最近负责一个录屏的小项目,需要录制Windows窗口内容并压缩保存到指定文件夹,本想使用已有的录屏软件,但是本着学习的态度去探索了FFMpeg,本文主要介绍基于FFMpeg开源项目的C#录屏软件开发. ...
- FFmpeg获取DirectShow设备数据(摄像头,录屏)
这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘.本文所述的方法主要是对应Windows平台的. 1. 列设备 ffmpeg -list_devic ...
- 【转】FFmpeg获取DirectShow设备数据(摄像头,录屏)
这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘.本文所述的方法主要是对应Windows平台的. 1. 列设备 ffmpeg -list_devic ...
- Qt编写自定义控件35-GIF录屏控件
一.前言 在平时的写作过程中,经常需要将一些操作动作和效果图截图成gif格式,使得涵盖的信息更全面更生动,有时候可以将整个操作过程和运行效果录制成MP4,但是文件体积比较大,而且很多网站不便于上传,基 ...
随机推荐
- [转帖]如何在 Linux 中使用ss命令监控网络连接
https://zhuanlan.zhihu.com/p/99421574 ss命令是用于在Linux系统上显示与网络套接字相关的信息的工具. 该工具显示netstat命令的更多详细信息,该命令用于显 ...
- [转帖]jmeter 使用beanshell 编写脚本
目录 一.介绍 1.1 介绍 1.2 下载&启动 二.jmeter中创建beanshell脚本 三.jmeter与beanshell 数据交互 3.1 例子1 beanshell 将变量传给j ...
- [转帖]window10下如何安装fio
1.fio下载地址(实测有效): https://github.com/axboe/fio/releaseshttps://github.com/axboe/fio/releases 其他的地址如 ...
- [转帖]sudo 命令_su、sudo、sudo su、sudo -i的用法和区别
sudo 命令 1.sudo 简介 sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等.这样不仅减少了root用户 ...
- [转帖]QPS、TPS、RT、并发数、吞吐量理解和性能优化深入思考
https://baijiahao.baidu.com/s?id=1675704570461446033&wfr=spider&for=pc 吞吐量 在了解qps.tps.rt.并发数 ...
- ESXi 虚拟机性能情况简单验证
1.虚拟化的CPU超售问题. 经过查找资料, 发现 ESXi 5.5 的版本 一个 物理CPU的Core 可以虚拟出 25个vCPU, 升级到ESXi6.0 之后可以虚拟化32个vCPU. 所以虚拟化 ...
- vue3中retive的错误用法导致数据不跟新
retive的错误用法 <template> <div> 司藤的信息==>{{ objInfo }} <button @click="handerHttp ...
- border多层渐变
.content { margin-top: 19px; border-top: 1px dashed rgba(113, 183, 248, 0.6) !important; border-left ...
- 遇到一个bug,组件不更新内容
解决办法 当v-if的值发生变化时,组件都会被重新渲染一遍.因此,利用v-if指令的特性,可以达到强制刷新组件的目的. <template> <comp v-if="upd ...
- 三星发布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规格, ...