MediaSource错误:此SourceBuffer已从父媒体源中删除

Chr*_*let 25 javascript html5 media-source

我正在尝试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);
Run Code Online (Sandbox Code Playgroud)

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

任何方式优雅地做到这一点?

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

Chr*_*let 8

最终问题是我在websocket上发送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', ...)还要求.

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

  • 嗨,我看到你似乎是迄今为止唯一一个试图完成我现在正在尝试做的事情:通过网络套接字将低延迟直播H264视频流转换为使用媒体源API的html5视频.您是否有机会分享您为媒体源提供何种数据和格式的最终​​解决方案?我被困在你所在的同一个地方:想要流式传输H264,但它看起来不像媒体源api会接受它).我真的很感激任何帮助.谢谢. (2认同)
  • 嗨!我最终切换到VP8进行概念验证。这是我如何使VP8工作的方法:http://stackoverflow.com/questions/24152810/encoding-from-ffmpeg-to-mpeg-dash-webm-with-keyframe-clusters-to-work-with-medi。流式传输VP8而不是h264之后,我使用了与问题中发布的代码完全相同的代码,除了使用`buffer = mediaSource.addSourceBuffer('video / webm; codecs =“ vp8”')`而不是`video / mp4 `。 (2认同)
  • 我提出的以下 2 个问题及其回复 + 评论将展示如何进行相对低延迟的实时 h264 流媒体:http://stackoverflow.com/questions/30617673/live-streaming-dash-content-using-mp4box & http: //stackoverflow.com/questions/30868854/flush-latency-issue-with-fragmented-mp4-creation-in-ffmpeg (2认同)