Видео Three.js WebGLRendered не воспроизводятся на телефонах Android

Приведенный ниже пример видеотекстуры, похоже, не работает на телефоне LG nexus Android, хотя все другие примеры, не относящиеся к видео, работают, включая пример YouTube на three.js.

У кого-нибудь еще есть эта проблема? Я пытаюсь визуализировать видео с помощью THREE.WebGLRenderer, чтобы в конечном итоге я мог использовать стереоэффект с ним, чтобы использовать его с комплектом VR (например, Google Card). На данный момент на телефоне работает только видео с рендерингом CSS3DRenderer/Canvas. Но я не могу использовать эти рендереры, потому что стереоэффект не работает с этими рендерерами (т.е. эффект = 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>

person sandav    schedule 29.09.2014    source источник
comment
Так что я смог заставить видео воспроизводиться (вроде). Я слышу звук, но не вижу видео. Это было сделано путем удаления атрибута type, как было предложено в этом сообщении в блоге: broken-links.com/2010/07/08/ Однако я вижу эти ошибки, возникающие на консоли разработчика, когда воспроизводится звуковая часть видео. Uncaught SecurityError: Не удалось выполнить 'texImage2D' в 'WebGLRenderingContext': поврежденные холсты не могут быть загружены. три.мин.js:507   -  person sandav    schedule 30.09.2014


Ответы (1)


На мобильных устройствах видео не воспроизводится, если оно не инициировано действием пользователя. Поэтому, если вы выполняете метод init из прослушивателя событий mousedown, он должен работать.

person mrdoob    schedule 30.09.2014
comment
Я показал свой код выше. Как видите, я явно запускаю video.play() в событии click/touch. Я все еще не вижу воспроизводимого видео. - person sandav; 30.09.2014
comment
если это поможет, это то, что я вижу в консоли журнала. Однако они не считаются ошибками. THREE.WebGLRenderer 68dev THREE.WebGLRenderer: анизотропная фильтрация текстур не поддерживается. three.min.js:435 THREE.WebGLRenderer: сжатые текстуры S3TC не поддерживаются. - person sandav; 30.09.2014
comment
Мне удалось воспроизвести звуковую часть видео. Однако я вижу это в консоли разработчика: Uncaught SecurityError: Не удалось выполнить «texImage2D» в «WebGLRenderingContext»: поврежденные холсты не могут быть загружены. три.мин.js:507 - person sandav; 30.09.2014
comment
Я собираюсь закрыть этот вопрос и открыть новый. Поскольку ответ mrdoob ответил на заголовок этого вопроса, в этом отношении его достаточно. Однако при воспроизведении видео возникает следующая проблема, и я собираюсь открыть отдельный элемент, чтобы отслеживать ее. - person sandav; 30.09.2014
comment
Опубликовано stackoverflow.com/questions/26127462/ - person sandav; 30.09.2014
comment
Таким образом, это, по-видимому, более серьезная проблема. См. stackoverflow.com/a/38830167/128511. - person gman; 08.08.2016