Dlaczego wideo H.264 jest o wiele szybsze w kontenerze FLV niż w kontenerze MP4?

9

Zajmuję się tworzeniem serwisu Tube i obecnie mam problemy z formatem H.264. Zauważyłem, że YouTube umieścił swoje filmy hi-def w kontenerze MP4, więc logicznie zrobiłem to samo.

Następnie zainstalowałem mod_h264_streamingdla lighttpd, aby działało przesyłanie strumieniowe i czyszczenie osi czasu.

Problem polega na tym, że duże pliki (> 500 MB w nieco wysokiej rozdzielczości) trwają wiecznie, aby rozpocząć buforowanie (czytam, że Flowplayer i inne odtwarzacze Flash muszą najpierw pobrać metadane). Przeniesiłem atom xmov na początek pliku za pomocą MP4Box (próbowałem też Qt QuickStart), ale to nie pomogło.

Następnie przeczytałem, że muszę przeplatać ścieżki audio, więc też to zrobiłem. Nie spowodowało to żadnych zmian: filmy były nadal wolne.

Próbowałem więc umieścić dokładnie ten sam film H.264 w pojemniku FLV, a buforowanie odtwarzania zaczęło się niemal natychmiast - bez spowolnienia.

Więc czego tu brakuje? Dlaczego miałbym wybierać kontener MP4 z modułem mod_264_streaming, który wydaje się super wolny, niż zwykły kontener FLV z wbudowanym lighttpd mod_flv_streaming? Oczywiście wiele stron internetowych wybiera kontener MP4, ale nie rozumiem dlaczego.

I jako pytanie poboczne spróbowałem użyć <video>tagu HTML5, aby wypróbować ten sam film H.264 MP4, a czyszczenie było błyskawiczne ! Przejrzałem plik dziennika lighttpd i zauważyłem, że odtwarzacze Flash dołączają się za video.mp4?start=234każdym razem, gdy oś czasu jest szorowana, podczas gdy przeglądarki używające natywnego <video>tagu HTML5 nie robią takich rzeczy. Czy to jakieś ograniczenie Flasha? Dlaczego streaming Flash nie może być tak szybki jak streaming HTML5?

Gotys
źródło

Odpowiedzi:

4

TL; DR: MP4 jest używany, gdy witryna wideo przechowuje w filmie więcej metadanych niż obsługuje FLV lub używa kodeku audio, którego FLV nie obsługuje. Prostota FLV i konstrukcja do przesyłania strumieniowego sprawiają, że jest to dobry wybór, jeśli nie masz dobrego powodu, aby używać MP4.

Jeśli chodzi o szorowanie osi czasu Flasha, nie mam pojęcia, dlaczego tak się dzieje, ponieważ nigdy nie kodowałem Flasha, ale możliwe, że to pokrętło, którego używa, lub coś, co działa konkretnie z serwerem strumieniowym Adobe w celu wyszukiwania w pliku. Działa również jako sposób na powstrzymanie nieznośnego użytkownika od przechowywania pliku na jego dysku.


Niektóre rzeczy, które już znasz:

Istnieją zasadnicze różnice między kontenerami FLVi MP4(aka isomedia). FLV od początku był wymyślony przez Adobe jako kontener do przesyłania strumieniowego, a to jest cholernie proste . Wszystko, co robi, to wysyłanie pakietu wideo, następnie pakietu audio, a następnie pakietu wideo ... Jednak obsługuje tylko bardzo niewiele kodeków i nie ma metadanych innych niż znaczniki czasu w milisekundach. Jeśli nie potrzebujesz funkcji specyficznych dla MP4, dobrze sobie poradzisz z FLV.

Z drugiej strony nośniki ISO oparte są na kontenerze MOV firmy Apple. Jest on podzielony na atomy i istnieje określony atom moov, który należy zdekodować, zanim będzie można odczytać inne atomy . Problem z MP4 polega na tym moov, że atom jest zapisany na końcu pliku, co jest o wiele łatwiejsze do kodowania programów. Istnieją narzędzia, takie jak qtfaststart , które wykonają niezbędne munging, aby umieścić moovatom na początku pliku. Dlatego plik rozpocznie odtwarzanie, gdy tylko będzie miał dane, zamiast konieczności pełnego pobrania przed rozpoczęciem.

Jessidhia
źródło
0

Jeśli korzystasz z ruchomego kontenera, jest on przesyłany strumieniowo z pudełka bez potrzeby instalowania modułów lub umieszczania w kontenerze flv i korzystania z modułu. Tylko moje myśli. Użyj mov i dodaj odpowiedni typ MIME - gotowe.

RobotHumans
źródło