2013-08-30 9 views
45

Ho una pagina Web che, tra le altre cose, ha bisogno di estrarre un frame specifico da un video caricato dall'utente. L'utente cerca una particolare parte di un .mp4 nel player, quindi fa clic su un pulsante e una chiamata ajax viene sparata su uno script php che prende il .mp4 e l'ora esatta dal video e la usa per estrarre una cornice "miniatura".Il modo più veloce per estrarre un frame specifico da un video (PHP/ffmpeg/anything)

mia soluzione attuale sta usando il comando php exec:

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

... che funziona solo grande, tranne che è lento come la melassa. La mia ipotesi è che ffmpeg è un po 'troppo per il lavoro, e potrei essere in grado di fare meglio usando le librerie sottostanti o qualcosa del genere ... comunque non ho idea di come farlo.

Idealmente non voglio installare nulla che richieda un vero "processo di installazione" ... cioè, l'inserimento di un eseguibile nella cartella con la mia app web va bene, ma preferirei non dover effettivamente eseguire un programma di installazione. Inoltre, la soluzione dovrebbe essere in grado di girare su mac, linux e windows (sebbene linux sia la priorità assoluta).

Cosa posso fare per accelerare questo processo?

Grazie.

+0

È possibile inserire il processo di generazione di miniature in una coda e consentire all'utente di accedere ad altre cose mentre è generato da un altro script che non è necessario attendere. – GordonM

+0

prova a giocare con ffmpeg c: \ ffmpeg.exe -ic: \ video \ hello.mov - ss 10 - t 4 -f image2 - sameq -vcodec mjpeg img-% 03d.jpg Può essere molto difficile e è possibile ottenere grandi miglioramenti delle prestazioni se si utilizzano solo attributi diversi ... –

+0

@DusanPlavak ['-sameq' non significa" stessa qualità "] (http://superuser.com/a/478550/110524) ed è stato rimosso da ffmpeg. Per l'output jpg usare '-qscale: v' con un intervallo effettivo di 2 (massima qualità) a 31 (qualità minima). – LordNeckbeard

risposta

67

Ovviamente è possibile codificare un po 'di C/C++ e collegare a -lav *, in pratica creando una versione semplificata di ffmpeg solo per estrarre i frame, e magari anche farlo come estensione php (anche io non lo eseguirò come lo stesso utente, figuriamoci nello stesso processo). Ma è molto improbabile che il risultato sia più veloce, perché si eviterà solo un sovraccarico e un sovraccarico di installazione, ma il problema probabile è in realtà la decodifica, che sarebbe comunque la stessa.

Invece, si dovrebbe prima cercare di utilizzare ffmpeg in modalità ricerca rapida (o modalità ibrida veloce/accurata). Their wiki states Io Cerco veloce:

Il parametro -ss deve essere specificato prima -i:

ffmpeg -i -ss 00:03:00 Underworld.Awakening.avi -frames: v 1 out1 .jpg

Questo esempio produrrà una cornice immagine (out1.jpg) da qualche parte intorno allo il terzo minuto dall'inizio del film. L'input sarà analizzato usando i keyframe, che è molto veloce. Lo svantaggio è che lo stesso terminerà la ricerca in alcuni fotogrammi chiave, non necessariamente nello all'ora specificata (00:03:00), quindi la ricerca non sarà accurata come come previsto.

veloce ricerca è meno preciso, ma un sacco dannatamente veloce, come ffmpeg non sarà effettivamente bisogno di decodificare (la maggior parte) del film durante il cercare, mentre la modalità ibrida veloce/preciso è buon compromesso. Leggi the wiki page per tutte le opzioni disponibili.

Edit 14/06/10:

Al FFmpeg 2.1, quando transcodifica con ffmpeg (cioè non flusso copiatura), -ss è ora precisa anche quando usato come opzione ingresso. Il comportamento precedente può essere ripristinato con l'opzione -noaccurate_seek. (source)

Quindi, con 2.1+, "ibrido" in cerca dovrebbe non essere necessaria più per ottenere risultati accurati quando si tratta di ri-codifica (e il salvataggio in .jpeg è una ri-codificare). È sufficiente fare la solita ricerca rapida (-ss ... -i ...) anziché ricerca lenta (-i ... -ss ...).

+1

La differenza nel tempo di esecuzione era di circa 20 minuti (video da 3 GB). Salvato il giorno. – weisjohn

+3

La ricerca rapida sembra funzionare anche per i video remoti, ad es. su http o https. –

+0

Grazie, la versione "Modifica 14/06/10" funziona per me! – matt

Problemi correlati