Three.js 未捕获的安全错误:无法在“WebGLRenderingContext”上执行“texImage2D”:

2024-01-01

这个问题源于之前html5视频在android手机上无法播放的问题。 (Three.js WebGLRenderered 视频无法在 Android 手机上播放 https://stackoverflow.com/questions/26109487/three-js-webglrenderered-videos-dont-play-on-android-phones)

正如 mrdoob 提到的,video.play() 在移动设备上应该通过用户发起的事件(例如单击)明确显示。完成此操作后,我就可以播放该文件了。但是我只能听到视频的音频部分。屏幕仍然一片空白。此外,我在开发控制台上看到以下异常。

未捕获的安全错误:无法在“WebGLRenderingContext”上执行“texImage2D”:视频元素包含跨源数据,并且可能无法加载。三分钟.js:507

我没有通过我的代码加载任何图像,正如您在下面的代码中看到的那样,错误似乎被抛出在 Three.min.js 文件中。 (下面的代码是稍加修改的版本http://trijs.org/examples/#webgl_materials_video http://threejs.org/examples/#webgl_materials_video使其在移动设备上运行)

请注意,这仅发生在移动设备上。该示例在网络上完美运行。

非常感谢您的帮助!

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>three.js webgl - materials - video</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
        <style>
            body {
                background-color: #000;
                color: #fff;
                margin: 0px;
                overflow: hidden;
                font-family:Monospace;
                font-size:13px;
                text-align:center;
                font-weight: bold;
                text-align:center;
            }

            a {
                color:#0078ff;
            }

            #info {
                color:#fff;
                position: absolute;
                top: 0px; width: 100%;
                padding: 5px;
                z-index:100;
            }

        </style>
    </head>
    <body>

        <div id="info">
            <a href="http://threejs.org" target="_blank">three.js</a> - webgl video demo. playing <a href="http://durian.blender.org/" target="_blank">sintel</a> trailer
        </div>

        <script src="js/three.min.js"></script>

        <script src="js/shaders/ConvolutionShader.js"></script>
        <script src="js/shaders/CopyShader.js"></script>

        <script src="js/postprocessing/EffectComposer.js"></script>
        <script src="js/postprocessing/RenderPass.js"></script>
        <script src="js/postprocessing/MaskPass.js"></script>
        <script src="js/postprocessing/BloomPass.js"></script>
        <script src="js/postprocessing/ShaderPass.js"></script>

        <script src="js/Detector.js"></script>

        <video id="video" autoplay loop style="display:none">
            <source src="textures/sintel.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>
            <source src="textures/sintel.ogv" type='video/ogg; codecs="theora, vorbis"'>
        </video>

        <script>

            if ( ! Detector.webgl ) Detector.addGetWebGLMessage();

            var container;

            var camera, scene, renderer, element;

            var video, texture, material, mesh;

            var composer;

            var mouseX = 0;
            var mouseY = 0;

            var windowHalfX = window.innerWidth / 2;
            var windowHalfY = window.innerHeight / 2;

            var cube_count,

                meshes = [],
                materials = [],

                xgrid = 20,
                ygrid = 10;

            init();
            animate();

            function init() {

                container = document.createElement( 'div' );
                document.body.appendChild( container );

                camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 10000 );
                camera.position.z = 500;

                scene = new THREE.Scene();

                var light = new THREE.DirectionalLight( 0xffffff );
                light.position.set( 0.5, 1, 1 ).normalize();
                scene.add( light );

                renderer = new THREE.WebGLRenderer( { antialias: false } );
                renderer.setSize( window.innerWidth, window.innerHeight );

                element=renderer.domElement;
                element.addEventListener('click', fullscreen, false);

                container.appendChild( renderer.domElement );

                video = document.getElementById( 'video' );

                texture = new THREE.Texture( video );
                texture.minFilter = THREE.LinearFilter;
                texture.magFilter = THREE.LinearFilter;
                texture.format = THREE.RGBFormat;
                texture.generateMipmaps = false;

                //

                var i, j, ux, uy, ox, oy,
                    geometry,
                    xsize, ysize;

                ux = 1 / xgrid;
                uy = 1 / ygrid;

                xsize = 480 / xgrid;
                ysize = 204 / ygrid;

                var parameters = { color: 0xffffff, map: texture },
                    material_base = new THREE.MeshLambertMaterial( parameters );

                renderer.initMaterial( material_base, scene.__lights, scene.fog );

                cube_count = 0;

                for ( i = 0; i < xgrid; i ++ )
                for ( j = 0; j < ygrid; j ++ ) {

                    ox = i;
                    oy = j;

                    geometry = new THREE.BoxGeometry( xsize, ysize, xsize );

                    change_uvs( geometry, ux, uy, ox, oy );

                    materials[ cube_count ] = new THREE.MeshLambertMaterial( parameters );

                    material = materials[ cube_count ];

                    material.hue = i/xgrid;
                    material.saturation = 1 - j/ygrid;

                    material.color.setHSL( material.hue, material.saturation, 0.5 );

                    mesh = new THREE.Mesh( geometry, material );

                    mesh.position.x =   ( i - xgrid/2 ) * xsize;
                    mesh.position.y =   ( j - ygrid/2 ) * ysize;
                    mesh.position.z = 0;

                    mesh.scale.x = mesh.scale.y = mesh.scale.z = 1;

                    scene.add( mesh );

                    mesh.dx = 0.001 * ( 0.5 - Math.random() );
                    mesh.dy = 0.001 * ( 0.5 - Math.random() );

                    meshes[ cube_count ] = mesh;

                    cube_count += 1;

                }

                renderer.autoClear = false;

                document.addEventListener( 'mousemove', onDocumentMouseMove, false );

                // postprocessing

                var renderModel = new THREE.RenderPass( scene, camera );
                var effectBloom = new THREE.BloomPass( 1.3 );
                var effectCopy = new THREE.ShaderPass( THREE.CopyShader );

                effectCopy.renderToScreen = true;

                composer = new THREE.EffectComposer( renderer );

                composer.addPass( renderModel );
                composer.addPass( effectBloom );
                composer.addPass( effectCopy );

                //

                window.addEventListener( 'resize', onWindowResize, false );

            }
            function fullscreen() {

                video.play();
                console.log(video);
                  if (container.requestFullscreen) {
                    container.requestFullscreen();
                  } else if (container.msRequestFullscreen) {
                    container.msRequestFullscreen();
                  } else if (container.mozRequestFullScreen) {
                    container.mozRequestFullScreen();
                  } else if (container.webkitRequestFullscreen) {
                    container.webkitRequestFullscreen();
                  }
                }

            function onWindowResize() {

                windowHalfX = window.innerWidth / 2;
                windowHalfY = window.innerHeight / 2;

                camera.aspect = window.innerWidth / window.innerHeight;
                camera.updateProjectionMatrix();

                renderer.setSize( window.innerWidth, window.innerHeight );
                composer.reset();

            }

            function change_uvs( geometry, unitx, unity, offsetx, offsety ) {

                var faceVertexUvs = geometry.faceVertexUvs[ 0 ];

                for ( var i = 0; i < faceVertexUvs.length; i ++ ) {

                    var uvs = faceVertexUvs[ i ];

                    for ( var j = 0; j < uvs.length; j ++ ) {

                        var uv = uvs[ j ];

                        uv.x = ( uv.x + offsetx ) * unitx;
                        uv.y = ( uv.y + offsety ) * unity;

                    }

                }

            }


            function onDocumentMouseMove(event) {

                mouseX = ( event.clientX - windowHalfX );
                mouseY = ( event.clientY - windowHalfY ) * 0.3;

            }

            //

            function animate() {

                requestAnimationFrame( animate );

                render();

            }

            var h, counter = 1;

            function render() {

                var time = Date.now() * 0.00005;

                camera.position.x += ( mouseX - camera.position.x ) * 0.05;
                camera.position.y += ( - mouseY - camera.position.y ) * 0.05;

                camera.lookAt( scene.position );

                if ( video.readyState === video.HAVE_ENOUGH_DATA ) {

                    if ( texture ) texture.needsUpdate = true;

                }

                for ( i = 0; i < cube_count; i ++ ) {

                    material = materials[ i ];

                    h = ( 360 * ( material.hue + time ) % 360 ) / 360;
                    material.color.setHSL( h, material.saturation, 0.5 );

                }

                if ( counter % 1000 > 200 ) {

                    for ( i = 0; i < cube_count; i ++ ) {

                        mesh = meshes[ i ];

                        mesh.rotation.x += 10 * mesh.dx;
                        mesh.rotation.y += 10 * mesh.dy;

                        mesh.position.x += 200 * mesh.dx;
                        mesh.position.y += 200 * mesh.dy;
                        mesh.position.z += 400 * mesh.dx;

                    }

                }

                if ( counter % 1000 === 0 ) {

                    for ( i = 0; i < cube_count; i ++ ) {

                        mesh = meshes[ i ];

                        mesh.dx *= -1;
                        mesh.dy *= -1;

                    }

                }

                counter ++;

                renderer.clear();
                composer.render();

            }


        </script>

    </body>
