我在做一个关于图像处理的项目。我实时接收一个原始的h264视频流,并使用mediacodec对其进行解码。我已经成功地将解码的视频显示在TextureView或SurfaceView上。现在我想处理每一帧,使用opencv4android对它做些什么,并在屏幕上显示更新的视频帧。我知道opencv有一个示例项目演示如何处理来自手机摄像头的视频帧,但我想知道如果我有其他视频源,该如何处理。
我还有一些关于纹理视图的问题:
SurfaceTextureListener中的onSurfaceTextureUpdated()做什么?如果我在这个函数中调用getBitmap(),那么这是否意味着我得到了视频的每一帧?那么surfacetexture.onframeavailableListener呢?
是否可以使用隐藏的纹理视图作为中间,提取其帧进行处理并将其渲染回另一个曲面(例如,用于显示的opengl es纹理)?

最佳答案

Grafika中使用相机作为输入的各种示例也可以使用来自视频流的输入。不管是哪种方式,都可以将视频帧发送到曲面。
如果你想在软件中而不是在gpu上处理一帧视频,事情会变得更加困难。您要么必须在曲面上接收帧并将其复制到内存缓冲区,可能在该过程中执行rgb到yuv颜色转换,要么必须从mediacodec获得yuv缓冲区输出。后者很棘手,因为有几种不同的格式是可能的,包括高通公司专有的平铺格式。
关于纹理视图:
onSurfaceTextureUpdated()在TextureView接收到新帧时调用。您可以使用getBitmap()获取视频的每一帧,但您需要调整视频播放的速度以匹配过滤速度--如果您落后,TextureView将丢弃帧。
你可以通过在上面放置其他视图元素来创建一个“隐藏的TextureView”,但那是愚蠢的。textureview使用SurfaceTexture将视频帧转换为opengl es纹理,然后将它们作为绘制视图ui的一部分进行渲染。使用glReadPixels()检索位图数据。你可以直接使用这些元素。大薄片ExtractMpegFramesTest证明了这一点。

关于android - 从Mediacodec输出处理帧并在Android上更新帧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34986857/

10-14 13:28
查看更多