2013-11-18 3 views
4

Я использую следующую примерную программу для добавления медиафайлов, но получаю« Uncaught InvalidStateError: Была сделана попытка использовать объект, который не является или не используется, «ошибка в первый момент, когда он попадает в код» mediaSource.sourceBuffers [0] .appendBuffer (mediaSegment); ». Я использую Chrome 31.0.1650.57. Может кто-нибудь посоветовать мне решить эту проблему?Не удалось добавить сегменты с помощью Media Source API, получить «InvalidStateError: попытка использовать объект, которого нет или нет, можно использовать

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);
до
источникBuffer.appendBuffer (initSegment);

Как метод append не работает в моей среде.

И я использую sourceopen вместо webkitsourceopen внутри window.setTimeout().

mediaSource.addEventListener ('sourceopen', onSourceOpen.bind (это, видео));

ответ

-1

Вы нашли ответ? Такая же проблема здесь :(

У меня есть временное решение, которое устанавливает setTimeout для каждого добавления буфера, поскольку вам нужно дождаться завершения предыдущего буфера (sourceBuffer.updating = false).Код может выглядеть следующим образом:

var i = 0; 
stream.on('data', function (buffer) { 
    setTimeout(function(){ 
     sourceBuffer.appendBuffer(buffer); 
    }, (i++) * 200); 
}); 
7

Проблема заключается в том, что после того, как вы добавляете данные, экземпляр 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. После этого просто сбрасывайте все в массив.

+0

Если updateend срабатывает, и в очереди нет ничего, а затем вы добавляете что-то в очередь, то он никогда не будет добавлен в sourcebuffer. – Sean

+1

Несомненно. Итак, 'queue.push = function (buffer) {if (! SourceBuffer.updating) {sourceBuffer.appendBuffer (buffer)} else {Array.prototype.push.call (this, buffer)}}' –