HTML5 视频冻结和卡顿
HTML5 video freezing and stuttering
我有一个奇怪的问题。我正在使用以下 HTML5/canvas 简单代码重新访问大约 2 个月前的一个项目,该项目运行非常顺利:
<video id="video2" playsinline controls autoplay style="display: none;"">
<source src="exercise_media/video_dance_example.mp4" type="video/mp4" >
</video>
但是现在,视频每隔几秒就卡住,然后几秒后就会快进,赶上当前时间。不过音频效果很好。
知道这里会发生什么吗?我在我的 IE 浏览器和 Google Chrome 上都进行了测试,同样的问题。
这里有一个简短的视频剪辑来展示我对视频卡顿的意思:https://imgur.com/a/Viv2Gix
我做的额外 JavaScript 工作,即骨骼跟踪,运行良好,即使在视频帧冻结时也能继续工作,所以不是那部分出现故障。这只是 HTML5 视频本身。
当我尝试使用您的代码时,由于您应用的“显示:none”,我没有看到任何视频。如果我删除它 - 然后我会看到视频。一般来说,如果您要自动播放视频,您还应该添加 'muted' 参数以确保所有用户都能自动播放。
关于您正在播放的视频 - 大小和比特率是多少(访问 https://ffprobe.a.video - 并输入视频的 url 以了解)
这是 Chrome 中的 a known regression。
鉴于错误报告被标记为“已开始”,我们希望它能尽快得到修复。
[edit] 事实上它很快就被修复了。他们甚至修复了当前稳定的 88,所以你应该不会再遇到这个问题了。
目前,您可以做的是不隐藏该视频元素,而是覆盖它,例如将background-color设置为您的[=39] =] 并将视频的 z-index
设置为 -1
。
const ctx = canvas.getContext("2d");
btn.onclick = (evt) => {
btn.remove();
vid.play().then(() => {
canvas.width = vid.videoWidth;
canvas.height = vid.videoHeight;
draw();
});
};
function draw() {
ctx.drawImage(vid, 0, 0);
setTimeout(draw, 50);
}
html,body {
background: white;
}
:checked ~ #vid {
z-index: -1;
position: absolute;
}
canvas,video { width: 300px }
<button id="btn">begin</button>
<span>hide video:</span><input type=checkbox><br>
<canvas id="canvas"></canvas>
<video id="vid" muted src="https://s3.amazonaws.com/leccap-itech-opsrw/apps/demo/1381411844-011-O-c1-86-87-599-13.mp4"></video>
Ps:我想到的另一个解决方法是从 <video>
元素 (const stream = vid.captureStream()
) 捕获 MediaStream,但是,虽然它确实改善了一点问题,但它没有像覆盖元素那样修复它(帧率似乎仍然较低),并且在性能方面肯定至少会花费同样多的钱。
我有一个奇怪的问题。我正在使用以下 HTML5/canvas 简单代码重新访问大约 2 个月前的一个项目,该项目运行非常顺利:
<video id="video2" playsinline controls autoplay style="display: none;"">
<source src="exercise_media/video_dance_example.mp4" type="video/mp4" >
</video>
但是现在,视频每隔几秒就卡住,然后几秒后就会快进,赶上当前时间。不过音频效果很好。
知道这里会发生什么吗?我在我的 IE 浏览器和 Google Chrome 上都进行了测试,同样的问题。
这里有一个简短的视频剪辑来展示我对视频卡顿的意思:https://imgur.com/a/Viv2Gix
我做的额外 JavaScript 工作,即骨骼跟踪,运行良好,即使在视频帧冻结时也能继续工作,所以不是那部分出现故障。这只是 HTML5 视频本身。
当我尝试使用您的代码时,由于您应用的“显示:none”,我没有看到任何视频。如果我删除它 - 然后我会看到视频。一般来说,如果您要自动播放视频,您还应该添加 'muted' 参数以确保所有用户都能自动播放。
关于您正在播放的视频 - 大小和比特率是多少(访问 https://ffprobe.a.video - 并输入视频的 url 以了解)
这是 Chrome 中的 a known regression。
鉴于错误报告被标记为“已开始”,我们希望它能尽快得到修复。
[edit] 事实上它很快就被修复了。他们甚至修复了当前稳定的 88,所以你应该不会再遇到这个问题了。
目前,您可以做的是不隐藏该视频元素,而是覆盖它,例如将background-color设置为您的[=39] =] 并将视频的 z-index
设置为 -1
。
const ctx = canvas.getContext("2d");
btn.onclick = (evt) => {
btn.remove();
vid.play().then(() => {
canvas.width = vid.videoWidth;
canvas.height = vid.videoHeight;
draw();
});
};
function draw() {
ctx.drawImage(vid, 0, 0);
setTimeout(draw, 50);
}
html,body {
background: white;
}
:checked ~ #vid {
z-index: -1;
position: absolute;
}
canvas,video { width: 300px }
<button id="btn">begin</button>
<span>hide video:</span><input type=checkbox><br>
<canvas id="canvas"></canvas>
<video id="vid" muted src="https://s3.amazonaws.com/leccap-itech-opsrw/apps/demo/1381411844-011-O-c1-86-87-599-13.mp4"></video>
Ps:我想到的另一个解决方法是从 <video>
元素 (const stream = vid.captureStream()
) 捕获 MediaStream,但是,虽然它确实改善了一点问题,但它没有像覆盖元素那样修复它(帧率似乎仍然较低),并且在性能方面肯定至少会花费同样多的钱。