项目实战:Qt+FFmpeg录屏应用(支持帧率、清晰度设置)
2020-11-19 22:52
956 查看
若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/109827936
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)
Qt开发专栏:项目实战(点击传送门)
需求
实现录屏功能。
原理
使用抓屏模块按照指定范围和帧率抓屏,同时使用录像模块按照指定图像大小和帧率录制。
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; // 抓屏线程 FFmpegRecordManag 20000 er *_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
相关文章推荐
- 项目文件包含 ToolsVersion="12.0" 设置,而此版本的 MSBuild 不支持该工具版本
- iOS项目开发实战——设置视图的透明度改变动画
- Xcode非ARC项目中设置部分文件ARC支持
- IOS开发之----Xcode非ARC项目中设置部分文件ARC支持
- React Native商城项目实战06 - 设置安卓中的启动页
- 视频教程-区块链项目实战:支持以太坊的小程序云笔记-区块链
- IOS开发之----Xcode非ARC项目中设置部分文件ARC支持
- React Native商城项目实战10 - 个人中心中间内容设置
- Xcode非ARC项目中设置部分文件ARC支持
- 项目实战2:一个支持同时多人聊天的程序「源码」
- Android项目实战(二十三):仿QQ设置App全局字体大小
- IOS开发之----Xcode非ARC项目中设置部分文件ARC支持
- 【无私分享:ASP.NET CORE 项目实战(第十二章)】添加对SqlServer、MySql、Oracle的支持
- Android项目实战--手机卫士15--设置手机归属地的样式以及显示位置
- Unity3D设置Webgl项目支持手机访问
- 视频教程-项目实战:支持以太坊的MySQL管理系统视频课程-区块链
- 在AndroidStudio中设置某项目支持使用Java 8 新特性
- 项目文件包含 ToolsVersion="12.0" 设置,而此版本的 MSBuild 不支持该工具版本
- Spring Boot缓存实战 Redis 设置有效时间和自动刷新缓存,时间支持在配置文件中配置
- 慕课网实战项目《WebAPP书城整站开发》笔记五:字体大小设置交互开发