我使用 MediaCodec 解码来自服务器的 h264 流并渲染帧。服务器编码的帧为 sRGB。解码器将结果存储到oes纹理中。我知道samplerExternalOES会将YUV转换为RGB。
有片段着色器代码:
#extension GL_OES_EGL_image_external_essl3 : enable
#extension GL_OES_EGL_image_external : enable
in lowp vec2 uv;
out lowp vec4 FragColor;
uniform samplerExternalOES OesTexture;
void main()
{
vec3 tmpColor = texture(OesTexture, uv).rgb;
...
FragColor= vec4(tmpColor, 1.0);
}
“tmpColor”是线性 RGB 吗?还是sRGB?
如果用作外部纹理的视频帧的颜色是非线性的,那么采样的颜色也将是非线性的。
对外部纹理进行采样将返回相同的 RGBA 向量 色彩空间作为源图像。 如果源图像存储为YUV (或其他基础)然后 YUV 值将转换为 RGB 价值观。 (但是这些 RGB 值将与 原始图像。 这里的色彩空间包括线性或非线性 样本的编码。例如,如果原始图像位于 sRGB 颜色空间,那么采样器返回的 RGB 值也将 为 sRGB,并且如果原始图像存储在 ITU-R Rec.第601章 那么采样器返回的RGB值将是 ITU-R 建议书。 601 色彩空间。)
如果您处理的是常规图像,那么您可以使用其他扩展(EXT_sRGB、EXT_texture_sRGB)进行自动伽玛编码/解码。
但是视频可以使用各种传递函数(线性、伽马、HLG、PQ)进行编码。这是由 MediaFormat.KEY_COLOR_TRANSFER 指定的。