2017-10-16 27 views
1

私はビデオストリームをアニメーション化するためにrequestAnimationFrameを使用しています。リクエストアニメーションはバックグラウンドでは機能しないので、バックグラウンドで実行させる方法はあります。バックグラウンドでrequestAnimationFrameを実行します。

setIntervalまたはsetTimeoutを使用してアニメーションすることもできますが、これらを使用すると、アニメーションが正常に動作せず、ビデオストリームの画像が点滅していました。私はあなたが運の外にあると思います

const drawFrame = function drawFrame() { 
      if (!ctx) { 
       ctx = canvas.getContext('2d'); 
      } 
      if (!tmpCanvas) { 
       tmpCanvas = document.createElement('canvas'); 
       tmpCtx = tmpCanvas.getContext('2d'); 
       tmpCanvas.width = canvas.width; 
       tmpCanvas.height = canvas.height; 
      } 
      tmpCtx.drawImage(videoElement, 0, 0, tmpCanvas.width, tmpCanvas.height); 
      const imgData = tmpCtx.getImageData(0, 0, tmpCanvas.width, tmpCanvas.height); 
      const data = selectedFilter(imgData); 
      ctx.putImageData(data, 0, 0); 
      if (!stopped) { 
       requestAnimationFrame(drawFrame); 
      } else { 
       tmpCanvas = null; 
       tmpCtx = null; 
       ctx = null; 
      } 
     }; 
     requestAnimationFrame(drawFrame); 

答えて

1

は、ここに私のコードです。 requestAnimationFrameは意図的にバックグラウンドで一時停止します。なぜなら、アニメーションはバックグラウンドで実行される理由がないからです。setIntervalとsetTimeoutはアニメーション用に設計されたものではありません。

あなたは、ビデオストリームをアニメーション化する必要があると言います。動画タグの上にアニメーションを適用する、またはキャンバス要素を介して動画要素の外観を変更することを意味しますか?どちらの場合も、バックグラウンドでバックグラウンドで続けてはいけませんが、computeFrame(Firefoxのみ)は動画のフレームごとに1回実行されます。または、一連の静止画像を連続してアニメーション化することで、実際にビデオストリームを偽造しているのでしょうか?その場合、なぜあなたはビデオ要素を使用していませんか?

+0

実際には、実行時に変更ストリームをサポートしていないTokbox js APIを使用しており、ビデオにエフェクト(静止画像)を追加する必要があります。このためにrequestAnimationFrameを使用するカメラフィルタAPIを使用していますが、それはバックグラウンドで実行されないので、これから克服する方法はありますか? –

+0

requestAnimationFrameは、フォアグラウンドタブでRTS優先度でアニメーションごとに1回実行されるように特別に設計されていますが、バックグラウンドタブでは実行されません。バックグラウンドで実行すると、パフォーマンス上の問題が発生します。ブラウザのすべてを優先順位付けできるわけではありません。私はあなたがrequestAnimationFrameをシミュレートすることができる他のクロスブラウザの方法がないことを知っています。 –

+0

setTimeout/setIntervalはこのためのものではありません。タイムアウトを30ミリ秒に設定した場合、最低でも30ミリ秒が経過するまで、タイムアウトは発生しません。 30 msが経過すると、現在実行中のコンテキストが実行を終了するのを待ちます(Javascriptはほとんどがシングルスレッド言語です)。これに加えて、ブラウザはシステムリソースを節約するためにこれをさらに絞り込もうとするかもしれません。また、多数のJavaScriptが複数のタブで実行されている場合、オペレーティングシステムはブラウザ自体を絞って、特定の数のコアにアクセスできるようにすることができます。 –