2013-08-12 7 views
8

Jeśli odtwarzasz wideo HTML5 dla pliku wideo hostowanego na serwerze, który akceptuje żądania zasięgu, podczas próby wyszukiwania z wyprzedzeniem do niezabezpieczonej części wideo można zauważyć ruch sieciowy wykonywany przez przeglądarkę żądanie dotyczące zakresu bajtów. Zakładam, że przeglądarka oblicza bajt, znając całkowity rozmiar wideo z wyprzedzeniem i zakładając stałą przepływność (jeśli klikniesz w połowie paska postępu, to zażąda bajtu w połowie). Ale szczególnie jeśli wideo ma zmienny bitrate, wydaje się mało prawdopodobne, by bajt, którego zażąda, rzeczywiście odpowiadał punktowi czasowemu, w którym użytkownik kliknął, a bajt prawdopodobnie padłby w środku klatki.Jak mogą działać żądania bajtów w formacie HTML5 (pseudo-streaming)?

W jaki sposób przeglądarka wie, co oznacza początek następnej klatki, po rozpoczęciu pobierania w dowolnym dowolnym bajcie?

+0

Próbowałem odpowiedzieć na pytanie poniżej. Sprawdź, czy to pomaga. – woofmeow

Odpowiedz

9

I zakładamy, że film jest w kontenerze MP4. Format pliku mp4 zawiera hierarchiczną strukturę "pól". Jednym z tych pól jest pole Time-To-Sample (STTS). To pudełko zawiera czas każdej klatki (w zwartej formie). Stąd możesz znaleźć "fragment", który zawiera ramkę za pomocą atomu Sample-to-Chunk (stsc). I wreszcie atom przesunięcia Chunk (stco) daje przesunięcie bajtowe do pliku.

Całkowity czas trwania filmu to zapis w atomie nagłówka filmu (mvhd). Kiedy przesuwasz uchwyt szorowania, czas jest szacowany na podstawie czasu trwania filmu i miejsca zwolnienia uchwytu szorowania, obliczenia dokonuje się z pobranego wcześniej nagłówka pliku i wysyłane jest żądanie.

Edytuj: Jeśli nie jest to mp4, inne pojemniki mają podobny mechanizm. Kodek jest nieistotny.

+0

Ta odpowiedź jest dla mnie najbardziej przekonująca, ale nie jestem do końca przekonany, że tak właśnie postępują przeglądarki. Całkowicie zgadzam się, że można to zrobić w ten sposób. Aby to wyjaśnić, ten blog okazał się pomocny: http://thompsonng.blogspot.com/2010/11/mp4-file-format.html Jeśli to, co mówisz, jest poprawne, to poszukaj, nawet w bardzo dużym wideo ze zmienną szybkością transmisji, powinno być całkowicie dokładne? Czy macie również jakieś referencje, które dowodzą, że przeglądarki używają atomu moov (stts, stsc, stco data) do wyszukiwania? – bhh1988

+0

Osobiście lubię iść bezpośrednio do źródła. To jest ISC/IEC 14496-12. Lub starszą dokumentację "QuickTime File Format". Tak, jestem pewien, że tak właśnie działa przeglądarka dla mp4, ponieważ jest to jedyny sposób wyszukiwania w mp4. – szatmary

+0

Nie można przejść do programu mdat, ponieważ fragmenty audio i wideo są przeplatane bez żadnego wskazania, gdy jeden fragment zatrzymuje się, a drugi zaczyna. Jedynym dokumentem będzie kod źródłowy przeglądarki. Zauważ, że każda przeglądarka prawdopodobnie użyje jakiegoś rodzaju abstrakcji multimediów. Tak więc przeglądarka po prostu wywoła metodę seekToTime(), a warstwa mediów określi, które żądania HTTP mają zostać wysłane. – szatmary

-1

Wiele typów wideo/mediów, takich jak MPEG, jest zakodowanych w stałych-tych samych pakietach.

Format MPEG został pierwotnie zaprojektowany na pakietach 188 bajtów (pierwotnie wybrany jako 8 komórek warstwy transportu ATM, ale obecnie jest przestarzały). Jeśli więc poszukujesz wielokrotności tego 188-bajtowego rozmiaru, odtwarzacz odczyta poprawne pakiety, odzyskując synchronizację po znalezieniu początku ramki.

Rzeczywiste zdjęcie może zostać wyświetlone, gdy przeglądarka/odtwarzacz osiągnie klatkę I (lub klatkę kluczową), którą można zdekodować niezależnie od innych klatek. Ramki P i B to interpolacje, więc jeśli ich szukasz, nie możesz jeszcze stworzyć obrazu.

Patrz:

+0

Co z h.264? Ponadto, nie jest dla mnie jasne, w jaki sposób pasuje to do ramek. Co się stanie, jeśli wniosek przyniesie pakiet ze środka ramki? Skąd wiadomo, gdzie są granice kadru, aby mógł on prawidłowo kontynuować odtwarzanie? – bhh1988

+0

Ramki są oznaczone, abyś * mógł * wyszukiwać w strumieniu pakietów i odzyskiwać synchronizację. Gracz zwykle będzie czytał i pomija, dopóki nie znajdzie ramki "pełnego obrazu". Jeśli chcesz zbadać rozmiar pakietów, sam Google H.264 .. –

+0

Nie zgadza się. Tylko HTTP Live Streaming wykorzystuje strumienie transportu. W przypadku HLS określanie czasu jest określane przez plik manifestu (m3u8), a całe segmenty są pobierane. Bez zakresów bajtów. – szatmary

Powiązane problemy