【问题标题】:Three.js WebGLRenderered videos don't play on android phonesThree.js WebGLRenderered 视频无法在安卓手机上播放
【发布时间】:2014-11-24 09:53:12
【问题描述】:

下面的视频纹理示例似乎不适用于 android LG nexus 手机,尽管所有其他非视频示例都可以使用,包括 three.js 上的 youtube 示例。

还有其他人有这个问题吗?我正在尝试使用 THREE.WebGLRenderer 渲染视频,以便我最终可以使用立体效果来将其与 VR(如谷歌纸板)套件一起使用。到目前为止,似乎只有 CSS3DRenderer/Canvas 渲染的视频可以在手机上运行。但我不能使用这些渲染器,因为立体效果不适用于这些渲染器(即 effect = new THREE.StereoEffect(renderer);)

http://mrdoob.github.io/three.js/examples/webgl_materials_video.html

如果有立体效果的视频渲染,请告诉我。

更新---------------手头代码(改编自http://stemkoski.github.io/Three.js/Video.html

            <!doctype html>
            <html lang="en">
            <head>
                <title>Video Texture (Three.js)</title>
                <meta charset="utf-8">
                <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
                <!-- <link rel=stylesheet href="css/base.css"/> -->
            </head>
            <body>

            <script src="js/three.min.js"></script>
            <script src="js/controls/OrbitControls.js"></script>
            <script src="js/effects/StereoEffect.js"></script>

            <div id="ThreeJS"></div>
            <script>
            var container, scene, camera, renderer, controls, stats, effect, element;
            var video, videoImage, videoImageContext, videoTexture;

            init();
            animate();

            // FUNCTIONS        
            function init() 
            {
                // SCENE
                scene = new THREE.Scene();
                // CAMERA
                var SCREEN_WIDTH = window.innerWidth, SCREEN_HEIGHT = window.innerHeight;
                var VIEW_ANGLE = 45, ASPECT = SCREEN_WIDTH / SCREEN_HEIGHT, NEAR = 0.1, FAR = 20000;
                camera = new THREE.PerspectiveCamera( VIEW_ANGLE, ASPECT, NEAR, FAR);
                scene.add(camera);
                camera.position.set(0,150,400);
                camera.lookAt(scene.position);  
                renderer = new THREE.WebGLRenderer( {antialias:true} );

                //effect = new THREE.StereoEffect(renderer);
                renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
                element= renderer.domElement;
                //effect.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
                container = document.getElementById( 'ThreeJS' );
                container.appendChild( element );
                // CONTROLS
                controls = new THREE.OrbitControls( camera, element );
                element.addEventListener('click', fullscreen, false);


                // LIGHT
                var light = new THREE.PointLight(0xffffff);
                light.position.set(0,250,0);
                scene.add(light);


                ///////////
                // VIDEO //
                ///////////

                // create the video element
                video = document.createElement( 'video' );
                //video.id = 'video';
                video.type = ' video/mp4; codecs="theora, vorbis" ';
                video.src = "video/sintel.ogv";
                video.load(); // must call after setting/changing source
                video.play();

                videoImage = document.createElement( 'canvas' );
                videoImage.width = 320;
                videoImage.height = 240;

                videoImageContext = videoImage.getContext( '2d' );
                // background color if no video present
                videoImageContext.fillStyle = '#000000';
                videoImageContext.fillRect( 0, 0, videoImage.width, videoImage.height );

                videoTexture = new THREE.Texture( videoImage );
                videoTexture.minFilter = THREE.LinearFilter;
                videoTexture.magFilter = THREE.LinearFilter;

                var movieMaterial = new THREE.MeshBasicMaterial( { map: videoTexture, overdraw: true, side:THREE.DoubleSide } );
                // the geometry on which the movie will be displayed;
                //      movie image will be scaled to fit these dimensions.
                var movieGeometry = new THREE.PlaneGeometry( 240, 100, 4, 4 );
                var movieScreen = new THREE.Mesh( movieGeometry, movieMaterial );
                movieScreen.position.set(0,50,00);
                scene.add(movieScreen);

                camera.position.set(0,150,300);
                camera.lookAt(movieScreen.position);

                window.addEventListener('resize', resize, false);
                  setTimeout(resize, 1);


            }

                function update() {
                  resize();

                  camera.updateProjectionMatrix();

                  controls.update();
                }

            function animate() 
            {
                requestAnimationFrame( animate );
                render();       
                //update();
            }

            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 resize() {
                  var width = container.offsetWidth;
                  var height = container.offsetHeight;

                  //console.log(container, width,height);

                  camera.aspect = width / height;
                  camera.updateProjectionMatrix();

                  renderer.setSize(width, height);
                  //effect.setSize(width, height);
                }


            function render() 
            {   
                if ( video.readyState === video.HAVE_ENOUGH_DATA ) 
                {
                    videoImageContext.drawImage( video, 0, 0 );
                    if ( videoTexture ) 
                        videoTexture.needsUpdate = true;
                }

                renderer.render( scene, camera );
            }

            </script>

            </body>
            </html>

【问题讨论】:

  • 所以我能够播放视频(有点)。我听到了音频,但没有看到视频。这是通过删除此博客文章中建议的类型属性来完成的:broken-links.com/2010/07/08/… 但是,当视频的音频部分播放时,我在开发控制台上看到了这些错误。 未捕获的安全错误:无法在“WebGLRenderingContext”上执行“texImage2D”:可能无法加载受污染的画布。三分钟.js:507

标签: three.js html5-video nexus-4


【解决方案1】:

除非从用户操作开始,否则视频不会在移动设备上播放。因此,如果您从 mousedown 事件侦听器执行 init 方法,它应该可以工作。

【讨论】:

  • 我已经在上面展示了我的代码。如您所见,我在点击/触摸事件中显式执行 video.play()。我仍然看不到播放的视频。
  • 如果有帮助,这就是我在日志控制台中看到的。但是,它们不会被报告为错误。 THREE.WebGLRenderer 68dev THREE.WebGLRenderer:不支持各向异性纹理过滤。 three.min.js:435 THREE.WebGLRenderer:不支持 S3TC 压缩纹理。
  • 我能够播放视频的音频部分。但是我在开发控制台中看到了这些:Uncaught SecurityError: Failed to execute 'texImage2D' on 'WebGLRenderingContext': 可能无法加载受污染的画布。三分钟.js:507
  • 我将关闭这个问题并打开一个新问题。由于 mrdoob 的回答回答了这个问题的标题,因此在这方面就足够了。但是,当视频播放时会出现一个后续问题,我将打开一个单独的项目来跟踪它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
相关资源
最近更新 更多