我正在编写一个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方面没有任何错误,但视频没有播放(视频是黑色的)。
我做错了什么?我输送数据的方式是错误的吗?希望有人可以在这里帮忙...
感谢。
答案 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
组成,它在浏览器中初始化视频引擎并定义解压缩流所需的元数据。