Javascript 无法使MediaSource在chrome中使用mp4格式
基于实例 我下载了webm文件并将其编码为mp4文件,该文件将在本地播放,但我无法将其用作媒体源 MP4Box报告编解码器为avc1.64000d,mp4a.40.2,但将其添加到源缓冲区没有帮助 这里是问题的一个原因(我不希望它在firefox中工作,因为媒体源扩展还不受支持) 下面是我正在测试的代码:Javascript 无法使MediaSource在chrome中使用mp4格式,javascript,google-chrome,media-source,Javascript,Google Chrome,Media Source,基于实例 我下载了webm文件并将其编码为mp4文件,该文件将在本地播放,但我无法将其用作媒体源 MP4Box报告编解码器为avc1.64000d,mp4a.40.2,但将其添加到源缓冲区没有帮助 这里是问题的一个原因(我不希望它在firefox中工作,因为媒体源扩展还不受支持) 下面是我正在测试的代码: var FILE,CODEC,mediaSource; var NUM_CHUNKS = 5; var video = document.qu
var FILE,CODEC,mediaSource;
var NUM_CHUNKS = 5;
var video = document.querySelector('video');
window.MediaSource = window.MediaSource || window.WebKitMediaSource;
if (!!!window.MediaSource) {
alert('MediaSource API is not available');
}
function callback() {
var sourceBuffer = mediaSource.addSourceBuffer(CODEC);
GET(FILE, function(uInt8Array) {
var file = new Blob([uInt8Array], {type: 'video/mp4'});
var chunkSize = Math.ceil(file.size / NUM_CHUNKS);
var i = 0;
(function readChunk_(i) {
var reader = new FileReader();
reader.onload = function(e) {
sourceBuffer.appendBuffer(new Uint8Array(e.target.result));
if (i == NUM_CHUNKS - 1) {
mediaSource.endOfStream();
} else {
if (video.paused) {
video.play();
}
readChunk_(++i);
}
};
var startByte = chunkSize * i;
var chunk = file.slice(startByte, startByte + chunkSize);
reader.readAsArrayBuffer(chunk);
})(i);
});
}
function GET(url, callback) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'arraybuffer';
xhr.send();
xhr.onload = function(e) {
if (xhr.status != 200) {
alert("Unexpected status code " + xhr.status + " for " + url);
return false;
}
callback(new Uint8Array(xhr.response));
};
}
function start(type) {
if (type == 'webm') {
FILE = 'test.webm';
CODEC = 'video/webm; codecs="vorbis,vp8"';
}
if (type == 'mp4') {
FILE = 'test.mp4';
CODEC = 'video/mp4; codecs="avc1.64000d,mp4a.40.2"';
}
mediaSource = new MediaSource();
video.src = window.URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', callback, false);
mediaSource.addEventListener('webkitsourceopen', callback, false);
mediaSource.addEventListener('webkitsourceended', function(e) {
}, false);
}
问题是你的文件。媒体源扩展需要片段化MP4,文件开头带有moov(电影标题框),在您的情况下,它放在最后 此外,在mdat(媒体数据框)之前还需要一个moof(电影片段框)。MP4Box能够生成符合DASH的片段化mp4,但我建议您使用它们的最新版本
MP4Box -dash 1000 -rap -frag-rap test.mp4
这将生成一个结构正确的分段mp4文件,moov放在文件的开头。每个片段都是1秒,从一个关键帧开始 您的编解码器也错了,可能是“视频/mp4”;codecs=“avc1.4D4001,mp4a.40.2”现在开始研究这个问题。因为MP4已经可以与webm一起使用,所以您需要使用它有什么原因吗?是否要使其跨浏览器兼容?很抱歉,我只是想更好地理解这个需求。因为我想从产生h.264的Ipcameras流式传输,我可以转换到webm,但这将是非常好的保持cpu时间向下岩石!!!!!花了很多时间试图让它工作,你的答案帮助我不垃圾所有的项目,离开编程生活回来!谢谢我有一个.mp4视频文件,其中只包含视频和音频。我希望视频和音频分开,并将它们创建成碎片化的mp4,通过媒体源扩展播放。我将如何描述这是MP4Box。请帮助我从iphone上录制了一段视频,并在其上运行了相同的命令,但在“MediaSource”上执行“endOfStream”时仍然出现错误:MediaSource的readyState不是“打开的,有人可以帮助吗?”MP4Box对于自动化目的来说非常不灵活,并且不执行从/向stdin/stdout读/写之类的基本操作。有没有办法让ffmpeg生成这样的dashinit文件?修复moov和moof问题的ffmpeg命令如下:ffmpeg-i file.mp4-c copy-movflags frag_keyframe+empty_moov+default_base_moof output.mp4这在mozilla MSE文档中有更好的说明:Queméo aronbado que fica dando negato na minharesposta?