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