回答
从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