gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:48:12 25 4
gpt4 key购买 nike

我正在 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 的链接

最佳答案

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

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

关于java - OpenGL如何在Android上渲染YUV视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30603093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com