2008-09-30 40 views
11

我應該爲我的用戶提供一種非常簡單的方法,即從我的OpenGL應用程序的主窗口中捕獲視頻剪輯。我正在考慮添加用於啓動和停止捕獲的按鈕和/或鍵盤快捷鍵;當開始時,我可以要求一個文件名和其他選項,如果有的話。它必須在Windows(XP/Vista)下運行,但我也不想關閉我迄今爲止能夠保持開放的Linux門。從Windows中的OpenGL窗口捕獲視頻

該應用程序使用OpenGL片段和着色器程序,由此我絕對需要在最終的視頻中產生的效果。

它看起來對我來說,有可能是有可能滿足我的要求,甚至幾種不同的方法(但我真的不知道我應該在哪裏開始):

  • 與喜歡的startRecording功能的編碼庫(文件名),stopRecording和captureFrame。我可以在每幀渲染(或每秒/三分之一)之後調用captureFrame()。如果這樣做會讓我的程序運行速度變慢,那不是一個真正的問題。

  • 獨立的外部程序,可以從我的應用程序進行編程控制。畢竟,一個獨立的程序,可以而不是幾乎可以做到我需要的東西......但正如所說的,它應該是非常簡單的用戶操作,我也很感激無縫;我的應用程序通常全屏運行。此外,應該可以作爲我目前使用NSIS準備的應用程序的安裝包的一部分進行分發。

  • 使用Windows API逐幀捕獲屏幕截圖,然後使用(例如)libraries mentioned here之一。似乎很容易找到如何在Windows中捕獲屏幕截圖的示例;然而,我很喜歡這樣的解決方案,它並不會強迫我在WinAPI級別上弄髒我的手。

  • 使用OpenGL渲染到屏幕外目標,然後使用庫來產生視頻。我不知道這是否有可能,我擔心它可能不會是最輕微的痛苦之路。特別是,我不希望實際渲染根據視頻是否被捕獲而採取不同的執行路徑。此外,我會避免任何可能會降低正常非捕獲模式下的幀速率的內容。

如果解決方案在這個詞的任何一個意義上都是免費的,那麼這會很好,但這不是絕對的要求。一般來說,越少膨脹越好。另一方面,由於原因超出這個問題,不幸的是,我無法鏈接任何GPL專用代碼。

關於文件格式,我不能指望我的用戶開始使用Google的任何編解碼器,但只要還顯示視頻是一個基本級別的Windows用戶很容易,我真的不關心什麼格式是。但是,如果可以控制輸出的壓縮質量,那將是非常好的。

只是爲了澄清:我需要從像攝像機外部設備捕獲視頻,我也不是在鼠標的移動我真正感興趣的,即使讓他們沒有任何傷害。對音頻沒有要求;該應用程序不會產生任何噪音。

我使用Visual Studio 2008編寫C++,這個應用程序也受益於GLUT和GLUI。我對C++和鏈接庫以及類似的東西有着深刻的理解,但另一方面,對於我來說,OpenGL對我來說是非常新的:到目前爲止,我只學到了實際完成工作的必要位。

我並不需要一個解決方案超急,可以隨意把你的時間:)

回答

8

這裏有兩個不同的問題 - 如何從OpenGL應用程序搶框架,以及如何把它們變成一個電影文件。

第一個問題很簡單,您只需使用glReadPixels()抓取每個幀(如果需要性能,則通過PBO)。

第二個問題有點難度,因爲跨平臺解決方案(ffmpeg)往往是GPL或LGPL。 LGPL是否可以接受您的項目? Windows的這種做法(DirectShow)有點令人頭疼。

編輯:由於LGPL是好的,您可以使用ffmpeg,有關如何編碼視頻的示例,請參閱here

+0

是:LGPL沒問題。 – Reunanen 2008-09-30 20:22:11

+0

glReadPixels()似乎是我需要的第一個問題,謝謝! – Reunanen 2008-09-30 20:37:20

+0

@MikeF:該鏈接是胸圍 – 2011-11-17 09:26:27

0

最簡單的選項是保存應用程序中的每個渲染幀,然後將它們合併到AVI中。當您擁有AVI時,有許多庫可以將其轉換爲更優化的格式,或者可能完全跳過AVI步驟。

在獲取每個幀的方面,您可以通過渲染到您的建議的離屏紋理或直接使用backbuffer作爲源,如果您的硬件支持這一點。如果沒有嚴格的幀率處罰,做這些(並且保存每幀)都會很困難。

提供您的應用程序是確定性的,您可以將用戶操作「錄製」爲一系列輸入,然後使用導出模式將這些輸出依次呈現到屏幕外表面以生成AVI。

+0

幀率懲罰是可以接受的,只要它適用於真正捕捉視頻時。 該應用程序在不是隨機的意義上是確定性的,但顯示的內容除了用戶操作外,還基於外部測量設備的結果。 – Reunanen 2008-09-30 20:34:11

1

This確實尋找合併成AVI(由安德魯的建議),但是我真的希望避免LPBITMAPINFOHEADERs等

感謝您的答案,我將在成功通知,如果有相關的漂亮將是任何:)

在此期間,額外的技巧編碼從glReadPixels原始幀到視頻剪輯將不勝感激。

編輯:到目前爲止,Mike F建議的ffmpeg似乎是要走的路。但是,我還沒有涉及到實際的實施,但希望在不久的將來改變!

0

我不得不創建一個將OpenGL渲染記錄到視頻中的演示項目。我使用glReadPixels來獲取像素數據並使用OpenCV的cvWriteFrame創建視頻。 OpenCV讓你用divx甚至x264/vp8(用ffmpeg編譯)編寫。

我在博客文章上有一個更詳細的文章以及一個示例項目。 http://tommy.chheng.com/2013/09/09/encode-opengl-to-video-with-opencv/