私はビデオストリームをアニメーション化するために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);
実際には、実行時に変更ストリームをサポートしていないTokbox js APIを使用しており、ビデオにエフェクト(静止画像)を追加する必要があります。このためにrequestAnimationFrameを使用するカメラフィルタAPIを使用していますが、それはバックグラウンドで実行されないので、これから克服する方法はありますか? –
requestAnimationFrameは、フォアグラウンドタブでRTS優先度でアニメーションごとに1回実行されるように特別に設計されていますが、バックグラウンドタブでは実行されません。バックグラウンドで実行すると、パフォーマンス上の問題が発生します。ブラウザのすべてを優先順位付けできるわけではありません。私はあなたがrequestAnimationFrameをシミュレートすることができる他のクロスブラウザの方法がないことを知っています。 –
setTimeout/setIntervalはこのためのものではありません。タイムアウトを30ミリ秒に設定した場合、最低でも30ミリ秒が経過するまで、タイムアウトは発生しません。 30 msが経過すると、現在実行中のコンテキストが実行を終了するのを待ちます(Javascriptはほとんどがシングルスレッド言語です)。これに加えて、ブラウザはシステムリソースを節約するためにこれをさらに絞り込もうとするかもしれません。また、多数のJavaScriptが複数のタブで実行されている場合、オペレーティングシステムはブラウザ自体を絞って、特定の数のコアにアクセスできるようにすることができます。 –