2011-11-24 7 views
6

Pracuję nad aplikacją, w której użytkownicy przesyłają wideo i odtwarzają je za pomocą jwplayer, jplayera, flowplayera itp. Niektóre filmy są odtwarzane natychmiast, a inne czekają, aż cały plik wideo zostanie pobrany.Dlaczego niektóre filmy MP4 nie rozpoczną przesyłania strumieniowego do momentu pobrania całego pliku?

Używam ffmpeg do konwersji wideo do formatu MP4.

Oto kilka szczegółowych informacji o jednym z plików wideo, które wypróbowałem.

General 
Complete name     : 429183132058337290450_AutoFF.mp4 
Format       : MPEG-4 
Format profile     : Base Media 
Codec ID       : isom 
File size      : 10.2 MiB 
Duration       : 24s 333ms 
Overall bit rate     : 3 501 Kbps 

Video 
ID        : 1 
Format       : AVC 
Format/Info      : Advanced Video Codec 
Format profile     : [email protected] 
Format settings, CABAC   : Yes 
Format settings, ReFrames  : 3 frames 
Codec ID       : avc1 
Codec ID/Info     : Advanced Video Coding 
Duration       : 24s 333ms 
Bit rate mode     : Variable 
Bit rate       : 3 351 Kbps 
Width       : 1 024 pixels 
Height       : 560 pixels 
Display aspect ratio    : 16:9 
Frame rate mode     : Constant 
Frame rate      : 30.000 fps 
Color space      : YUV 
Chroma subsampling    : 4:2:0 
Bit depth      : 8 bits 
Scan type      : Progressive 
Bits/(Pixel*Frame)    : 0.195 
Stream size      : 9.72 MiB (96%) 
Language       : Japanese 

Odpowiedz

6

Miałem ten problem również z niektórymi filmami MP4. Konwertowałem przesłane filmy na mp4 (h.264 + aac) i nie były one buforowane. Powodem jest to, że ten format zawiera ważne metadane wymagane do odtwarzania na końcu pliku, dlatego cały plik musi zostać załadowany przed rozpoczęciem odtwarzania. Rozwiązaniem było użycie małego programu o nazwie qt-faststart (https://github.com/danielgtaylor/qtfaststart) na wyniku konwersji. Ten program przenosi te metadane na początek pliku, co umożliwia odtwarzanie z postępem pobierania.

0

miałem ten sam problem najdłużej przy użyciu ffmpeg do tworzenia wideo MP4 - co ostatecznie pracował, był po prostu dodanie obciążenia wstępnego = „metadane” do znacznika HTML5:

<video preload="metadata"><source src="..." /></video> 
5

Korzystając ffmpeg z -movflags +faststart opcja. Spowoduje to przeniesienie atomu moov na początek pliku, dzięki czemu odtwarzanie rozpocznie się od klienta bez konieczności całkowitego pobrania pliku.

Można go używać w swojej komendzie kodowania, lub można go używać z istniejącego pliku i po prostu ponownie MUX:

ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4 
Powiązane problemy