背景:在写博客时候经常需要分享画面效果,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. 效果
