HTMLビデオをシークしたりループするとき、新しいフレームを表示するまでに少し間が空いたりします。それは、Canvasで再生するビデオが点滅してしまう原因のひとつです。 EaselJS 1.0.0から新たに備わったVideoBuffer
クラスは、ビデオの各フレームをオフスクリーンCanvasに描画することにより、前のフレームを保持してこの問題を解決します。
Bitmapクラスでビデオを表示する
まず、VideoBuffer
クラスは使わずに、EaselJSでビデオをCanvasのうえで再生しましょう。Bitmap()
コンストラクタにvideo要素(HTMLVideoElement
)を渡し、インスタンスはStage
オブジェクトに加えます。つぎのコードが、ビデオを再生するサンプルです(図001)。
var stage = new createjs.Stage(canvasElement);
var videoElement = document.createElement('video');
var bitmap = new createjs.Bitmap(videoElement);
stage.addChild(bitmap);
videoElement.src = 'assets/video.mp4';
videoElement.autoplay = true;
createjs.Ticker.timingMode = createjs.Ticker.RAF;
createjs.Ticker.addEventListener('tick', stage);
図001■Canvas上で再生されるビデオ
VideoBufferクラスで描画フレームをバッファする
VideoBuffer
クラスで毎フレームの描画を保つには、コンストラクタにvideo要素を渡します。そして、つくられたVideoBuffer
インスタンスを、Bitmap()
コンストラクタの引数にすればよいのです。
buffer = new createjs.VideoBuffer(videoElement);
bitmap = new createjs.Bitmap(buffer);
前掲のサンプルのコードは、VideoBuffer
クラスを使うとつぎのように書き替えられます。実際の作例は、「EaselJS 1.0.0: Using VideoBuffer class」としてjsdo.itに掲げました。
const stage = new createjs.Stage(canvasElement);
const videoElement = document.createElement('video');
const buffer = new createjs.VideoBuffer(videoElement);
const bitmap = new createjs.Bitmap(buffer);
stage.addChild(bitmap);
videoElement.src = 'assets/video.mp4';
videoElement.autoplay = true;
createjs.Ticker.timingMode = createjs.Ticker.RAF;
createjs.Ticker.addEventListener('tick', stage);