MediaSource和碎片mp4

时间:2014-04-10 00:13:31

标签: javascript google-chrome video streaming mp4

我正在编写一个Javascript应用程序,打算播放来自服务器的碎片化mp4文件的实时视频。目的是在收到它后立即播放,以模拟直播。

设置代码为:

myMediaSource = new MediaSource();
myVideo = document.getElementById('fragvideo');
myVideo.src = window.URL.createObjectURL(myMediaSource);
myMediaSource.addEventListener('sourceopen', function(e) {
    mySourceBuffer = myMediaSource.addSourceBuffer('video/mp4; codecs="avc1.42E01E, mp4a.40.2"');
}, false);

通过websocket二进制数据接收的代码是:

`   function onmessage (event) {
        if(event.data instanceof ArrayBuffer)
        {
            var bytes = new Uint8Array(event.data);
            mySourceBuffer.appendBuffer(bytes);
            setTimeout(function(){
                sendmessage();
            }, 50);
        }
    }

我一次从服务器发送4K数据包的文件。我在Javascript方面没有任何错误,但视频没有播放(视频是黑色的)。

我做错了什么?我输送数据的方式是错误的吗?希望有人可以在这里帮忙...

感谢。

2 个答案:

答案 0 :(得分:0)

很抱歉很久以后回复。问题可能出在MP4文件中。目前Chrome是支持MSE的唯一浏览器,它依赖于MP4文件必须符合非常严格的要求这一事实。

例如,请参阅此答案: Unable to get MediaSource working with mp4 format in chrome

请注意,如果打开chrome:media-internals并检查媒体blob信息,您应该能够检查代码回放引擎生成的错误。错误字段会告诉您它有什么问题。

答案 1 :(得分:0)

您无法发送固定大小的文件,您需要添加'段' sourceBuffer格式正确的格式。

在这种情况下,您需要解析制作碎片化MP4的传出框,并将其moof + mdat成对发送。

此外,您需要添加的第一个细分市场是'初始化细分'由空(如没有样本)moov组成,它在浏览器中初始化视频引擎并定义解压缩流所需的元数据。