所以我有一个下载.mp4文件。我想使用MediaSource API将下载文件流式传输到视频元素中。我该怎么做?
const NUM_CHUNKS = 5;
var video = document.querySelector('video');
video.src = video.webkitMediaSourceURL;
video.addEventListener('webkitsourceopen', function(e) {
var chunkSize = Math.ceil(file.size / NUM_CHUNKS);
// Slice the video into NUM_CHUNKS and append each to the media element.
for (var i = 0; i < NUM_CHUNKS; ++i) {
var startByte = chunkSize * i;
// file is a video file.
var chunk = file.slice(startByte, startByte + chunkSize);
var reader = new FileReader();
reader.onload = (function(idx) {
return function(e) {
video.webkitSourceAppend(new Uint8Array(e.target.result));
logger.log('appending chunk:' + idx);
if (idx == NUM_CHUNKS - 1) {
video.webkitSourceEndOfStream(HTMLMediaElement.EOS_NO_ERROR);
}
};
})(i);
reader.readAsArrayBuffer(chunk);
}
}, false);
如何动态更改NUM_CHUNKS并切片视频?
答案 0 :(得分:2)
code you're using from Eric Bidelman会删除浏览器已完全下载的视频,以演示api的工作原理。实际上,您在服务器上slice
视频,客户端会按顺序下载每个块,可能是AJAX request。
我首先建议你在你的演示代码中尝试你的.mp4,因为MediaSource似乎对它接受的视频文件的格式非常挑剔。请参阅Steven Robertson's answer,了解如何创建一个可行的mp4。
然后,您是否要事先手动切片视频,或者在服务器上动态切换视频(具体取决于您的服务器)。 javascript客户端不应该关心每个块的数量或数量,只要它们按顺序被馈送(我认为规范甚至允许一些无序的附加)。
答案 1 :(得分:0)
webkitMediaSourceURL;
现已在Chrome中过时,现在需要使用createObjectURL();
。
这里的补丁:HTMLMediaElement to the new OO MediaSource API给了我一些关于我需要在代码中更新内容的指示。