</html>

正如这里所讨论的:https://code.google.com/p/chromium/issues/detail?id=173727 https://code.google.com/p/chromium/issues/detail?id=173727“video”属性应该有这样的设置:

video.setAttribute('crossorigin', 'anonymous');

但仅此一点并不能解决问题。这必须在 .load() 和 .play() 之前设置。我在 .load() 之后遇到了这个,但它不起作用。所以这样做:

video.setAttribute('crossorigin', 'anonymous');
video.src = "video/test.m4v";
video.src = "video/test.mp4";
video.load(); // must call after setting/changing source
video.play();

此解决方案适用于由于上述安全错误而无法在移动设备上播放的视频。


只是为了清楚crossorigin设置告诉浏览器向服务器请求使用视频的权限。服务器仍然必须授予该权限。如果服务器没有授予权限设置crossorigin属性不允许您使用该视频。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Three.js 未捕获的安全错误:无法在“WebGLRenderingContext”上执行“texImage2D”: 的相关文章

  • Three.js 在平面上旋转相机

    我的应用程序中有一个相机 camera new THREE PerspectiveCamera 75 window innerWidth window innerHeight 0 1 1000 camera position z 1 cam
  • requestAnimationFrame 仅被调用一次

    我正在尝试在 Ionic 2 应用程序中使用 ThreeJS 实现非常基本的动画 基本上是尝试旋转一个立方体 但立方体没有旋转 因为 requestAnimationFrame 仅在渲染循环内执行一次 I m able to see onl
  • 向几何体添加细分

    我正在尝试向球体添加细分 如下所示 http stemkoski github com Three js Subdivision Cube html http stemkoski github com Three js Subdivisio
  • 如何将 SketchUp 模型导出到 Three.js?

    我通过谷歌创建了一个模型SketchUp 我想将其导出到three js节省一些时间 因为我想使用SketchUp比three js 那么有人可以告诉我该怎么做吗 非常感谢 您可以从 SketcUp 导出 collada DAE 然后使用
  • Three.js - 在自定义几何体上平滑兰伯特材质着色的问题

    我在 Three js 中创建了一个自定义几何体 现在 我想创建一个使用平滑阴影兰伯特材质的网格 使用循环 我创建了顶点数组 然后创建了面 然后我调用了 geometry computeCentroids geometry computeF
  • Three.js 支持波斯语/阿拉伯语文本

    我需要以波斯语 阿拉伯语显示一些文本 我加载了包含字符的字体 并使用 TextGeometry 在场景上创建文本 var loader new THREE FontLoader loader load B Zar Regular js fu
  • 使用三个 JS 和 React JS 加载 GLTF 模型

    我使用 React JS 加载从 sketchfab 下载的 GLTF 文件时遇到问题 当我尝试在不使用React 使用常规index html和index js 的情况下执行此操作时 它可以工作 但是当我将代码带入React应用程序时 它
  • THREE.js 导入的模型不应用面部纹理

    我正在尝试导入使用 THREEJS 导出器从搅拌机导出的模型 到目前为止 模型已加载并出现在我的场景中 并且正确应用了材质 汽车应为黄色 玻璃应为透明 但它并没有将我的纹理应用到以 tga 形式保存的汽车上 如果我不将纹理包含在模型所在的服
  • 可点击的精灵标签?

    我一直在玩精灵文本标签 更具体地说是这个例子 http stemkoski github io Three js Sprite Text Labels html http stemkoski github io Three js Sprit
  • Three.js:基于图像的光照(IBL)

    I m searching to add an IBL to my scene and objects But I can t find anything on the web There are some examples with an
  • Three.js - 将 WebGL 和 CSS3D 与 iFrame 混合

    我准备了一个混合的工作页面WebGL and CSS3D 在SO的一点帮助下here https stackoverflow com questions 24681170 three js properly blending css3d a
  • Three.js 椭圆

    如何在 Three js 中创建一个椭圆 我看过这个 在 THREE js 中绘制椭圆 https stackoverflow com questions 11419896 drawing an ellipse in three js 但如
  • CSS3DObject 始终位于 WebGL Mesh 前面

    我正在混合CSS3D Renderer with WebGL Renderer to add HTML3D 空间中的元素WebGL场景 这CSS3DObject在前面WebGL网格即使WebGL Renderer具有较高的 z index
  • 如何在react-三纤维中提取并播放动画

    嗯 我有 gltf 动画模型 我成功加载模型 但无法播放嵌入的动画 我想知道是否可以以任何方式解决它 顺便说一句 我正在反应中工作 先感谢您 在这里您可以找到型号https drive google com file d 1ZVyklaQu
  • ThreeJS 中阴影的奇怪行为

    所以我有一个 ThreeJS 场景 并且添加了一些球体 多材质 我还添加了定向光 this light new THREE DirectionalLight 0xFFFFFF 1 this light position set 2 10 2
  • 如何使用键盘和鼠标控制相机 - Three.js

    我在 WEB GL 中有一个带有 Three js 的 3D 环境 并且我曾经使用 Orbitcontrols js http codepen io nireno pen cAoGI http codepen io nireno pen c
  • 如何在 React Native 中渲染自定义 3D 对象

    我已经成功使用 Three js expo Three 和 expo gl 在 React Native 中配置了红色立方体的 3D 渲染 但我想让用户渲染他们自己可能拥有的自定义 3D 对象 obj 或 mtl 扩展名 但我不确定如何让他
  • 如何使用三个JS导出然后导入场景?

    我有一个用三个 JS 和大量 Javascript 代码构建的复杂 3D 场景 我需要将此场景导出为一个文件 然后通过简单的 ThreeJS 场景播放器在我的网站上使用它 我尝试过 ObjectExporter 和 SceneExporte
  • 如何在 Three.js 中进入全屏?

    我已经尝试了数十种不同的方法几个小时 但没有一个有效 如下所示 document body addEventListener keydown function THREEx FullScreen request false 如何让Three
  • 从matrix4()获取翻译

    对于大多数 Three js 开发人员来说 这可能看起来像是一个虚拟问题 但是如何从转换矩阵中提取翻译呢 实际上 我手动提取它指向 矩阵数组位置 12 13 14 提前致谢 如果要从矩阵中提取平移分量 请使用以下模式 var vec new

