最近在使用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();
}
}