正如您可能從問題標題中推測的那樣,我們需要同時解碼和顯示多個(例如八個)H.264編碼視頻(並保留所有視頻時間同步,但這是另一個問題)。視頻通常爲25 FPS,分辨率爲640x480。同時解碼和顯示許多H264視頻的最快方法C#
在打開問題的癥結之前,我將提供一些背景知識。
該功能需要烘焙成相當大的C#3.5(WinForms)應用程序。視頻將佔用應用程序中的矩形 - 託管代碼需要能夠指定每個視頻的繪製位置以及其大小。我們在C#中獲取H264數據包並將它們發送到本機H264解碼器中以獲取YUV12圖像數據。
一個早期的嘗試包括將YUV12圖像轉換爲RGB24並將它們BitBlt'ing到從C#傳入本機代碼的HWND。功能上,所有BitBlt'ing都必須在UI線程上發生,導致它在顯示多個視頻(2.6 GHZ核心2個二重奏)時出現故障。
當前嘗試在啓動時加速每個cpu-core的線程數,並在這些線程上解碼/顯示視頻。這種表現是令人興奮的(我發現觀看任務管理器比顯示的視頻更有趣)。用戶界面方面,它留下了很多想要的。
從非UI線程開始繪製到在UI線程(例如,面板停靠在WinForms控件中的面板)上創建的HWND的毫秒時間後,我們開始獲取各種各樣的時髦行爲, WinForms的安全性。這導致我們使用本地代碼創建HWND並將其繪製到這些代碼中,C#提供了應該在屏幕座標中繪製的矩形。
嘎! CanOfWorms.Open()。
問題:當C#應用程序收到焦點時,它跳轉到Z順序的前面並隱藏視頻窗口。 解決方案:將視頻窗口始終置於頂部。
問題:當用戶切換到另一個應用程序時,視頻窗口仍然在最上面。 解決方案:檢測C#應用程序的激活和禁用,並相應地顯示/隱藏視頻窗口。
問題:用戶說:「我希望我的視頻在一臺顯示器上播放,而我在另一臺顯示器上編輯Word文檔!」 解決方案:告訴用戶閉嘴,反正Word會吮吸。
問題:我被解僱了。
等等,等等
我想這個問題的關鍵是我們有HWND在非UI線程創建的,我們希望「模擬」那些被嵌入在C#應用程序。
有什麼想法/建議嗎?我完全在這裏吃午飯嗎?
如果存在的話,我更願意採取完全不同的方法(這個項目需要大量的學習 - 贏得彩票的可能性比我在沿着道路的每一步選擇最佳方法的可能性更大) 。
FYI:開始開發這樣的組件,我建議在我的答案中,會讓你知道它是否工作得像它應該... – 2011-05-18 22:13:54
非常感謝!我還沒有機會開始你的解決方案 - 取消了這個項目,以消除一些火災 - 在晚上堵塞它,但它的進展緩慢。 – Shea 2011-05-24 02:30:36