QT+SDL2,視頻渲染屏幕閃爍解決辦法

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章