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

相关推荐
C^h6 小时前
c++ string
开发语言·c++
raindayinrain6 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的6 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao6 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
学逆向的7 小时前
C 局部静态变量
c语言·开发语言·网络安全
小徐不徐说7 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
大都督会赢的7 小时前
C++第一节课
开发语言·c++
“AI国潮设计-小江”7 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
小王C语言8 小时前
Qt常用控件:容器类控件,标题分组框、标签页(浏览器标签)
开发语言·qt
TMedical8 小时前
MedPlanning 截骨模拟矫形功能
c++·图像处理·人工智能·qt·健康医疗