随机推荐

  • 最佳实践 android:onClick XML 属性或 setOnClickListener? [复制]

    这个问题在这里已经有答案了 我正在关注 Google 的 Android 教程 发现有两种方法可以根据标题获取小部件回调 或仅 onClick 我不知道 我是一名高级 Java Swing 开发人员 所以内部类方法让我有宾至如归的感觉 但我
  • SwaggerUI 不显示模型架构

    我有一个带有 Swagger 和 Swashbuckle 的 C Web API 项目 我有一个模型 public class TimeZoneName public string zoneName get 我有一个带有方法的控制器 pub
  • 是否可以使用 selenium 更改 Firefox 中的浏览器语言?

    我想在 selenium 自动化中以给定语言启动 Firefox 浏览器 我可以这样做吗 如果是这样 请分享一些示例代码实现 提前致谢 在启动驱动程序之前 在 Fire Fox 配置文件首选项中设置语言代码 如下所示 FirefoxProf
  • 内容脚本匹配顶级域,如所有谷歌。*

    我希望我的内容脚本能够匹配所有谷歌域和特定页面 我知道这是不可能的 清单 json content scripts matches www google www youtube com readthedocs org 还有其他方法可以做到这
  • 页码 python-docx

    我正在尝试用 python 创建一个程序 它可以在 docx 文件中查找特定单词并返回它出现的页码 到目前为止 在浏览 python docx 文档时 我无法找到如何访问页码 甚至无法找到页码所在的页脚 有没有办法使用 python doc
  • 按照 swagger 规范,如何将嵌套对象的 json 定义为 yaml?

    我在 swagger yaml 中定义对象数组时遇到问题 每次我尝试定义 yaml 的 type array 部分时 Swagger 编辑器都会给出错误 我定义了它 但它不正确 因为它给出了错误 以下是我尝试在 swagger yaml 中
  • 2栏灵活布局

    我有 2 列结构 使用的CSS如下 div left position relative float left width 18 margin 1 div right position relative float right width
  • 将字节数组或文件存储转换为位图图像

    当我选择文件到存储文件后 如何将该文件转换为图像以便像个人资料图片一样显示 我将文件转换为字节数组 但不知道下一步该怎么做 或者还有其他方法吗 这是我的代码 var openPicker new Windows Storage Picker
  • 为 Android 构建 gdb 和 gdbserver

    我正在 64 位 Linux 上工作 需要构建数据库服务器对于我的 aarch64 Android 手机 有预建的数据库服务器在NDK中 但它使用NDK包中的python 而不是使用我的系统python 我无法安装其他python插件 如何
  • 数组上奇怪的迭代器语法背后的原因[重复]

    这个问题在这里已经有答案了 我最近了解到 要从数组中获取迭代器 您必须使用我以前从未见过的语法来访问它 let iterator myArray Symbol iterator 在我看来 实施Array prototype getItera
  • 我可以使用什么来代替 :inminated jQuery 选择器来避免 IE 8 中的异常?

    我有这样的代码 if chkCheckAll is indeterminate true 但它在 ie 8 中抛出异常 在 Jquery 中可以做什么来代替这个来与 ie8 一起使用 使用这个代替 var allChk chkCheckAl
  • 如何将变量从包含的模板传递到包含它的模板?

    在 Django 视图中 if request is ajax t get template bar templates html html t render Context edit True user some user return
  • ASP.NET MVC JsonResult 和 AuthorizeAttribute

    最直接的使用方法是什么AuthorizeAttribute and JsonResult在一起 以便当用户未经授权时应用程序返回 Json 错误而不是登录页面 我目前正在考虑的两件事正在扩展AuthorizeAttribute或者只是创建一
  • 保存 crontab 文件

    一个关于 Crontab 的简单问题 我保存 crontab 文件的位置重要吗 使用 crontab e 创建依赖于时间的作业 或者可以从任何目录读取它们 我问是因为我的 crontab 文件似乎被删除了 因为当我使用 crontab l
  • TYPO3 无法启用 htmlArea RTE

    我尝试在 TYPO3 6 2 LTS 版本 中安装模块 htmlArea RTE 在 扩展管理器 中 他是活动的 但是在 页面 中 当我编辑或创建新的文本记录时 所见即所得不会出现 我使用的是 Firefox 但我尝试了其他浏览器 但他也没
  • Maven 构建错误 - 无法解决以下工件

    我想通过maven构建一个spring mvc项目 出现以下错误 The following artifacts could not be resolved org aopalliance com springsource org aopa
  • 如何自定义 Amazon S3 中 Rails 5.2 ActiveStorage 附件的路径?

    添加附件时 例如 has one attached resume attachment 保存的文件最终位于 S3 存储桶的顶层 如何将它们添加到子目录中 例如 我的旧回形针配置可以按型号名称在目录中分类 你不能 到时候 只有一种选择 has
  • 使用字典值列表的堆栈图 (Python 3.x)

    我正在尝试从字典中制作堆栈图 其中值是 0 到 1 之间的浮点数列表 列表中值的索引是测量时间 t1 t2 tn 所有键都具有相同数量的值 例如 a 1 0 3 0 5 0 7 2 0 4 0 6 0 8 5 0 1 0 15 0 20 这
  • Entity Framework Core jsonb 列类型

    我将 Entity Framework Core 与 npgsql postgresql 一起用于 Entity Framework Core 我的问题是 使用迁移 如何标记类属性以生成 JSONB 列类型 例如 public class
  • Three.js 未捕获的安全错误:无法在“WebGLRenderingContext”上执行“texImage2D”:

    这个问题源于之前html5视频在android手机上无法播放的问题 Three js WebGLRenderered 视频无法在 Android 手机上播放 https stackoverflow com questions 2610948