2013-08-30 16 views
45

Mam stronę internetową, która (między innymi) musi wyodrębnić określoną klatkę z filmu przesłanego przez użytkownika. Użytkownik szuka określonej części pliku .mp4 w odtwarzaczu, a następnie klika przycisk, a wywołanie ajax zostaje wywołane do skryptu php, który pobiera .mp4, i dokładny czas z filmu, i używa go do wyodrębnienia. ramka "miniatura".Najszybszy sposób wyodrębnienia określonej klatki z filmu wideo (PHP/ffmpeg/cokolwiek)

Moje obecne rozwiązanie jest przy użyciu polecenia php exec:

exec("ffmpeg -i $videoPath -ss $timeOffset -vframes 1 $jpgOutputPath");

... który działa po prostu super, oprócz tego, że jest tak wolna, jak melasy. Domyślam się, że ffmpeg to trochę za dużo pracy, a być może będę w stanie to zrobić lepiej, wykorzystując podstawowe biblioteki lub coś takiego ... jednak nie mam pojęcia, jak to zrobić.

Idealnie nie chcę instalować niczego, co wymaga prawdziwego "procesu instalacji" ... tzn. Upuszczenie pliku wykonywalnego do folderu za pomocą mojej aplikacji internetowej jest w porządku, ale wolałbym nie mieć właściwie uruchom instalator. Rozwiązanie powinno także działać na Macu, Linuksie i Windowsie (choć priorytetem jest Linux).

Co mogę zrobić, aby przyspieszyć ten proces?

Dzięki.

+0

Możesz umieścić zadanie generowania miniatur w kolejce i pozwolić użytkownikowi na dołączenie innych rzeczy, podczas gdy jest generowany przez inny skrypt, na który nie muszą czekać. – GordonM

+0

dobrze spróbuj grać z ffmpeg c: \ ffmpeg.exe -ic: \ video \ hello.mov - ss 10 - t 4 -f zdjęcie2 - tenq -vcodec mjpeg img-% 03d.jpg To może być bardzo trudne i możliwe jest, że możesz uzyskać znaczną poprawę wydajności, jeśli po prostu użyjesz różnych atrybutów ... –

+0

@DusanPlavak ['-sameq' nie oznacza" tej samej jakości "] (http://superuser.com/a/478550/110524) i został usunięty z ffmpeg. Dla wyjścia jpg użyj '-qscale: v' z efektywnym zakresem od 2 (najwyższa jakość) do 31 (najniższa jakość). – LordNeckbeard

Odpowiedz

67

Oczywiście możesz napisać kod C/C++ i link do -lav *, tworząc w zasadzie uproszczoną wersję ffmpeg tylko do wyodrębniania klatek, a może nawet zrobić to jako rozszerzenie php (również nie będę go uruchamiał jako ten sam użytkownik, nie mówiąc już o tym samym procesie). Jednak wynik jest bardzo mało prawdopodobny, ponieważ można by tylko uniknąć pewnych rozwidleń i konfiguracji, ale najprawdopodobniej problemem jest dekodowanie, które nadal będzie takie samo.

Zamiast tego powinieneś najpierw przyjrzeć się używaniu ffmpeg w trybie szybkiego wyszukiwania (lub trybie szybkiego/dokładnego hybrydowego). Their wiki states o szybkim Poszukujesz:

Parametr -p musi zostać określony przed -i:

ffmpeg -p 00:03:00 -i Underworld.Awakening.avi -frames: v 1 OUT1 .jpg

Ten przykład spowoduje utworzenie jednej ramki obrazu (out1.jpg) w okolicach w trzeciej minucie od początku filmu. Dane wejściowe zostaną przeanalizowane przy użyciu klatek kluczowych, co jest bardzo szybkie. Wadą jest to, że to zakończy również wyszukiwanie w jakiejś klatce kluczowej, niekoniecznie zlokalizowane w określonym czasie (00:03:00), więc poszukiwania nie będą tak dokładne, jak to oczekiwano zgodnie z oczekiwaniami.

Szybkie wyszukiwanie jest mniej dokładne, ale o wiele cholernie szybsze, ponieważ ffmpeg nie będzie musiał dekodować (większość) filmu podczas wyszukiwania, podczas gdy szybki/dokładny tryb hybrydowy jest dobrym kompromisem. Przeczytaj the wiki page, aby uzyskać wszystkie dostępne opcje.

Edycja 14/06/10:

Na FFmpega 2.1, podczas transkodowania z FFmpega (to nie strumień kopiowaniu) -p jest dokładne, nawet przy zastosowaniu jako opcji wprowadzania. Poprzednie zachowanie można przywrócić za pomocą opcji -noaccurate_seek. (source)

Więc z 2.1+, „hybryda” poszukiwania nie powinno być wymagane już na dokładne wyniki, jeśli chodzi o ponowne kodowanie (i zapisywanie do .jpeg jest ponowne kodowanie). Wystarczy zwykłe szybkie wyszukiwanie (-ss ... -i ...) zamiast powolnego wyszukiwania (-i ... -ss ...).

+1

Różnica czasu wykonania wynosiła około 20 minut (wideo 3 GB). Uratowałem dzień. – weisjohn

+3

Wyszukiwanie szybkie wydaje się również działać w przypadku zdalnych filmów wideo, np. przez http lub https. –

+0

Dziękuję, wersja "Edit 14/06/10" działa dla mnie! – matt

Powiązane problemy