当前位置: 首页>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
>

相关文章:

  • github 免費節點,BUMO:超級節點共建接口
  • 學習html/css基礎的重點筆記
  • 企業郵箱怎么群發郵件,企業會員郵件群發解決方案
  • esfp光模塊,闡述一下ecshop各模塊的功能_【光電通信】40G QSFP+ LR4 光模塊的設計與實現(一)...
  • lua編程軟件,QQ郵箱記事本模塊Lua實現小結
  • centos7.6鏡像下載,centos(7.9) minikube(v1.28.0) kaniko 構建鏡像
  • 計算機畢業設計ssm企業部門報銷管理g9d62系統+程序+源碼+lw+遠程部署
  • 鮑森詹森實驗過程,Ornstein-Uhlenbeck過程
  • 嵌入式的發展趨勢,我理解的嵌入式幾個發展方向
  • 51開發板,IMX6ULL_PRO嵌入式開發板介紹
  • 嵌入式軟件工程師,2023屆秋招內推指南|嵌入式開發|軟硬件
  • 剛畢業的大學生適合做什么工作,今天我的就業班的生活開始啦~~~
  • C語言-基礎知識練習習題1
  • 什么監控攝像頭最清晰,計算機為什么找不到攝像頭,為何電腦里找不到攝像頭設備?
  • 網易支付登錄,微信登陸和支付
  • 人工智能自我進化,復雜性思維中文第二版 十一、進化
  • firebase,Firebase 教程: iOS A/B 測試
  • mongodb可視化管理工具,Impala入門筆記---比Hive強大
  • 世界只是一個程序,程序的世界里,短暫的放空
  • 如何用爬蟲爬取網頁上的數據,新聞爬蟲及爬取結果查詢網站的搭建(一)
  • 爬蟲網站,新聞網站爬蟲及結果查詢
  • 深度卷積神經網絡,深度KWeaver:價值驅動,認知智能走向開源共創
  • sci論文翻譯神器,SCI科技論文英語翻譯的一點個人心得
  • 協議的定義,連接跟蹤TCP協議狀態轉換
  • 洛谷 T284709 怨念(resent)
  • 1330 小青蛙跳臺階
  • 動態規劃解決小青蛙跳臺階問題
  • 代碼記錄丨小青蛙和漢諾塔
  • 小青蛙爬井
  • 【基礎】小青蛙回來了