若该文为原创文章,转载请注明原文出处
本文章博客地址: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; // 抓屏线程 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

ffmpeg 获取帧率_项目实战:Qt+FFmpeg录屏应用(支持帧率、清晰度设置)相关推荐

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

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

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

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

  3. C++编程FFMpeg实时美颜直播推流实战-基于ffmpeg,qt5,opencv视频课程-夏曹俊-专题视频课程...

    C++编程FFMpeg实时美颜直播推流实战-基于ffmpeg,qt5,opencv视频课程-11788人已学习 课程介绍         C++编程FFMpeg实时美颜直播推流实战视频培训教程,本课程 ...

  4. Android视频《手机影音_项目实战》-杨光福-专题视频课程

    Android视频<手机影音_项目实战>-49877人已学习 课程介绍         手机影音项目是真实的上线项目,本视频在原项目基础上,进行了新技术的更新和优化.该项目包括本地音乐播放 ...

  5. android 保存退出之前的页面_项目实战:Qt+Android模拟操作器(模拟操作app,打开,点击,输入,获取验证码等等)...

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/109313803 各位读者,知识无穷而人力有穷 ...

  6. 双y轴设置 颜色_项目实战:Qt多段Y轴折线图框架(双Y轴段折线、支持拽拖、浮动游标显示X值各段Y值、实时下位机数据)...

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111660400长期持续带来更多项目与技术分享 ...

  7. app inventor调用图像识别_项目实战-图像识别项目-通过QT制作图形界面并调用百度AI进行图像识别(一)...

    转自迅为4412开发板项目实战教程 硬件平台:iTOP-4412开发板 项目名称:图像识别项目 本文我们来学习利用QT构建一个图形界面并用QT调用百度AI的接口 一.添加arm编译套件 打开QT cr ...

  8. Qt C++ 录屏录音功能实现(avilib+ffmpeg)以及动态库生成

    实现一个录屏+录音的功能且需要快速开发,Qt无疑是一个非常好的选择.他有丰富的类库和接口可以很好的满足开发需求. 完整demo代码在文章最下方的百度网盘链接中,有需要的各位可以随意下载. 录屏部分 录 ...

  9. Python和Java结合的项目实战_[项目实战] Python高级教程项目实战篇 Python和Java结合的项目实战 视频教程 [...

    资源介绍 课程简介:xa0xa0 Python高级教程项目实战篇 Python和Java结合的项目实战 视频教程 教学视频 ----------------------课程目录 Python项目实战篇 ...

最新文章

  1. TFS2008 + Windows2003 + Sql2005 安装注意事项
  2. NYOJ 625 笨蛋的难题(二)
  3. 常用模块(json/pickle/shelve/XML)
  4. 搜狐畅游笔试题:1. 美丽的项链(动态规划) 2.多线程并发交替输出
  5. C++模板函数/类示例
  6. 进击的雨燕----------基本运算符
  7. 使用源代码编译安装基于LAMP的网站架构
  8. OpenProj打开不了或者提示Failed to load Java VM Library的错误的解决方案
  9. java restsharp_RestSharp 一个.NET(C#)的HTTP辅助类组件
  10. ffmpeg转码保留时间戳
  11. 〖工具〗Ladon 9.1.1 CobaltStrike神龙插件发布
  12. adb远程(异地)连接实现投屏
  13. Python 实现电信天翼网关光猫自动重启
  14. python实现白色背景转为透明背景
  15. 如何将静态图片制作成闪图效果?
  16. Codeforces--676A--Nicholas and Permutation
  17. css 白色背景如何实现半透明
  18. 萤石开放平台-定时获取AccessToken
  19. 完全用GNU/Linux工作,摈弃Windows---你我共勉
  20. 微软准备再次裁员2850人 一年之内完成

热门文章

  1. JVM04内存结构概述
  2. 判断一个字符串是否是数值
  3. copyof java_死磕 java集合之CopyOnWriteArrayList源码分析
  4. [云炬创业学笔记]第一章创业是什么测试11
  5. 科大星云诗社动态20210422
  6. [云炬商业计划书阅读分享]
  7. 别人写好的爬虫怎么运行_怎么写好楷书?
  8. disp直接将内容输出在Matlab命令窗口中
  9. 一文读懂汇编程序的多个分段的程序--详解
  10. 在Windows系统中安装WAMP