将HTML5画布(视频)元素分割成若干块
Slitting HTML5 canvas (video) element into pieces
我是画布新手,我已经在谷歌上搜索了几个小时,但我被卡住了。
我想做的是在画布元素上渲染视频,将其分割并设置片段的动画。我已经到了一半(参见:http://jsbin.com/riduxadazi/edit?html,css,js,控制台,输出),但我有几个问题:
- 我做的事情是对的,还是效率极低
- 我想使用视频全屏。无论我尝试什么,画布网格+视频的大小似乎都不匹配
- 我想把视频片段制作成动画,但我不知道该如何处理。我可以得到某种数组并一个接一个地设置片段的动画吗
我的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();
}
您可能会考虑:
- 使用
requestAnimationFrame
更新循环。这允许与监视器更新速率完美同步,并且比setTimeout/setInterval更高效。您可以通过使用一个交替的简单布尔标志来调节它,使其仅每1/30帧更新一次,以匹配视频速率 - 视频元素不需要插入到DOM中。此外,实际的视频位图大小是通过属性
videoWidth
和videoHeight
读取的,不过,在提供的代码中,您应该使用画布的属性width
和height
,因为这决定了目标大小。要按比例绘制,您可以使用这个答案 - 如果你想分割内容,使用
drawImage()
和剪辑参数将是在画布上绘制视频的更有效的方法 - 您可以使用数学方法分割视频(请参阅此答案),也可以使用允许您定义源区域并具有单独属性(如位置、旋转、缩放等)的对象。以防您不得不考虑目的地位置以适应画布的当前大小
相关文章:
- CKEditor Widget-阻止编辑可编辑元素本身
- 如何设置html元素填充的动画
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 使用clickToggle并在单击另一个元素时关闭元素
- 单击时将焦点更改为元素
- 表追加而不附加最后一个元素
- 如何在jQuery中获取元素的形式
- 将HTML5画布(视频)元素分割成若干块
- 在Iframe中选择元素分割
- 如何在两个元素之间分割剩余高度
- 固定位置分割防止焦点在元素之间移动时滚动
- javascript由空白3个元素分割
- 单击时分割元素仅为第一个元素激发
- 当字符串中只有一个元素时,如何在jQuery中将字符串分割成数组
- 通过简单的脚本从元素中分割特定的文本
- 按十进制分割数字并返回2个单独的元素
- 如何使用jQuery获得由分隔符分割的多个元素的文本
- flexbox中可拖动的分割窗格窗口不能越过子元素
- 如何分割动态列表取决于Jquery的许多元素