要使用Android MediaPlayer或MediaCodec播放媒体,大部分时间都使用SurfaceView或GLSurfaceView(还有另一种方法可以使用TextureView实现这一点,但我们不在这里讨论它,因为它有点不同的视图类型)
据我所知,无法从SurfaceView捕获视频帧 - 您无法访问hw overlay。 GLSurfaceView怎么样?既然我们可以访问YUV像素(我们是,对吧?),有可能吗?
有人能指出我在哪里可以找到样本代码吗? 我不认为下面的解释可以工作,因为它假设颜色格式是RGBA,在上面的情况下,我认为它是YUV。 When using GLES20.glReadPixels on android, the data returned by it is not exactly the same with the living preview
谢谢你,祝你有个美好的一天。
答案 0 :(得分:0)
你是正确的,因为你无法从Surface回读。它是生产者 - 消费者对的生产者。 GLSurfaceView只是围绕SurfaceView的一堆代码(理论上)使得GLES更容易使用。
所以你必须在其他地方发送预览。一种方法是将其发送到SurfaceTexture,SurfaceTexture将发送到其Surface的每个帧转换为GLES纹理。然后可以将纹理渲染两次,一次用于显示,一次用于屏幕外的pbuffer,可以保存为位图(就像this question)。
我不确定你为什么不想谈论TextureView。这是一个使用SurfaceTexture的视图,它提供了getBitmap()调用,可以完全按照您的需要进行调用。