2013-08-12 16 views
7

Moje rozumienie fragmentacji mp4 polega na tym, że jest to pojedynczy plik, ale wewnętrznie ma strukturę fragmentów. Czy ktoś może mi wyjaśnić, jak te fragmenty mogą być adresowane w pliku .mpd dla DASH? Pliki .mpd, które widziałem, wydają się adresować różne segmenty z osobnymi adresami URL, ale fragmentaryczne MP4, jak sądzę, musiałoby być adresowane przez przesunięcia bajtów do tego samego adresu URL. W jaki sposób przeglądarka wie, jakie czasy odpowiadają zakresom bajtów?MPEG-DASH i fragmentaryczny mp4

+0

Widzę, że nikt nie odpowiedział na część 2 twojego pytania "Jak przeglądarka wie, jakie czasy odpowiadają zakresom bajtów?" :( –

Odpowiedz

5

Oto główny profil MPEG DASH o nazwie example mpd. Plik mp4 opisany przez ten MPD jest fragmentarycznym MP4. Jak widać:

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

Na <SegmentURL> elementu, fragmenty mogą być adresowane do tej samej zawartości, i można znaleźć offsety bajtowe w atrybucie @mediaRange.

0

Serwer ma manifest, który można utworzyć, skanując plik w poszukiwaniu skrzynek moof. Moof + mdat = jeden fragment. Po wysłaniu żądania fragmentu, przesunięcie pliku jest wyświetlane w manifeście i zwracane są poprawne pola.

+0

Czy manifest mówisz tylko o manifeście (pliku .mpd) wysłanym do klienta? Gdziekolwiek czytałem o DASH, jedynym manifestem, o którym mówią, jest ten wysłany do klienta, więc nie wiedziałem że istnieje oddzielna, z której korzysta serwer, czy możesz wskazać mi odniesienie? – bhh1988

+0

Moje doświadczenie jest w silverlight, jest to inny format manifestu, ale ten sam format pliku wideo W silverlight podajesz manifest serwera (ism) Jednak manifest został wygenerowany przez skanowanie pliku multimedialnego, zakładam, że manifest jest generowany przez serwer i przechowywany w pamięci dla kreska, ale ty jesteś rytuałem, którego nie jestem w 100% pewien. – szatmary

0

O ile rozumiem ... W przypadku profilu DASH "onDemand", zadaniem paczki DASH jest utworzenie pliku * .mpd (manifest) i określenie, które zakresy bajtów mapują do segmentu (może być wiele fragmentów). Następnie klient ładuje plik * .mpd i wysyła żądania w zakresie bajtów http dla zakresów w manifeście. Myślę, że profil "na żywo" DASH jest bardziej podobny do płynnego przesyłania strumieniowego, ponieważ każdy segment ma adres URL.

Jeśli chcesz dowiedzieć się, jaka jest pozycja fragmentów w kontenerze mp4, uważam, że ta informacja znajduje się w polu segmentu "sidx".

3

Plik .mpd zawiera listę segmentów z ich zakresami bajtów, jak pokazano powyżej. Aby uzyskać dostęp do segmentów, musisz przeanalizować atrybut mediarange dla każdej linii i poprosić o coś podobnego do XHR z setRequestHeader, aby określić zakres bajtów. Dzięki tej metodzie nie jest potrzebny żaden komponent serwerowy. Oto niektóre kodu używam:

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); 
Powiązane problemy