我正在做一个关于图像处理的项目。我实时接收原始h264视频流并使用MediaCodec对其进行解码。我已经在TextureView或SurfaceView上成功显示了解码视频。现在我想处理每个帧,使用OpenCV4Android做一些事情并在屏幕上显示更新的视频帧。我知道OpenCV有一个示例项目,演示如何从手机摄像头处理视频帧,但我想知道如果我有另一个视频源如何做到这一点。
我在TextureView上也有一些问题:
SurfaceTextureListener的onSurfaceTextureUpdated()有什么作用?如果我在这个函数中调用getBitmap(),那么这是否意味着我获得了视频的每一帧?那么SurfaceTexture.onFrameAvailableListener呢?
是否可以使用隐藏的TextureView作为中间体,提取其帧进行处理并将其渲染回另一个表面,例如,用于显示的OpenGL ES纹理?
答案 0 :(得分:3)
Grafika中使用Camera作为输入的各种示例也可以使用视频流的输入。您可以将视频帧发送到Surface。
如果你想在软件中使用一帧视频,而不是在GPU上工作,事情会变得更加困难。您必须在Surface上接收帧并将其复制到内存缓冲区,可能在此过程中执行RGB到YUV颜色转换,或者您必须从MediaCodec获取YUV缓冲区输出。后者很棘手,因为可能有一些不同的格式,包括高通公司专有的平铺格式。
关于TextureView:
onSurfaceTextureUpdated()
。您可以使用getBitmap()
获取视频的每一帧,但您需要调整视频播放速度以匹配您的过滤速度 - 如果您落后,TextureView将丢弃帧。
您可以创建一个隐藏的TextureView"通过将其他View元素放在其上,但这将是愚蠢的。 TextureView使用SurfaceTexture将视频帧转换为OpenGL ES纹理,然后将它们渲染为绘制View UI的一部分。使用glReadPixels()
检索位图数据。您可以直接使用这些元素。 bigflake ExtractMpegFramesTest证明了这一点。