gpt4 book ai didi

android - 如何使用 NDK 有效地放大视频帧

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:59 26 4
gpt4 key购买 nike

我正在做一个关于处理视频帧的 Android 项目,我需要在显示之前处理每一帧。该过程包括将帧从1920x1080分辨率放大到2560x1440、色彩空间转换和一些必要的基于RGB的图像处理,所有这些工作应在33ms~40ms内完成。

我用 arm neon 优化了 yuv->rgb 和其他处理,它们运行良好。但是我必须首先将帧从 1080p 放大到 2k 分辨率,这是现在的性能瓶颈。

我的问题是如何在 20 毫秒内有效地将图像从 1080p 放大到 2k 分辨率,我对缩放算法没有太多经验,所以任何建议都有帮助。我可以使用 arm neon 来优化现有算法吗?

硬件环境:

  • 中央处理器:三星 Exynos 5420
  • 内存:3GB
  • 显示:2560X1600 像素

更新:

我将描述我的解码过程,我使用MediaCodec将普通视频(H.264)解码为YUV(NV12),默认解码器是硬件,速度非常快。然后我用arm neon把NV12转成RGBW,然后把RGBW帧传给surfaceflinger显示。我只使用普通的 SurfaceView 而不是 GLSurfaceView。

瓶颈在于如何将 YUV 从 1080p 快速扩展到 2K。

最佳答案

我发现示例效果很好,所以请允许我使用这个使用 OpenGL 着色器从 YUV -> RGB 转换的示例程序:http://www.fourcc.org/source/YUV420P-OpenGL-GLSLang.c

我对您的计划的设想是:

  1. 硬件视频解码H.264码流-> YUV数组
  2. 将该 YUV 数组作为纹理上传到 OpenGL;实际上,您将上传 3 种不同的纹理——Y、U 和 V
  3. 运行 fragment 着色器,将这些 Y、U 和 V 纹理转换为 RGB(W) 图像;这将在显存中产生一个新的纹理
  4. 针对上一步生成的纹理运行新的 fragment 着色器以缩放图像

这里可能涉及一些学习曲线,但根据您的问题描述,我认为它是可行的。一步一个脚印:准备好 OpenGL 框架,尝试只上传 Y 纹理并编写一个简单的 fragment 着色器,它只根据 Y 样本发出一个灰度像素,然后继续正确转换图像,然后得到一个真正简单的上采样器工作,然后将更复杂的上采样器投入使用。

关于android - 如何使用 NDK 有效地放大视频帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24230398/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com