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

相关推荐
事已至此先睡覺吧38 分钟前
第三篇:Java 流程控制详解:条件判断、循环与跳转语句
java·开发语言
m0_734571761 小时前
深入理解5g <二十> dmrs
开发语言·5g
实心儿儿1 小时前
Qt — 信号和槽
qt
金金计较.1 小时前
Go语言-4
开发语言·golang
泡海椒2 小时前
jquick-pdf 表格行列尺寸控制实战:单元格合并的可行边界
java·开发语言·pdf
纪念 2292 小时前
c++类和对象(四)
开发语言·c++
江湖人称菠萝包3 小时前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter8-绘图
笔记·qt·qt5
辛苦才能3 小时前
C++多态原理:虚函数表的内存布局与动态绑定的汇编真相
开发语言·c++
铲灰3 小时前
做个总结而已
开发语言
西西弗Sisyphus3 小时前
Qt 实现一个 水波进度球
c++·qt·c