我是画布的新手,我已经谷歌搜索了几个小时,但我被卡住了。
我想要做的是在画布元素上渲染视频,将其分割并为片段制作动画。我在那里一半(见http://jsbin.com/riduxadazi/edit?html,css,js,console,output)但我有几个问题:
我的JS看起来像这样。我试着在最重要的部分添加评论。至少我认为是最重要的部分;)
var video = document.getElementById('video'); // Get the video
var ctx = canvas.getContext('2d'),
columns = 6,
rows = 4,
w, h, tileWidth, tileHeight;
// Start video and add it to canvas
video.addEventListener('play', function() {
var $this = this; //cache
(function loop() {
if (!$this.paused && !$this.ended) {
ctx.drawImage($this, 0, 0,window.innerWidth,window.innerHeight);
calcSize(); // Divide video
setTimeout(loop, 1000 / 30); // drawing at 30fps
}
})();
}, 0);
function calcSize() {
video.width = w = window.innerWidth;
video.height = h = window.innerHeight;
tileWidth = w / columns;
tileHeight = h / rows;
ctx.strokeStyle = '#000';
render();
}
function render() {
for(var x = 0; x < columns; x++) {
ctx.moveTo(x * tileWidth, 0);
ctx.lineTo(x * tileWidth, h);
}
for(var y = 0; y < rows; y++) {
ctx.moveTo(0, y * tileHeight);
ctx.lineTo(w, y * tileHeight);
}
ctx.stroke();
}
答案 0 :(得分:1)
您可能会考虑:
requestAnimationFrame
更新循环。这样可以实现与监视器更新速率的完美同步,并且比setTimeout / setInterval更有效。您可以限制它,这样您只需通过使用交替显示的简单布尔标志来更新每1/30帧以匹配视频速率。videoWidth
和videoHeight
读取的,但是,在提供的代码中,您应该使用画布'属性width
和height
来确定目的地大小。要绘制比例,您可以使用 this answer 。drawImage()
将是将效果绘制到画布上的更有效方法。