qt加ffmpeg制作简易录屏工具

背景:在写博客时候经常需要分享画面效果,gif是最合适最简单的方式,但是录屏软件很少支持自定义位置录屏,也不支持导出gif格式。基于这些需求,用qt借助ffmpeg实现。

1. 需求

  • 自定义位置,自定义宽高录屏
  • 导出gif格式
  • 自定义gif尺寸

2. qt搭建界面

新建qt工程后

qt的widget.ui可以通过拖拽快速搭建界面

3. 核心功能

3.1 选择区域

利用重载函数,先截屏,再自定义绘制

c 复制代码
void Capturescreen::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
    {
        m_isMousePress = true;
        mButton->setVisible(false);
        m_endPoint = m_beginPoint = event->pos();
    }

    return QWidget::mousePressEvent(event);
}

void Capturescreen::mouseMoveEvent(QMouseEvent* event)
{
    if (m_isMousePress)
    {
        m_endPoint = event->pos();        
        update();
    }
    return QWidget::mouseMoveEvent(event);
}

void Capturescreen::mouseReleaseEvent(QMouseEvent *event)
{
    m_endPoint = event->pos();
    m_isMousePress = false;
    mButton->setGeometry(m_endPoint.x(), m_endPoint.y(), 100, 40);
    mButton->setVisible(true);
    return QWidget::mouseReleaseEvent(event);
}

void Capturescreen::paintEvent(QPaintEvent *event)
{
    m_painter.begin(this);			//进行重绘;

    QColor shadowColor = QColor(0, 0, 0, 100);						//阴影颜色设置;
    m_painter.setPen(QPen(Qt::blue, 1, Qt::SolidLine, Qt::FlatCap));	//设置画笔;
    m_painter.drawPixmap(0, 0, m_loadPixmap);						//将背景图片画到窗体上;
    m_painter.fillRect(m_loadPixmap.rect(), shadowColor);			//画影罩效果;

    //if (m_isMousePress)
    {
        selectedRect = getRect(m_beginPoint, m_endPoint);
        m_capturePixmap = m_loadPixmap.copy(selectedRect);
        m_painter.drawPixmap(selectedRect.topLeft(), m_capturePixmap);
        m_painter.drawRect(selectedRect);
    }


    m_painter.end();  //重绘结束;
}

3.2 开始录制

录屏是利用ffmpeg.exe

通过QProcess启动cmd命令行,发送录屏指令

c 复制代码
QString cmdStr = QString("ffmpeg.exe -y -f gdigrab -framerate 30 -offset_x %1 -offset_y %2 -video_size %3x%4 -i desktop output.mp4\n")
            .arg(_rect.x()).arg(_rect.y()).arg(_rect.width()).arg(_rect.height());

3.3 结束录制

c 复制代码
m_Bash_winNoDisplay->write(QString("q\n").toUtf8());

3.4 转gif

c 复制代码
QString cmdStr = QString("ffmpeg.exe -y -i output.mp4 -vf \"fps=10,scale=%1:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse\" output.gif\n")
            .arg(w);

4. 效果

相关推荐
写代码的【黑咖啡】7 小时前
Python 中的 Requests 库:轻松进行 HTTP 请求
开发语言·python·http
BD_Marathon7 小时前
MyBatis各种查询功能
java·开发语言·mybatis
研☆香7 小时前
JavaScript 特点介绍
开发语言·javascript·ecmascript
Howrun7777 小时前
虚幻引擎_AController_APlayerController_AAIController
开发语言·c++·游戏引擎·虚幻
曹牧7 小时前
C#:ToDouble
开发语言·c#
袁袁袁袁满7 小时前
Python读取doc文件打印内容
开发语言·python·python读取doc文件
zcfeng5307 小时前
PHP升级
开发语言·php
m0_748252387 小时前
Ruby 模块(Module)的基本概念
开发语言·python·ruby
羊小猪~~7 小时前
【QT】-- QT基础类
开发语言·c++·后端·stm32·单片机·qt
木卫二号Coding8 小时前
Python-文件拷贝+文件重命名+shutil+记录
开发语言·python