QT視頻幀顯示時如何防止閃爍現(xiàn)象出現(xiàn)

字號:

使用QT進行視頻幀顯示時如何防止閃爍現(xiàn)象出現(xiàn)呢?
    由于我們需要自主控制顯示視頻幀,所以,需要我們自己重新實現(xiàn)paintEvent方法,在里面利用bitBlt方法將視頻幀繪制到對應(yīng)的圖象區(qū)域中,就可以完成視頻幀的顯示了,可是在實際這么做的過程中,我們會發(fā)現(xiàn)顯示部分有較嚴重的閃爍現(xiàn)象,這如何解決呢?
    解決方法比較簡單,但是如果你不知道,那么你會頭疼很長時間的;
    一:
    在采集完視頻幀后,調(diào)用paintEvent重繪視頻幀的函數(shù)使用update(),而不是repaint(),原因是調(diào)用后者,Qt會馬上對圖形區(qū)域進行重繪,從而導致較嚴重閃爍,而使用前者,Qt會對連續(xù)的update調(diào)用進行優(yōu)化,也就是Qt會將多個繪制事件合并為一個來加快繪制速度,當update()被調(diào)用幾次或者窗口系統(tǒng)發(fā)送幾次繪制事件,Qt把它們合并為一個比較大區(qū)域(請參考QRegion::unite())的一個事件中。repaint()不允許這樣優(yōu)化,所以只要可能我們盡量使用update()。
    二:
    在調(diào)用bitBlt前設(shè)置Flags,如下:
    setWFlags(getWFlags() | Qt::WRepaintNoErase);
    即可;
    默認的paintEvent調(diào)用,會先擦除原區(qū)域,然后再繪制,因此每一次調(diào)用,實際上繪制了兩次,導致閃爍嚴重,設(shè)置這個標記,就會直接進行圖形繪制,而不進行擦除,這一點會有明顯得改善。