使用视频循环绘制画布
Draw Canvas with video loop
我循环浏览HTML视频的一部分,同时用视频的当前帧绘制画布。当视频重新开始时,画布上总是有一个灰色框架。如果循环区域很长,这不是什么大问题,但根据我的需要,这些区域可能是0.5秒,如果你一次又一次地循环,画布就会开始闪烁。
在绘制画布时,我还尝试了不同的视频属性(end、loop、networkState、readyState)-对没有帮助
我提供了一个小提琴来向你展示我的问题。(只需按播放视频)https://jsfiddle.net/Lz17fnf3/2/
$('#v').on('timeupdate', function () {
if ($('#v')[0].currentTime > 2) {//Loop for one second
$('#v')[0].currentTime = 1;
}
var $this = $('#v')[0]; //cache
(function loop() {
if (!$this.paused && !$this.ended) {
drawCanvas();
setTimeout(loop, 1000 / 25); // drawing at 25fps
}
})();
});
function drawCanvas() {
var elem = document.getElementById('c');
var c = elem.getContext('2d');
var v = $('#v')[0];
$('#c').attr('width', v.videoWidth);
$('#c').attr('height', v.videoHeight);
if (v.readyState == 4) {
c.drawImage(v, 0, 0, v.videoWidth, v.videoHeight, 0, 0, v.videoWidth, v.videoHeight);
}
}
它闪烁的原因是,当您将width
或height
分配给画布元素时,此操作会重置画布的整个上下文,很可能会导致空白帧。尝试将所有画布/上下文定义移动到drawCanvas
之外。
类似于:
var elem = document.getElementById('c');
var c = elem.getContext('2d');
var v = $('#v')[0];
// In order to set the canvas width & height, we need to wait for the video to load.
function init() {
if (v.readyState == 4) {
$('#c').attr('width', v.videoWidth);
$('#c').attr('height', v.videoHeight);
} else {
requestAnimationFrame(init);
}
}
init();
$('#v').on('timeupdate', function () {
if ($('#v')[0].currentTime > 2) { //Loop for one second
$('#v')[0].currentTime = 1;
}
var $this = $('#v')[0]; //cache
(function loop() {
if (!$this.paused && !$this.ended) {
drawCanvas();
setTimeout(loop, 1000 / 25); // drawing at 25fps
}
})();
});
function drawCanvas() {
c.drawImage(v, 0, 0, v.videoWidth, v.videoHeight, 0, 0, v.videoWidth, v.videoHeight);
}
相关文章:
- Javascript:延迟在html5画布上循环绘制
- 使用javascript中的for循环在画布上绘制路径
- 从带有循环的数组中一个接一个地在画布上绘制形状
- 使用 for 循环在画布中绘制 img
- 使用香草 JS 和循环绘制表格
- 使用 for 循环绘制 HTML5 画布圆圈
- Javascript,如何加载,绘制和循环120帧
- 如何使用 svg 循环绘制贝塞尔曲线
- 使用 for 循环动态创建在画布内绘制的图像
- 在绘制图表之前在每个循环中编排嵌套的 AJAX 调用 (JQuery)
- 如何使用延迟的 for 循环绘制画布
- 画布用循环绘制线条
- HTML 5 画布:在游戏中使用绘制图像会使循环非常慢
- 使用for循环在谷歌地图上绘制饼图效果不佳
- 如何在JavaScript/JQuery中绘制循环图
- 使用js-op和svg绘制循环
- MySql和PHP循环使用x,y坐标绘制正方形
- 我如何得到定义在画布绘制循环之外的函数在循环内可用
- 在主动画循环中执行另一个绘制循环,持续5秒
- 我怎么能使一个值在JS加载从HTML表单保持定义为JS进入绘制循环