一、實現方式
解碼視頻可以選擇:opencv、ffmpeg等。
顯示視頻可以選擇:
Qt Multimedia、QQuickImageProvider、
ShaderEffect、自定義QQuickItem等。
本文使用opencv解碼視頻,QQuickImageProvider顯示視頻。
二、QQuickImageProvider
中,requestImage
和 requestTexture區別
在 QQuickImageProvider
中,requestImage
和 requestTexture
的區別主要體現在 調用時機、返回數據類型 和 性能優化 上。以下是詳細對比:
核心區別
特性 | requestImage | requestTexture |
---|---|---|
返回類型 | QImage (CPU 內存中的圖像) | QQuickTextureFactory* (GPU 紋理工廠) |
調用時機 | QML 需要 CPU 可操作的圖像時(如截圖、軟件處理) | QML 需要直接渲染到 GPU 時(如視頻、動畫) |
性能 | 較高開銷(需 CPU → GPU 上傳) | 高性能(直接生成 GPU 紋理,零拷貝) |
典型用例 | 靜態圖片、需像素級操作的圖像 | 視頻幀、動態內容、高頻更新 |
如何選擇實現哪個方法?
需求 | 實現方法 | 理由 |
---|---|---|
靜態圖片 | requestImage | 簡單易用,兼容性好 |
視頻/實時渲染 | requestTexture | 避免 CPU-GPU 拷貝,性能更高 |
需要像素操作 | requestImage | 可直接訪問像素數據 |
跨平臺 GPU 渲染 | requestTexture | 統一適配不同圖形后端 |
Qt 的默認行為
如果 QQuickImageProvider
同時實現了 requestTexture
和 requestImage
,Qt Quick 會優先調用 requestTexture
,而忽略 requestImage
。
調用優先級規則
-
如果
QQuickImageProvider
是用QQmlImageProviderBase::Texture
標志注冊的(例如QQuickImageProvider(QQuickImageProvider::Texture)
),則:-
總是調用
requestTexture
,即使requestImage
也存在。 -
如果
requestTexture
返回nullptr
,則 Qt 會嘗試調用requestImage
(但這種情況通常表示邏輯錯誤)。
-
-
如果
QQuickImageProvider
是用QQmlImageProviderBase::Image
標志注冊的(例如QQuickImageProvider(QQuickImageProvider::Image)
),則:-
調用
requestImage
,requestTexture
會被忽略。
-
-
如果同時用
Texture | Image
標志注冊(理論上不應該這樣做):-
行為未明確文檔化,但實測會優先調用
requestTexture
。
-