OpenGL 如何在 Android 上渲染 YUV 视频?
How does OpenGL render YUV video on Android?
我正在 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
的 link
正在使用 fragment shader to perform the YUV conversion. The Y, U, and V values are passed into the shader in separate textures, then converted to RGB values for the fragment color. You can see the underlying math on wikipedia。
着色器正在对纹理进行采样,而不是执行 1:1 像素转换,因此输入和输出之间的任何分辨率差异都会自动处理。 VideoRendererGui 代码似乎对帧大小没有任何固定预期,因此我希望它适用于任意分辨率。
我正在 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
的 link正在使用 fragment shader to perform the YUV conversion. The Y, U, and V values are passed into the shader in separate textures, then converted to RGB values for the fragment color. You can see the underlying math on wikipedia。
着色器正在对纹理进行采样,而不是执行 1:1 像素转换,因此输入和输出之间的任何分辨率差异都会自动处理。 VideoRendererGui 代码似乎对帧大小没有任何固定预期,因此我希望它适用于任意分辨率。