当前位置: 首页>C++>正文

Qt渲染視頻常見問題(視頻渲染窗口上子窗口設置透明出現陰影問題、主窗口縮放導致視頻渲染窗口部分出現視頻閃爍問題)

Qt渲染視頻常見問題(視頻渲染窗口上子窗口設置透明出現陰影問題、主窗口縮放導致視頻渲染窗口部分出現視頻閃爍問題)

開發環境

Qt5.9.6+VS2015

1.視頻渲染窗口上子窗口設置透明出現陰影問題

平時為了方便代碼管理,一般窗口上設置窗口或者控件,都會設置Parent(setParent),這樣對主窗口進行某種操作,不需要用代碼去管理其他窗口。
但是在視頻渲染窗口上設置子窗口或者子控件,哪怕將子窗口或者子控件設置透明無邊框,還是會出現一個陰影背景。

陰影問題出現的效果圖:
在這里插入圖片描述

出現的原因:由于視頻窗口背景顏色一般情況下都是灰色陰影背景,當子窗口和子控件繼承視頻窗口時,會默認使用視頻窗口的背景顏色,所以導致上述問題出現。

Qt有三種窗口顯示方式:Qt::Widget,Qt::Dialog,Qt::Windows。
其中Widget強制使用父窗體背景。
以下提供解決方法有三種。

解決辦法一:
先設置無邊框和透明化。

MediaPlayer.setWindowFlags(Qt::FramelessWindowHint | Qt::SubWindow);
MediaPlayer.setAttribute(Qt::WA_TranslucentBackground, true);

然后重載MediaPlayer中paintEvent方法。

void MediaPlayer::paintEvent(QPaintEvent *e)
{QPainter painter(this);painter.fillRect(this->rect(), m_color);
}

這種解決辦法可以解決問題,但是使用不方便。

解決方法二:
使用Dialog的顯示方法,使用于窗口和控件。

MediaPlayer.setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
MediaPlayer.setAttribute(Qt::WA_TranslucentBackground, true);

解決辦法三:
窗口之間不僅只有父子關系,還有從屬關系,因此窗口疊加還能通過owner的方式實現。
具體實現可以查看win32的setwindowlong,可以去msdn查看對應方法。

陰影問題解決后的效果圖:
在這里插入圖片描述

2.主窗口縮放導致視頻渲染窗口部分出現視頻閃爍問題

這種問題主要出現在調用第三方庫渲染視頻的時候縮放窗口就會出現視頻閃爍問題。
產生閃爍的主要原因是由于Qt自身的渲染引擎和第三方庫渲染沖突造成的。
因此解決辦法可以采用屏蔽Qt自身的渲染。

屏蔽方法有兩種:
第一種方法,重載QPaintEngine方法。
首先在視頻渲染窗口構造函數中添加。

setAttribute(Qt::WA_PaintOnScreen,true);

然后重載QPaintEngine接口,直接返回即可。

QPaintEngine *MediaPlayer::paintEngine()
{return 0;
}

第二種方法,直接設置窗口關閉自動刷新。

MediaPlayer.setUpdatesEnabled(false);

以上的辦法可以從根本上解決視頻閃爍問題,但是在屏蔽Qt自身渲染的時候,一定要使用得當,畢竟Qt窗口初始化的時候,是需要調用Updates的,不然窗口會一片空白的哦

下面還有一種方法,改變窗口縮放樣式。
windows下有一種窗口縮放樣式:
在這里插入圖片描述
因此也可以采用這種縮放模式,完美的避免了窗口閃爍的問題。
實現的方式有兩種:
第一種是調用WinAPI實現。
第二種是Qt調用橡皮筋類模擬陰影窗口實現。

WinAPI實現代碼部分:
https://download.csdn.net/download/qq_36651243/11247196

Qt調用橡皮筋類模擬陰影窗口實現效果圖:
在這里插入圖片描述
解決以上兩種問題還可以這樣做:(參考FFmpeg緩存機制)
自己編寫緩存區管理視頻流數據,通過管理視頻流緩存區,通過Qt本身QPainter事件繪制視頻緩存區讀到的視頻流數據
這也是小編目前使用的解決辦法

最后還有一種方法,叫雙緩沖技術,有興趣的可以去網上了解下。

https://www.nshth.com/cplus/338438.html
>

相关文章:

  • 樹莓派的控制方法,第二篇 樹莓派基本外設基礎篇
  • 手機如何連接外設,iOS連接外設的幾種方式
  • switch可以外接鍵鼠嗎,別再給手機外接OTG鍵鼠玩刺激戰場了:其實還能這樣操作
  • [阿發你好]C/C++學習指南
  • 輸入法哪個最好用,wsl2中安裝中文輸入法
  • 字符串中引入變量方法,字符串處理、變量初始值處理、擴展的腳本技巧、正則表達式
  • 某計算機內存容量是512kb,某計算機主存容量為512kb,Cache容量為16kb,每塊有16個字,每字32位。 (1...
  • 中國工商網商標查詢,工商局爬蟲 商標網爬蟲
  • iOS真機調試TestFlight安裝及提交App Store審核教程
  • 蘋果app上架流程,小白如何在ios中安裝ios上架
  • 蘋果彈出提交表格是什么,蘋果TestFlight測試操作圖文教程(測試后提交App Store審核)
  • 四門外語傍身:外語,讓我的大學如此完美
  • D3D Surface/Texture SDL DDraw渲染視頻的區別和疑問
  • 手機VR播放器,Android VR Player(全景視頻播放器) [10]: VR全景視頻渲染播放的實現(exoplayer,glsurfaceview,o
  • Qt渲染視頻常見問題(視頻渲染窗口上子窗口設置透明出現陰影問題、主窗口縮放導致視頻渲染窗口部分出現視頻閃爍問題)
  • 視頻解析網站源碼,ijkplayer源碼分析 視頻渲染流程
  • 一分鐘的視頻渲染要多久,基礎教程|如何在數分鐘時間內渲染超清精美視頻?
  • Metal(六) 案例之視頻文件的渲染
  • flutter開發小程序,最強整理!寫給程序員的Flutter詳細教程,大廠直通車!
  • c++黑客編程揭秘與防范,C/C++截獲騰訊QQ網絡聊天系統內容和登錄密碼,教你做一個黑客!
  • 支付行業具體做什么,做支付需要了解哪些行業知識
  • 5大底層邏輯,淺談HyperLogLog底層算法邏輯
  • c++實現復數的加減乘除,【C++】輔助C++計算復數(代碼解釋的很清楚)
  • nlogn的算法有哪些,算法運行時間1、logN、N、NlogN 、N^2、N^3、2^n之間的比較
  • 開源圖片庫,幾種常用圖像處理開源庫簡介及使用總結
  • 圖像處理和計算機視覺,《圖像處理與計算機視覺算法及應用》讀后感
  • gps定位,側邊欄固定定位到版心兩側
  • css版心怎么設置,[css]版心和布局流程
  • 瀏覽器多個窗口怎么設置在一個頁面,網頁多種版心適應多屏幕技巧
  • 前端學習之版心和布局流程