6

次のサンプル プログラムを使用してメディア ファイルを追加しましたが、コード「mediaSource.sourceBuffers[0]」にヒットした最初の瞬間に「Uncaught InvalidStateError : 使用できないオブジェクト、または使用できなくなったオブジェクトを使用しようとしました」というエラーが表示されます。 .appendBuffer(メディアセグメント);". 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() イベント内で webkitsourceopen の代わりに sourceopen を使用します。

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

答えは見つかりましたか?ここで同じ問題:(

前のバッファの更新が完了するのを待つ必要があるため(sourceBuffer.updating == false)、バッファの追加ごとにsetTimeoutを設定する一時的な解決策があります。コードは次のようになります。

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