2016-06-13 7 views
1

複数のソースから同時にビデオをダウンロードしようとしています。しかし、MSEのappendBufferメソッドは、ビデオファイルのシーケンス順序に従わないと常に失敗します。Media Source Extensions WebMストリームのappendBufferをランダムな順序で追加します。

パートをランダムに追加して、できるだけ早くビデオを再生したいと思います。 私はSourceBufferモードのプロパティとtimestampOffsetを調べていました。それらのどれも役に立たなかった。

ソースwebmファイルが「サポートされていない形式」でこのようなタスク(シーケンシャルアプローチがうまく動作します)になる可能性がありますか?

source video file

任意のアドバイスをいただき、ありがとうございます。

UPDATE: は、私はよく知られているexample video file分析しようとしましたが、私は故障して、それの部品を追加することが可能であることを考え出しました。

<Cluster type="list" offset="4357"> 
    <Timecode type="uint" value="0"/> 
    <SimpleBlock type="binary" size="7723" trackNum="1" timecode="0" presentationTimecode="0" flags="80"/> 
    <SimpleBlock type="binary" size="5" trackNum="2" timecode="0" presentationTimecode="0" flags="80"/> 
    ... 
</Cluster> 
<Cluster type="list" offset="16187"> 
    <Timecode type="uint" value="385"/> 
    <SimpleBlock type="binary" size="5" trackNum="2" timecode="0" presentationTimecode="385" flags="80"/> 
    <SimpleBlock type="binary" size="4968" trackNum="1" timecode="13" presentationTimecode="398" flags="80"/> 
    ... 
</Cluster> 

答えて

2

、WEBMフォーマット仕様に掘りlibwebmツールをコンパイルし、私は最終的にMSE appendBufferは、任意の順序で作業を作る方法を考え出しDASHを学んだ後:クラスタバイトがの範囲に従う必要があるように思えます!

  1. のffmpeg -i result.webm -g 10 -cます。v libvpxのresultClusters.webm(あなたにも使用することができますlibvpx-VP9)
  2. sample_muxer -i resultClusters.webm -o resultRepaired.webm
  3. mse_json_manifest resultRepaired.webm

あなたのような標準出力の何かになります:今、すべての

{ 
    "type": "video/webm; codecs=\"vp8\"", 
    "duration": 27771.000000, 
    "init": { "offset": 0, "size": 258}, 
    "media": [ 
    { "offset": 258, "size": 54761, "timecode": 0.000000 }, 
    { "offset": 55019, "size": 166431, "timecode": 2.048000 }, 
    { "offset": 221450, "size": 49258, "timecode": 4.130000 }, 
    { "offset": 270708, "size": 29677, "timecode": 6.148000 }, 
    { "offset": 300385, "size": 219929, "timecode": 8.232000 }, 
    { "offset": 520314, "size": 25132, "timecode": 10.335000 }, 
    { "offset": 545446, "size": 180777, "timecode": 12.440000 }, 
    { "offset": 726223, "size": 76107, "timecode": 14.471000 }, 
    { "offset": 802330, "size": 376557, "timecode": 14.794000 }, 
    { "offset": 1178887, "size": 247138, "timecode": 16.877000 }, 
    { "offset": 1426025, "size": 78468, "timecode": 18.915000 }, 
    { "offset": 1504493, "size": 25614, "timecode": 20.991000 }, 
    { "offset": 1530107, "size": 368277, "timecode": 23.093000 }, 
    { "offset": 1898384, "size": 382847, "timecode": 25.097000 }, 
    { "offset": 2281231, "size": 10808, "timecode": 27.135000 } 
    ] 
} 

最初にメタデータxhr.setRequestHeader("Range", "bytes=0-257");をロードしてから、ANY ORDER他のすべてのセグメントにロードする必要があります。例えば。第2のセグメント範囲は55019-221449バイトである。

説明:

最も重要なことは、あなたが持っているしたいクラスタのサイズにフレームセットのグループに再エンコードffmpegのです。この例では、かなり低いしきい値(各10フレーム)を選択しますが、より少ないクラスタを生成するように選択することができます(「メディア」アレイの項目が少なくなります)。あなたは、古典的な方法で手がかりを修正する必要がその後

libwebmからsample_muxerを使用して)、あなたは行く準備ができています。

テスト済み:Chrome 51、Firefox 47.

関連する問題