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. 效果

相关推荐
牛奔3 分钟前
mise 管理多版本 Go 项目
开发语言·前端·chrome·后端·golang
波力海苔夹心脆67517 分钟前
C# 视觉检测实战:PLC 按钮触发 VisionPro 检测,OK 亮灯 / NG 灭灯(西门子 PLC,含界面显示与图片存档)
开发语言·经验分享·c#·自动化·视觉检测·.net
2601_9628857230 分钟前
如何用 Python 计算 BBI 多空指标?
开发语言·python
老王爱玩车1 小时前
动态内存管理
c语言·开发语言·学习·面试
I'm Jie1 小时前
【开源】7 天,我用 Rust 复刻了 FinalShell!Rhost v1.0.0 发布
开发语言·rust·开源
kimnoic1 小时前
Python常用命令提示符使用方法详解
开发语言·python
Crazy________1 小时前
05Linux内存管理核心原理与运维实战
java·开发语言
Nebula_g1 小时前
JavaSE拓展:工具类Executors
java·开发语言·后端·spring·基础·javase
扶风ff1 小时前
练题簿在线免费刷题:会员线下组卷、Word 试卷与成绩导入,课堂检测更方便
java·开发语言·算法·小程序·word
程序员老陆1 小时前
C++ 多线程通信方式全景:从共享内存到结构化协调
开发语言·c++