项目实战:Qt+FFmpeg录屏应用(支持帧率、清晰度设置)
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/109827936 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...(点击传送门)
Qt开发专栏:项目实战(点击传送门)
<br>
需求
实现录屏功能。
<br>
原理
使用抓屏模块按照指定范围和帧率抓屏,同时使用录像模块按照指定图像大小和帧率录制。
<br>
Demo
<br>
体验下载地址
CSDN:https://download.csdn.net/download/qq21497936/13126842 QQ群:1047134658(点击“文件”搜索“ffmpegRecord”,群内与博文同步更新)
<br>
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);
}
<br>
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/109827936
「其他文章」
- 树莓派开发笔记(十三):入手研华ADVANTECH工控树莓派UNO-220套件(二):安装rtc等驱动
- 红胖子创业一年整总结:前二十年题记,萌芽初期,外包初期,创业初期,未来规划
- Qt MPlayer音乐播放器开发笔记(二):交叉编译MPlayer以及部署到开发板播放演示
- zlib开发笔记(三):zlib库介绍、在ubuntu上进行arm平台交叉编译
- 案例分享:Qt政务标签设计器,标签排版软件定制与打印
- Qt 腾讯IM开发笔记(一):腾讯IM介绍、使用和Qt集成腾讯IM-SDK的工程模板Demo
- Qt MPlayer音乐播放器开发笔记(一):ubuntu上编译MPlayer以及Demo演示
- 案例分享:Qt Arm基于RV1126平台的内窥镜软硬整套解决方案(实时影像、冻结、拍照、录像、背光调整、硬件光源调整,其他产品也可使用该平台,如视频监控,物联网产品等等)
- libzip开发笔记(二):libzip库介绍、ubuntu平台编译和工程模板
- 台达PLC开发笔记(二):台达PLC设置主机通讯参数为RTU并成功通讯
- 台达PLC开发笔记(一):台达PLC连接介绍,分别使用485、网口与台达PLC建立连接
- Qt的图形视图框架,最核心的三个类为:QGraphicsScene、QGraphicsItem与QGraphicsView。
- Windows上mingw32版本的openssl的编译是属于比较棘手的,OpenSSL本身不提供支持.。
- 案例分享:Qt modbus485调试工具(读写Byte、Int、DInt、Real、DReal)(当前v1.3.0)
- 案例分享:某品牌音响系列协议调试工具(搜寻主机,查询通道,基本控制API,云音乐API,语言节目API等,可增删改指令)
- NSIS安装包开发笔记(三):NSIS使用Qt做的安装界面制作安装包交互详解
- NSIS制作安装包笔记(一):NSIS介绍、使用NSIS默认向导脚本制作Windows安装包
- 海康摄像SDK开发笔记(一):海康威视网络摄像头SDK介绍与模块功能
- Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo
- Qt开发技术:图形视图框架(一)基本介绍