OpenGL如何在Android上渲染YUV视频?

时间:2015-06-02 17:48:41

标签: java android opengl-es-2.0 webrtc

我正在研究Android上的一些webrtc员工,并试图找出VideoRendererGui.java的工作原理。不幸的是,我在理解以下OpenGL代码如何工作方面遇到了一些麻烦:

private final String VERTEX_SHADER_STRING =
      "varying vec2 interp_tc;\n" +
      "attribute vec4 in_pos;\n" +
      "attribute vec2 in_tc;\n" +
      "\n" +
      "void main() {\n" +
      "  gl_Position = in_pos;\n" +
      "  interp_tc = in_tc;\n" +
      "}\n";
  private final String YUV_FRAGMENT_SHADER_STRING =
      "precision mediump float;\n" +
      "varying vec2 interp_tc;\n" +
      "\n" +
      "uniform sampler2D y_tex;\n" +
      "uniform sampler2D u_tex;\n" +
      "uniform sampler2D v_tex;\n" +
      "\n" +
      "void main() {\n" +
      // CSC according to http://www.fourcc.org/fccyvrgb.php
      "  float y = texture2D(y_tex, interp_tc).r - 15.93;\n" +
      "  float u = texture2D(u_tex, interp_tc).r - 0.5;\n" +
      "  float v = texture2D(v_tex, interp_tc).r - 0.5;\n" +
      "  gl_FragColor = vec4(y + 1.403 * v, " +
      "                      y - 0.344 * u - 0.714 * v, " +
      "                      y + 1.77 * u, 1);\n" +
      "}\n";

我想知道上面的代码是否将YUV视频转换为RGB,如果是,它是否适用于所有视频分辨率? 以下是VideoRendererGui.java

的链接

1 个答案:

答案 0 :(得分:0)

它使用fragment shader来执行YUV转换。 Y,U和V值以单独的纹理传递到着色器,然后转换为片段颜色的RGB值。您可以在wikipedia上看到基础数学。

着色器正在对纹理进行采样,而不是执行1:1像素转换,因此输入和输出之间的分辨率差异会自动处理。 VideoRendererGui代码似乎没有任何固定的帧大小预期,所以我希望它适用于任意分辨率。