最近在使用ffmpeg+sdl2+qt编写视频监控客户端,发现一个问题:使用SDL渲染视频的时候屏幕一直闪烁,通过资料查询和网上求助有一些解决办法,即重载paintEngine()函数,但是重载该函数会造成一些意想不到的后遗症,且QT帮助文档中也明确说明客户不需要关注paintEngine()的实现,那么有没有不用重载paintEngine()函数,就可以解决该问题的办法呢?首先我们得用清楚问题的原因,然后根据原因制定解决方案。
该问题的根本原因是QT的绘制消息与SDL的绘制消息同时发送,导致同时绘制窗口,我们只要关闭QT的窗口绘制就可以了,使用setUpdatesEnabled(false)语句关闭QT的窗口绘制操作,注意该操作必须在paintEvent(QPaintEvent *e)的事件中进行,否则会导致该窗口不能随窗体大小自动调整本省窗口大小。核心代码
void VideoCanvas::paintEvent(QPaintEvent *e)
{
if (m_isPlaying)
{
//CPU
// QImage img(m_imageBuf, 720, 640, QImage::Format_RGB888);
// QPainter painter;
// painter.begin(ui->PlayerWidget);
// painter.drawImage(QPoint(0, 0), img.scaled(width(), height()));
// painter.end();
//GPU
ui->PlayerWidget->setUpdatesEnabled(false);
render();
}
}