Kala666

ThreeJSVideoTexture.js

Jan 25th, 2017
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. APP.VideoPlayer = function() {
  2.   var BorderWidth = 10;
  3.  
  4.   var self = this;
  5.  
  6.   self.onRender = function() {
  7.     // Update video frame
  8.     if (self.video.readyState === self.video.HAVE_ENOUGH_DATA) {
  9.       var w = self.canvas.width;
  10.       var h = self.canvas.height;
  11.  
  12.       // Draw the background color which will form the image border
  13.       self.canvasContext.fillStyle = 'rgb(220, 220, 220)';
  14.       self.canvasContext.fillRect(0, 0, w, h);
  15.  
  16.       // Draw the video frame as image
  17.       self.canvasContext.drawImage(self.video, BorderWidth, BorderWidth,
  18.         w - (BorderWidth * 2), h - (BorderWidth * 2));
  19.  
  20.       self.mainTexture.needsUpdate = true;
  21.     }
  22.   };
  23.  
  24.   self.update = function(data) {
  25.     self.data = data;
  26.  
  27.     if (data.videoPath) {
  28.       // Adjust canvas size to fit the video
  29.       self.canvas.width = data.videoWidth + (2 * BorderWidth);
  30.       self.canvas.height = data.videoHeight + (2 * BorderWidth);
  31.  
  32.       // Create the video element for decoding the video
  33.       self.video = document.createElement('video');
  34.       self.video.setAttribute('webkit-playsinline', '');
  35.       self.video.setAttribute('playsinline', '');
  36.       self.video.width = data.videoWidth;
  37.       self.video.height = data.videoHeight;
  38.       self.video.setAttribute('autoplay', '');
  39.       self.video.setAttribute('loop', '');
  40.       self.video.crossOrigin = 'anonymous';
  41.  
  42.       if (self.video.canPlayType("video/mp4").match(/maybe|probably/i)) {
  43.         console.log('Should be able to play mp4');
  44.       }
  45.  
  46.       self.video.oncanplay = function() {
  47.         console.log('Video ready to play - playing!');
  48.         self.video.play();
  49.       };
  50.  
  51.       self.video.onerror = function() {
  52.         var err = "unknown error";
  53.  
  54.         switch (self.video.error.code) {
  55.           case 1:
  56.             err = 'video loading aborted';
  57.             break;
  58.           case 2:
  59.             err = 'network loading error';
  60.             break;
  61.           case 3:
  62.             err = 'video decoding failed / corrupted data or unsupported codec';
  63.             break;
  64.           case 4:
  65.             err = 'video not supported';
  66.             break;
  67.         };
  68.  
  69.         console.log('Video error: ' + err);
  70.       };
  71.  
  72.       self.video.onloadeddata = function() {
  73.         console.log("Loaded the video's data!");
  74.         // console.log('Video duration: ', self.video.duration);
  75.  
  76.         self.canvas.width = self.data.videoWidth + (2 * BorderWidth);
  77.         self.canvas.height = self.data.videoHeight + (2 * BorderWidth);
  78.  
  79.         // Remove any existing render listener
  80.         if (self.onRenderListener) {
  81.           events.removeEventListener('render', self.onRenderListener);
  82.           delete self.onRenderListener;
  83.         }
  84.  
  85.         self.onRenderListener = self.onRender.bind(self);
  86.         events.addEventListener('render', self.onRenderListener);
  87.       };
  88.  
  89.       // Start loading the video
  90.       self.video.src = data.videoPath;
  91.   };
  92.  
  93.   self.init = function() {
  94.     // Create an offscreen canvas for rendering stuff
  95.     self.canvas = document.createElement('canvas');
  96.     self.canvasContext = self.canvas.getContext('2d');
  97.  
  98.     self.mainTexture = new THREE.Texture(self.canvas);
  99.     self.mainTexture.minFilter = THREE.LinearFilter; // Allows non-power-of-2 images
  100.     self.mainTexture.magFilter = THREE.LinearFilter; // Allows non-power-of-2 images
  101.  
  102.     // <snip> removed unrelated parts
  103.   };
  104.  
  105.   self.init();
  106. };
Advertisement
Add Comment
Please, Sign In to add comment