回答
從iOS 4.0開始,您可以使用AVCaptureDeviceInput
將攝像頭作爲設備輸入,並將其連接到AVCaptureVideoDataOutput
,並將其設置爲代表。通過爲攝像機設置一個32bpp的BGRA格式,代表對象將以完美的格式接收來自攝像機的每幀,並立即傳送到glTexImage2D
(或glTexSubImage2D
,如果設備不支持非冪次冪紋理; I認爲MBX設備屬於這一類)。
有一堆幀大小和幀速率選項;猜測你必須調整這些取決於你想要使用GPU的其他因素。我發現一個完全無關緊要的場景,只有帶有紋理的四邊形才能顯示最新的幀,僅在新幀到達iPhone 4時重新繪製,才能夠顯示該設備的最大720p 24fps的素材,而沒有任何明顯的延遲。我沒有做過比這更徹底的基準測試,所以希望別人能提供建議。
原則上,根據API,幀可以返回一些在掃描線之間的內存填充,這意味着在發佈到GL之前需要對內容進行一些混洗,因此您需要爲此實現代碼路徑。在實踐中,純粹從經驗角度來講,似乎iOS的當前版本從來沒有以這種形式返回圖像,所以它不是真正的性能問題。
編輯:它現在非常接近三年後。在此期間,蘋果公司發佈了iOS 5,6和7.其中5款產品分別推出了CVOpenGLESTexture
和CVOpenGLESTextureCache
,這些都是將視頻從捕獲設備傳輸到OpenGL的智能方式。 Apple提供樣本代碼here,其中特別感興趣的部分在RippleViewController.m
,特別是其setupAVCapture
和captureOutput:didOutputSampleBuffer:fromConnection:
- 見行196-329。可悲的條款和條件阻止代碼的重複,這裏不附加整個項目,但一步一步的設置是:
- 創建
CVOpenGLESTextureCacheCreate
和AVCaptureSession
; - 爲視頻抓取合適的
AVCaptureDevice
; - 用該捕獲設備創建一個
AVCaptureDeviceInput
; - 附加一個
AVCaptureVideoDataOutput
並告訴它將您稱爲樣本緩衝區委託。
在接收每個樣品緩衝液:
- 從它那裏得到的
CVImageBufferRef
; - 使用
CVOpenGLESTextureCacheCreateTextureFromImage
從CV圖像緩衝區獲得Y和UVCVOpenGLESTextureRef
; - 從CV OpenGLES紋理引用中獲取紋理目標和名稱以綁定它們;
- 在着色器中結合了亮度和色度。
使用RosyWriter爲更好的示例如何做OpenGL視頻渲染。性能非常好,特別是如果您降低幀速率(在1080P/30時大約10%,在1080P/15時大於5%)。
- 1. iOS:使用alpha透明度的GL紋理視頻
- 2. 使用視頻作爲紋理與Three.js
- 3. 轉換爲Cinder gl ::紋理
- 4. 我可以用Python處理視頻嗎?
- 5. 在Unity中使用GL Studio視頻
- 6. 可以使用隨機紋理ID嗎?
- 7. 我可以使用SVG作爲HTML 5視頻的海報嗎?
- 8. 如何在開放的gl iphone中爲動畫製作紋理?
- 9. iOS - 可以播放RBGA視頻嗎?
- 10. 程序GL紋理
- 11. 視頻作爲在three.js中的紋理android
- 12. Opengl視頻紋理
- 13. 使用nineveh gl frsmework更改紋理
- 14. 我可以將視頻作爲blob存儲在indexedDB中嗎?
- 15. Vuforia:可以在iOS中使用alpha來播放電影紋理?
- 16. Android:視頻紋理視圖
- 17. OpenGL ES到iOS中的視頻(渲染爲具有iOS 5紋理緩存的紋理)
- 18. 使用YouTube視頻獲取webgl紋理?
- 19. 你可以在three.js中加載一個作爲紋理加載爲其他紋理mipmap的圖像嗎?
- 20. 在recyclerview中使用紋理視圖播放視頻
- 21. 在iOS中,你可以使用NSDictionary作爲文本文件嗎?
- 22. 我可以在iOS中獲得YouTube視頻嗎?
- 23. 將Webkit渲染爲GL紋理
- 24. 在SceneKit中使用MPMoviePlayerController作爲紋理
- 25. 我可以使用閃存來處理視頻嗎?
- 26. Open GL Es1.0紋理參數?
- 27. 開放GL選擇紋理
- 28. 可以將GL_FLOAT紋理作爲COLOR附件分配給FBO嗎?
- 29. 我可以在android中播放任何視頻/音頻作爲widget嗎?
- 30. Open GL中的紋理採樣
感謝您的回答。我會去挖。 – Eonil 2010-11-22 07:35:43
把整件事情聯繫起來只有200條線;抱歉沒有發佈代碼 - 我只在工作時解決了問題,因此我被禁止發佈我的內容。但它確實很平凡,我花了很多時間去弄清楚文檔中哪些是合適的類,而不是編碼。 – Tommy 2010-11-22 10:30:29
@Eonil如果您喜歡他的回答,請將其標記爲已接受的答案。 – pr1001 2011-02-26 13:11:10