2013-08-12 49 views
7

断片化されたmp4の理解は、それが単一のファイルだということですが、内部的に断片として構成されています。誰かがDASHの.mpdファイルでこれらのフラグメントをどのように扱うことができるのかを私に説明することはできますか?私が見た.mpdファイルは、別々のURLでさまざまなセグメントに対応しているようですが、フラグメント化されたmp4は、同じURLにバイトオフセットでアドレス指定する必要があります。ブラウザは、どのような時がどのバイト範囲に対応しているかをどのように知っていますか?MPEG-DASHと断片化されたmp4

+0

あなたの質問の第2部に答えた人はいません。「ブラウザーは、どのような時がどのバイト範囲に対応しているかをどのように知っていますか? :( –

答えて

5

MPEG DASHのメインプロファイルにはexample mpdがあります。このmpdで記述されたmp4ファイルは断片化したmp4です。ご覧のとおり:

<SegmentURL media="bunny_15s_200kbit/bunny_200kbit_dashNonSeg.mp4" mediaRange="868-347185"/> 
<SegmentURL media="bunny_15s_200kbit/bunny_200kbit_dashNonSeg.mp4" mediaRange="347186-664464"/> 

<SegmentURL>要素では、フラグメントは、同じURLに対処することができ、あなたは@mediaRange属性でバイトオフセットを見つけることができます。

0

サーバーには、moofボックスのファイルをスキャンすることによって作成できるマニフェストがあります。 moof + mdat = 1つのフラグメント。フラグメントの要求が行われると、ファイルオフセットがマニフェストで検索され、正しいボックスが返されます。

+0

クライアントに送信されたマニフェスト(.mpdファイル)のマニフェストは何ですか?ダッシュについては、クライアントが送信したマニフェストのみが表示されているので、私は気づいていません – bhh1988

+0

私の経験は銀色で、マニフェスト形式は同じですが、同じビデオファイル形式ですシルバーライトではサーバマニフェスト(ism)を指定してください。しかし、マニフェストはメディアファイルをスキャンすることによって生成されました。私は、マニフェストがサーバによって生成され、ダッシュのためにメモリに保存されていると仮定していますが、あなたは礼儀正しくありません。 – szatmary

0

DASHのonDemandプロファイルの場合は、* .mpd(マニフェスト)を作成し、どのバイト範囲がセグメントにマップするかを指定するのがDASHパッケージャの仕事です(断片の数である可能性があります)。クライアントは* .mpdをロードし、マニフェスト内の範囲に対してhttpバイトの範囲要求を行います。 DASHの「ライブ」プロファイルは、各セグメントにURLがあるという点でスムーズなストリーミングに似ています。

mp4コンテナ内のフラグメントの位置を調べる必要がある場合、私はこの情報がセグメント 'sidx'ボックスにあると考えます。

3

.mpdファイルには、上記のようなバイト範囲のセグメントのリストがあります。セグメントにアクセスするには、各行のmediarange属性を解析し、setRequestHeaderを持つXHRなどでバイト範囲を指定する必要があります。この方法では、サーバーコンポーネントは必要ありません。ここで私が使用してきたいくつかのコードがあります:

var xhr = new XMLHttpRequest(); 

    // Range is in format of 1234-34567 
    // url is the .mp4 file path 
    if (range || url) { // make sure we've got content in our params 
    xhr.open('GET', url); 
    xhr.setRequestHeader("Range", "bytes=" + range); 
    xhr.send(); 
    xhr.responseType = 'arraybuffer'; 
    try { 
     // watch the ready state 
     xhr.addEventListener("readystatechange", function() { 
     if (xhr.readyState == 4) { //wait for video to load 
      // add response to buffer 
      try { 
      // videoSource is a sourceBuffer on your mediaSource object.    
      videoSource.appendBuffer(new Uint8Array(xhr.response)); 
      videoSource.onreadystatechange = function() { 
       if (videoSource.readyState == videoSource.done) { 
       videoElement.play(); 
       } 
      }; 
      } catch (e) { 
      // fail quietly 
      } 
     } 
     }, false); 
関連する問題