【问题标题】:Process HDR10 video on Android with MediaCodec使用 MediaCodec 在 Android 上处理 HDR10 视频
【发布时间】:2020-06-07 18:28:39
【问题描述】:

我想在Android上使用OpenGL ES做HDR10的色调映射,首先是获取帧数据。在Android上通过mediacodec解码视频后,它的数据在一个外部的oes纹理上,我想知道解码hdr10视频时纹理的内部格式是什么。

我能否从这个外部 oes 纹理中获取 10 位数据,如果可能,如何在 OpenGL ES 中处理 10 位数据(使用浮点纹理?)。

我曾尝试查询纹理的格式,但失败了,报告的值似乎不正确。纹理的宽度和高度也是如此。

glGetTexLevelParameteriv(GL_TEXTURE_EXTERNAL_OES, 0, GL_TEXTURE_INTERNAL_FORMAT, &format);

【问题讨论】:

  • 您对此有任何更新吗?您是否设法使用 OpenGL ES 以任何方式处理 hdr10 视频?
  • 这个有两种选择,1.用MediaCodec解码,用opengles处理数据。(可能数据下采样到8bit,但颜色还可以)。 2. 使用 MediaCodec 解码并直接使用 SurfaceView 进行渲染,就像@why suggessted 一样。

标签: android opengl-es android-mediacodec hdr


【解决方案1】:

一般而言,对于 YUV,您需要使用外部采样器,其中包括将颜色转换为 RGB。对于 YUV 表面的 Android 内存布局没有标准,特别是对于有多个竞争“标准”的 10 位,因此您在此处所做的任何涉及原始 YUV 数据的操作都将是不可移植和设备的具体的。

我得到的 rgb 值是否与 HDR 视频中的 10 位值匹配?

假设它已正确转换,它应该是 10 位值的颜色转换表示。我显然没有办法验证它,这里也没有严格的规范。你能得到一个 8 位的等价物吗?是的,这当然是可能的。

【讨论】:

  • 谢谢@solidpixel,我想知道是否可以使用 mediacodec 解码 HDR10 视频,然后在 OpenGL ES 中处理外部 oes 纹理进行色调映射。我的意思是在我的着色器程序中,我可以像这样读取像素。 ``` 统一采样器ExternalOES u_texture; vec3 rgb = 纹理(u_texture,v_tex_coord_out).rgb; ```我得到的rgb值是不是HDR视频中的10位值?
  • 很抱歉格式不佳,因为我第一次使用这个网站。 :) 我的意思是 rgb 值已经是归一化值 0~1,我不知道它的精度是 8bit 还是 10bit。
【解决方案2】:

您无法从 oes 纹理中获取 10 位数据。我们不能设置 oes 纹理格式(例如,浮动纹理)。您可以通过将 oes 纹理输出到 fbo 来验证此过程。其实oes是8bits的。

【讨论】:

  • 你的意思是 Android OES 总是 8bit 纹理?我真的想知道在 Android 上使用 mediacodec 播放 10 位视频?
  • 是的,到目前为止 OES 确实是 8 位。我对 meidacodec 使用了 8 位和 10 位数据,但我只能得到 8 位(即 RGBA8)。如果要播放 10bits 视频,则不能使用 mediacodec + opengl es。 Mediacodec解码渲染是个不错的选择。
猜你喜欢
  • 2014-05-02
  • 2016-03-01
  • 1970-01-01
  • 2016-03-12
  • 2020-03-21
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多