android上的WebGL视频纹理大小限制-如何使用3840*2160?

android上的WebGL视频纹理大小限制-如何使用3840*2160?,android,google-chrome,video,webgl,Android,Google Chrome,Video,Webgl,我正在开发一个WebGL应用程序,它使用HLS.js从HTML5视频中获取纹理流。它在台式机上运行得很好,在移动Android上可以运行1920*1080视频,但不能运行3840*2160视频 我已经在两款高端设备(Xperia X Performance、三星Galaxy S8)上测试了该应用程序,但都无法用于4k视频 我知道视频可以在这些设备上播放,因为我还有一个调试模式,其中视频元素连接到DOM,并且视频呈现完美 我也在这些设备上使用过,该页面显示我应该能够使用4096*4096纹理 我还

我正在开发一个WebGL应用程序,它使用HLS.js从HTML5视频中获取纹理流。它在台式机上运行得很好,在移动Android上可以运行1920*1080视频,但不能运行3840*2160视频

我已经在两款高端设备(Xperia X Performance、三星Galaxy S8)上测试了该应用程序,但都无法用于4k视频

我知道视频可以在这些设备上播放,因为我还有一个调试模式,其中视频元素连接到DOM,并且视频呈现完美

我也在这些设备上使用过,该页面显示我应该能够使用4096*4096纹理

我还使用Javascript ArrayBuffer手动生成了一个3840*2160,并且该纹理得到了正确渲染

这就是我复制视频的方式

gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, this.videoElement);
在Chrome Android上对3840*2160大小的视频执行此调用时,我得到以下日志打印

SurfaceUtils:为3840x2160设置本机窗口0xc9ef2008,颜色0x7fa30c04,旋转0,使用0x200002900

铬:[信息:控制台(11818)]“WebGL:无效的值:texImage2D: 宽度或高度超出范围“

gl.getError()
映射到此错误代码的:

GL_无效_值,0x0501

这些是我用于背衬纹理的参数

const tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
下面是我如何生成和上传测试纹理

const width = 3840;
const height = 2160;

const generateTex = (w: number, h: number): number[] => {
    const res = [];
    for (let i = 0; i < w * h; i++) {
        res.push(0, 255, 0);
    }
    return res;
};

const image = new Uint8Array(generateTex(width, height));
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, width, height, 0, gl.RGB, gl.UNSIGNED_BYTE, image);
const width=3840;
常数高度=2160;
const generateTex=(w:number,h:number):number[]=>{
常数res=[];
for(设i=0;i
texImage2D
的文档中说

HTMLVideoElement类型的源

纹理的宽度和高度 设置为中视频上传帧的宽度和高度 像素

问题是:是否有一个规范可以解释为什么我的3840*2160纹理无法渲染

TL;博士

  • 高端设备(Xperia X Performance、Galaxy S8)
  • 安卓浏览器
  • 我可以上传大小为3840*2160的自定义纹理并进行渲染
  • 我可以使用
    标签解码和播放3840*2160大小的视频
  • 我无法将3840*2160视频中的帧上载到WebGL
  • 较低的分辨率就可以了

谢谢

经过一周的努力来理解这个问题,现在很明显错误出在我们这边

该视频确实创建为3840 x 2160,但是从分辨率为3840 x 4320的源视频创建的。当将视频转换为3840x2160时,ffmpeg将纵横比设置为(3840/4320),导致Android将视频放大回该大小。膨胀大小的高度>4096,这就是无法创建纹理的原因

我们在其他平台(本机应用程序)上没有看到这个问题,所以这可能是安卓媒体播放器的一些怪癖

我们通过手动将“正确”的纵横比(3840/2160)设置为ffmpeg参数,解决了这一问题

我学到的:

不要假设VLC或QuickTime等应用程序报告的分辨率会正确反映其他平台上发生的情况。在实现了检查HTML视频元素分辨率所需的代码之后,很明显Android上发生了与其他平台不同的事情