我正在尝试使用Chrome中可用的新MediaSource API。

我正在尝试将二进制数据从WebSocket即时添加到视频媒体源。

https://html5-demos.appspot.com/static/media-source.html的示例开始,我的代码当前为:

var websocket = new WebSocket('ws://localhost:8080');
websocket.binaryType = 'arraybuffer';

var mediaSource = new MediaSource();
var buffer;
var queue = [];

var video = $('.video')[0];
video.src = window.URL.createObjectURL(mediaSource);

mediaSource.addEventListener('sourceopen', function(e) {
  video.play();

  buffer = mediaSource.addSourceBuffer('video/mp4; codecs="avc1.64001E"');

  buffer.addEventListener('updatestart', function(e) { console.log('updatestart: ' + mediaSource.readyState); });
  buffer.addEventListener('update', function(e) { console.log('update: ' + mediaSource.readyState); });
  buffer.addEventListener('updateend', function(e) { console.log('updateend: ' + mediaSource.readyState); });
  buffer.addEventListener('error', function(e) { console.log('error: ' + mediaSource.readyState); });
  buffer.addEventListener('abort', function(e) { console.log('abort: ' + mediaSource.readyState); });

  buffer.addEventListener('update', function() { // Note: Have tried 'updateend'
    if (queue.length > 0 && !buffer.updating) {
      buffer.appendBuffer(queue.shift());
    }
  });
}, false);

mediaSource.addEventListener('sourceopen', function(e) { console.log('sourceopen: ' + mediaSource.readyState); });
mediaSource.addEventListener('sourceended', function(e) { console.log('sourceended: ' + mediaSource.readyState); });
mediaSource.addEventListener('sourceclose', function(e) { console.log('sourceclose: ' + mediaSource.readyState); });
mediaSource.addEventListener('error', function(e) { console.log('error: ' + mediaSource.readyState); });

websocket.addEventListener('message', function(e) {
  if (typeof e.data !== 'string') {
    if (buffer.updating || queue.length > 0) {
      queue.push(e.data);
    } else {
      buffer.appendBuffer(e.data);
    }
  }
}, false);

我始终收到错误消息:一次追加后出现InvalidStateError: Failed to execute 'appendBuffer' on 'SourceBuffer': This SourceBuffer has been removed from the parent media source.。看起来MediaSource在调用buffer.appendData()之后立即关闭。

有什么办法优雅地做到这一点吗?

注意:chrome://media-internals/不返回任何有用的信息。

最佳答案

最终,问题是我正在通过网络套接字发送h264视频。 MediaSource API当前仅支持带关键帧段的MPEG-DASH和VP8(在Chrome 35上)。

此外,尝试VP8后,我发现我添加了一些乱序的帧。

  • 需要在if (buffer.updating || queue.length > 0)中添加websocket.onmessage
  • 也需要在if (queue.length > 0 && !buffer.updating)中添加buffer.addEventListener('update', ...)

  • 注意:我将此处提到的编辑应用于问题中的代码,因此问题中的代码唯一的问题是编解码器错误

    关于javascript - MediaSource错误: This SourceBuffer has been removed from the parent media source,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24102075/

    10-08 22:56