【问题标题】:Android - Capturing video frame from GLSurfaceView and SurfacViewAndroid - 从 GLSurfaceView 和 SurfacView 捕获视频帧
【发布时间】:2016-03-14 05:39:18
【问题描述】:

要使用 Android MediaPlayer 或 MediaCodec 播放媒体,大多数情况下,您使用 SurfaceView 或 GLSurfaceView(还有另一种方法可以使用 TextureView 来实现,但这里我们不讨论它,因为它的视图类型有点不同)

据我所知,从 SurfaceView 捕获视频帧是不可能的 - 您无权访问硬件覆盖。 GLSurfaceView 怎么样?既然我们可以访问 YUV 像素(我们是,对吗?),这可能吗?

谁能指出我在哪里可以找到示例代码来做到这一点? 我认为下面的解释行不通,因为它假设颜色格式是 RGBA,在上述情况下,我认为它是 YUV。 When using GLES20.glReadPixels on android, the data returned by it is not exactly the same with the living preview

谢谢你,祝你有美好的一天。

【问题讨论】:

标签: android video glsurfaceview


【解决方案1】:

您是正确的,因为您无法从 Surface 读取。它是生产者-消费者对的生产者一方。 GLSurfaceView 只是包裹在 SurfaceView 周围的一堆代码,(理论上)可以更轻松地使用 GLES。

因此,您必须将预览发送到其他地方。一种方法是将其发送到 SurfaceTexture,它将发送到其 Surface 的每一帧转换为 GLES 纹理。然后可以将纹理渲染两次,一次用于显示,一次用于可以保存为位图的屏幕外 pbuffer(就像this question)。

我不知道你为什么不想谈论 TextureView。它是一个在底层使用 SurfaceTexture 的视图,它提供了一个 getBitmap() 调用,完全符合您的要求。

【讨论】:

  • 感谢fadden,之所以不想谈TextureView,是因为有一个简单的方法可以使用TextureView,而我对GLSurfaceView的方法比较好奇。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
相关资源
最近更新 更多