2011-02-03 24 views
2

我一直在從iPhone相機中抓取實時視頻幀,並將它們作爲紋理應用到平面OpenGL幾何圖形,以便使用着色器來處理相機輸入。有沒有人知道是否可以抓住處理過的紋理並將它們存儲在電影文件中?OpenGL ES:將一系列紋理存儲爲電影文件

這似乎需要很大的處理能力,我不確定最好的處理方式是什麼 - 或者甚至是可能的。這裏的動機是能夠對從相機抓取的視頻進行有趣的着色效果,然後將結果存儲爲與其他人共享。

在此先感謝您的想法。

回答

5

我不能爲表現發表評論,但你想要做的是:

  • 創建AVAssetWriter(這可能需要進入的樣本,並將它們寫出來在H.264,沒有任何其他的文件格式似乎在當前的iOS版本中支持)
  • AVAssetWriterInput附加到資產編寫器以提供視頻幀(因爲資產編寫者需要一個或多個輸入,每個輸入提供資產的不同方面);
  • AVAssetWriterInputPixelBufferAdaptor附加到資產寫入器輸入,以便您可以在輸入處推送像素緩衝區。您需要告訴資產編寫者輸入它是期望實時媒體數據。這樣做會告訴它只是爲了隨時準備好輸入。您可以在提供幀時指定幀定時,因此它不會對其餘代碼進行性能要求。

從那裏,你只需要推動CVImageBuffers到你的像素緩衝適配器。在OS X中有一個方便的Core Video OpenGL緩衝區類型,但它似乎在iOS上不存在。相反,您需要glReadPixels以及CVPixelBufferCreate等,鎖定像素緩衝區並直接寫入其基址。希望你能得到一些你可以直接傳遞給OpenGL的東西,而不需要在兩者之間拖動字節。

假設iPhone具有專用的H.264編碼器,主要的性能瓶頸可能是glReadPixels,導致幀緩衝區中的任何內容都需要傳輸並重新格式化爲CPU。如果你把它全部設置好,結果看起來很慢,我會首先在那裏調查。

+0

`glReadPixels`和`CVPixelBuffer`s工作得很好。我遇到的唯一問題是「關閉」的顏色。我認爲這是由傳遞給`glReadPixels`的GL_RGBA`和`CVPixelBuffer`使用的BGRA引起的。任何關於這些像素格式的想法,或者我可以如何糾正? – MrDatabase 2011-10-25 19:55:41