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

相关推荐
历程里程碑2 小时前
LeetCode 283:原地移动零的优雅解法
java·c语言·开发语言·数据结构·c++·算法·leetcode
卜锦元2 小时前
Golang后端性能优化手册(第一章:数据库性能优化)
大数据·开发语言·数据库·人工智能·后端·性能优化·golang
雨季~~2 小时前
前端使用ffmpeg进行视频格式转换 (WebM → MP4)
前端·typescript·ffmpeg·vue
虾说羊2 小时前
java中的反射详解
java·开发语言
特立独行的猫a2 小时前
C++23 std::expected 详解:告别传统错误码和异常,构建现代健壮代码
开发语言·c++23·expected·错误码处理
leaves falling2 小时前
c语言-根据输入的年份和月份,计算并输出该月份的天数
c语言·开发语言·算法
痕忆丶2 小时前
ffmpeg分析h264裸流文件
ffmpeg
云栖梦泽2 小时前
鸿蒙企业级工程化与终极性能调优实战
开发语言·鸿蒙系统
Eloudy2 小时前
通过示例看 C++ 函数对象、仿函数、operator( )
开发语言·c++·算法