2014-02-21 58 views
0

我有一個使用getusermedia將視頻blob轉換爲gif的程序(Here)。爲了利用庫(GIFEncoder)讓我將畫布幀轉換爲GIF的幀,我首先使用ctx.drawImage將畫布blob 繪製到畫布上,然後我將這些幀繪製到GIF中。提高將視頻blob轉換爲gif的性能

有沒有更有效的方法來做到這一點?

代碼:

<!Doctype html> 
<html> 
<head> 
<style type="text/css"> 
    body { 

    } 
</style> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
<script type="text/javascript" src="LZWEncoder.js"></script> 
<script type="text/javascript" src="NeuQuant.js"></script> 
<script type="text/javascript" src="GIFEncoder.js"></script> 
<script type="text/javascript" src="b64.js"></script> 
</head> 
<body> 
     <title>RecorderGif</title> 
     <header> 
      <h1>RecordGif</h1> 
     </header> 
     <article> 
      <video id="video" width="320" height="200" style="display:none" autoplay=""></video> 
      <section> 
       <button id="btnStart">Start video</button> 
       <button id="btnStop">Stop video</button> 
       <button id="btnSave">Download</button>    
          </section> 
      <canvas id="canvas" width="320" height="240"></canvas> 
     </article> 
<script type="text/javascript">//<![CDATA[ 
var encoder = new GIFEncoder(); 
encoder.setRepeat(0); 
encoder.setDelay(100); 
encoder.start(); 
window.onload = function() { 

//Compatibility 


navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia; 
    var data = [] 
    var canvas = document.getElementById("canvas"), 
     context = canvas.getContext("2d"), 
     video = document.getElementById("video"), 
     btnStart = document.getElementById("btnStart"), 
     btnStop = document.getElementById("btnStop"), 
     btnSave = document.getElementById("btnSave") 
     videoObj = { 
      video: true, 
      }; 

    btnStart.addEventListener("click", function() { 
     var localMediaStream; 

     if (navigator.getUserMedia) { 
      navigator.getUserMedia(videoObj, function(stream) {    
       video.src = (navigator.webkitGetUserMedia) ? window.webkitURL.createObjectURL(stream) : stream; 
       localMediaStream = stream; 
       var addFrame = setInterval(function() { 
       data.push(canvas.toDataURL('image/png')) 
      },100); 

      }, function(error) { 
       console.error("Video capture error: ", error.code); 
      }); 

      btnStop.addEventListener("click", function() { 
       clearInterval(addFrame) 
       localMediaStream.stop(); 

      }); 
      btnSave.addEventListener("click", function() { 
       for (var i = 0; i < data.length; i++) { 
        var frame = new Image(); 
        frame.src=data[i] 
        context.drawImage(frame,0,0) 
        encoder.addFrame(context); 

       }; 
       encoder.finish(); 
       var binary_gif = encoder.stream().getData() //notice this is different from the as3gif package! 
       var data_url = 'data:image/gif;base64,'+encode64(binary_gif); 
       var gif = window.open('about:blank','','width=320,height=240') 
       gif.document.location.href=data_url 
      }); 

      setInterval(function() {context.drawImage(video, 0, 0, 320, 240)},100); 
     } 

    }); 
}; 
//]]> 
</script> 
</body> 
</html> 

回答

1

由於沒有對你非常依賴於JavaScript的解決方案瀏覽器GIF編碼沒有原生支持,如您使用的一個。

改進編碼的唯一方法是通過源代碼,看看你是否可以優化其中的一部分,如利用類型化數組(如果沒有),符合引擎細節,知道引擎編譯器可以很好地工作即使用模擬類型,完整構造函數,非變形對象等)。

另一個技巧是編碼GIF當視頻是播放(「手動」向前步進它用於使用currentPosition每個幀和用於它的情況下),並與一個離屏視頻元素。這可能會爲瀏覽器和引擎留出更多資源來更快地運行腳本(部分取決於系統及其對硬件解碼視頻的支持 - 仍然會在屏幕上更新視頻,這可能會或可能不會影響編碼過程)。

我的2.5美分..