从Mediacodec输出处理帧并在Android上更新帧

从Mediacodec输出处理帧并在Android上更新帧,第1张

概述我正在做一个图像处理项目.我实时接收原始的h264视频流,并使用MediaCodec对其进行解码.我已经在TextureView或SurfaceView上成功显示了解码后的视频.现在,我要处理每个帧,使用OpenCV4Android对其进行处理,然后在屏幕上显示更新的视频帧.我知道OpenCV有一个示例项目,该示例项目演示

我正在做一个图像处理项目.我实时接收原始的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对此进行了演示.

总结

以上是内存溢出为你收集整理的从Mediacodec输出处理帧并在Android上更新帧全部内容,希望文章能够帮你解决从Mediacodec输出处理帧并在Android上更新帧所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1120582.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存