2014-09-29 7 views
0

아래 비디오 텍스처 예제는 안드로이드 LG nexus phone에서 작동하지 않습니다. 다른 모든 비 비디오 예제는 three.js의 youtube 예제를 포함하여 작동합니다.Three.js WebGLRenderered 비디오가 안드로이드 폰에서 재생되지 않습니다.

누구든지이 문제가 있습니까? 나는 VR (예 : Google 골판지) 키트와 함께 사용할 수 있도록 스테레오 효과를 궁극적으로 사용할 수 있도록 THREE.WebGLRenderer를 사용하여 비디오를 렌더링하려고합니다. 지금까지 CSS3DRenderer/Canvas 렌더링 된 비디오 만 전화기에서 작동하는 것 같습니다. 비디오 렌더링 얻을 수있는 경우

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

은 알려 주시기 바랍니다 (예 : 효과 = 새로운 THREE.StereoEffect (렌더러)) 스테레오 효과가이 렌더러 작동하지 않기 때문에 그러나 나는이 렌더러를 사용할 수 없습니다 스테레오 효과. --------------- 코드가 손 (http://stemkoski.github.io/Three.js/Video.html에서 적응)

UPDATE 사용자 작업에서 시작하지 않는 한 동영상이 재생되지 않는 모바일 기기에

  <!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> 
+0

그래서 비디오를 재생할 수있었습니다 (일종의). 오디오는 들리지만 비디오는 보지 못합니다. 이 블로그 게시물에 제안 된대로 유형 특성을 제거하여 수행되었습니다. http://www.broken-links.com/2010/07/08/making-html5-video-work-on-android-phones/ 그러나 비디오의 오디오 부분이 재생되면 dev 콘솔에 이러한 오류가 표시됩니다. ** 잡히지 않은 SecurityError : 'WebGLRenderingContext'에서 'texImage2D'를 실행하지 못했습니다. 오염 된 캔버스가로드되지 않을 수 있습니다. three.min.js : 507 ** – sandav

답변

1

. 따라서 mousedown 이벤트 리스너에서 init 메서드를 실행하면 제대로 작동합니다.

+0

위 코드를 보았습니다. 보시다시피 click/touch 이벤트에서 video.play()를 명시 적으로 실행합니다. 나는 아직도 비디오가 재생 볼 수 없습니다. – sandav

+0

도움이된다면 로그 콘솔에 표시됩니다. 그들은 오류로보고되지 않습니다. THREE.WebGLRenderer 68dev THREE.WebGLRenderer : 이방성 텍스처 필터링이 지원되지 않습니다. three.min.js : 435 THREE.WebGLRenderer : S3TC 압축 텍스처가 지원되지 않습니다. – sandav

+0

비디오의 오디오 부분을 재생할 수있었습니다. 그러나 나는 dev 콘솔에서 이것을 볼 수있다 : ** 잡히지 않은 SecurityError : 'WebGLRenderingContext'에서 'texImage2D'실행 실패 : 오염 된 캔버스가로드되지 않을 수있다. three.min.js : 507 ** – sandav