如何使用NDK有效地按比例放大视频帧

Nic*_*Ine 5 c++ video android multimedia android-ndk

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

我已经用手臂霓虹灯优化了yuv-> rgb和其他处理,它们运行良好。但是我必须首先将帧从1080p扩展到2k分辨率,现在这是性能的瓶颈。

我的问题是如何在20ms内有效地将图像从1080p缩放到2k,我对缩放算法没有太多的经验,所以任何建议都是有帮助的。我可以使用臂霓虹灯优化现有算法吗?

硬件环境:

  • CPU:三星Exynos 5420
  • 记忆体:3GB
  • 显示:2560X1600 px

更新:

我将描述我的解码过程,我使用MediaCodec将普通视频(H.264)解码为YUV(NV12),默认解码器是硬件,速度非常快。然后,我使用臂霓虹灯将NV12转换为RGBW,然后将RGBW帧发送到surfaceflinger进行显示。我只使用普通的SurfaceView而不是GLSurfaceView。

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

Mul*_*ike 1

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

我对你的计划的设想是:

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

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