6

我使用以下示例程序来附加媒体文件,但在遇到代码“mediaSource.sourceBuffers[0] .appendBuffer(mediaSegment);"。我正在使用 Chrome 31.0.1650.57。谁能建议我解决这个问题?

https://github.com/jbochi/media-source-playground/blob/master/test.html

我已经对附加文件进行了以下修改。

var buffer_len = 0;

function HaveMoreMediaSegments(){
    //return false; //return buffers.length > 0;
    return buffers.length > buffer_len;
}

// var GetNextMediaSegment = GetInitializationSegment;

function GetNextMediaSegment(){
    var buffer = buffers[buffer_len];
    buffers = buffers.slice(1);
    buffer_len = buffer_len + 1;
    return buffer;
}

并改变了

mediaSource.sourceBuffers[0].append(mediaSegment);

mediaSource.sourceBuffers[0].appendBuffer(mediaSegment);


sourceBuffer.append(initSegment);

sourceBuffer.appendBuffer(initSegment);

由于 append 方法在我的环境中不起作用。

我在 window.setTimeout() 事件中使用 sourceopen 而不是 webkitsourceopen 。

mediaSource.addEventListener('sourceopen', onSourceOpen.bind(this, video));
4

2 回答 2

13

问题是,在附加数据后,SourceBuffer实例在工作时会暂时不可用。在此期间,SourceBufferupdating属性将设置为true,因此很容易检查。

但可能最简单的处理方法是监听updateend事件,然后将所有缓冲区排队,仅在SourceBuffer告诉您它已准备好接受新缓冲区时才附加它们。像这样:

// store the buffers until you're ready for them
var queue = [];

// whatever normally would have called appendBuffer(buffer) can 
// now just call queue.push(buffer) instead

sourceBuffer.addEventListener('updateend', function() {
  if ( queue.length ) {
    sourceBuffer.appendBuffer(queue.shift());
  }
}, false);

请记住,为了触发第一个事件,您需要手动附加第一个缓冲区,而不是推送到queue. 之后,只需将所有内容转储到数组中。

于 2014-01-21T04:57:21.197 回答
-1

你找到答案了吗?同样的问题在这里:(

我有一个临时解决方案,它为每个缓冲区附加设置 setTimeout,因为您必须等待前一个缓冲区完成更新(sourceBuffer.updating == false)。代码可能如下所示:

var i = 0;
stream.on('data', function (buffer) {
    setTimeout(function(){
        sourceBuffer.appendBuffer(buffer);
    }, (i++) * 200);
});
于 2013-12-03T16:09:15.543 回答