【问题标题】:Unable to get MediaSource working with mp4 format in chrome无法让 MediaSource 在 chrome 中使用 mp4 格式
【发布时间】:2014-05-24 16:03:19
【问题描述】:

基于示例here

我下载了 webm 文件并编码为 mp4 文件,可以在本地播放,但我无法将其用作媒体源。

MP4Box 报告编解码器为 avc1.64000d,mp4a.40.2,但将其添加到源缓冲区没有帮助。

这是问题的demo(我不希望它在 Firefox 中工作,因为尚不支持媒体源扩展)

这是我正在测试的代码:

 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);
            }

【问题讨论】:

  • 现在正在调查。既然它已经与 webm 一起使用,您是否有理由需要它与 MP4 一起使用?是让它跨浏览器兼容吗?抱歉,只是想更好地了解需求。
  • 这是因为我想从产生 h.264 的 Ipcamera 流式传输,我可以转码为 webm,但减少 cpu 时间真的很好

标签: javascript google-chrome media-source


【解决方案1】:

问题在于您的文件。媒体源扩展需要在文件开头带有 moov(电影标题框)的分段 MP4,在您的情况下,它放在最后。

还需要在 mdat(媒体数据框)之前有一个 moof(电影片段框)。 MP4Box 能够生成符合 DASH 的分段 mp4,但我建议您使用他们最新的 nightly 版本。

MP4Box -dash 1000 -rap -frag-rap test.mp4

这将生成一个结构正确的分段 mp4 文件,moov 位于文件的开头。每个片段为 1 秒,从一个关键帧开始。

【讨论】:

  • 你摇滚!!!!花了很多时间试图让它工作,你的回答帮助我不要破坏所有的项目,让编程生活回归!谢谢!
  • 我有一个仅包含视频和音频的 .mp4 视频文件。我希望将视频和音频分开,并将它们都创建成碎片 mp4 以通过媒体源扩展播放。我将如何描述这是 MP4Box。请帮忙
  • 我从 iphone 录制了一个视频并在其上运行了相同的命令,但我仍然收到错误无法在 'MediaSource' 上执行 'endOfStream':MediaSource 的 readyState 不是 'open 有人可以帮忙吗?跨度>
  • MP4Box 对于自动化目的非常不灵活,并且不执行从/向标准输入/标准输出读取/写入等基本操作。有什么方法可以让 ffmpeg 生成这样的 dashinit 文件?
  • 修复 moov 和 moof 问题的 ffmpeg 命令如下: ffmpeg -i file.mp4 -c copy -movflags frag_keyframe+empty_moov+default_base_moof output.mp4 这在 mozilla MSE 文档中有更好的记录这里:developer.mozilla.org/en-US/docs/Web/API/…
【解决方案2】:

您的编解码器也是错误的,应该是 'video/mp4;编解码器="avc1.4D4001,mp4a.40.2"'

【讨论】:

  • Quem é o arombado que fica dando negativo na minha resposta?
猜你喜欢
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 2015-12-18
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多