Ho bisogno di caricare ftp tutti i file mp4 in una directory con lunghezza> 4 minuti usando la shell. Non riesco a trovare alcun copione per controllare quanto dura un video. Qualcuno ha idea di come farlo?
Grazie mille!
Ho bisogno di caricare ftp tutti i file mp4 in una directory con lunghezza> 4 minuti usando la shell. Non riesco a trovare alcun copione per controllare quanto dura un video. Qualcuno ha idea di come farlo?
Grazie mille!
Risposte:
Questo vi darà la lunghezza di un video.
ffmpeg -i myvideo 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//
Mediainfo è uno strumento veloce per questo scopo:
$ mediainfo --Inform="Video;%Duration%" [inputfile]
Puoi trovare più opzioni in una risposta più approfondita .
Nei miei test, ffprobe
impiega 0,3 secondi e mediainfo
impiega 0,09 secondi.
mediainfo --Inform="Video;%Duration/String%" [inputfile]
... che ti darebbe qualcosa di simile 43 min 50s
Puoi provare a usare il comando avconv ..
Innanzitutto è necessario installare:
se digiti il comando con il flag -i, otterrai informazioni sul video:
avconv -i test.mp4
Nell'output c'è un campo chiamato Durata
avconv version 0.8.4-4:0.8.4-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers
built on Nov 6 2012 16:51:33 with gcc 4.6.3
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
Duration: 00:58:28.05, start: 0.000000, bitrate: 888 kb/s
Stream #0.0(eng): Video: h264 (High), yuv420p, 720x404, 748 kb/s, 25 fps, 25 tbr, 20k tbn, 50 tbc
Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 127 kb/s
Ora puoi usare il comando per ottenere solo il valore del campo Durata
Genere:
avconv -i file.mp4 2>&1 | grep 'Duration' | awk '{print $2}' | sed s/,//
Nel mio caso il risultato è:
00:58:28.05
58 minuti e 28,05 secondi.
Spero che questo sia utile!
avprobe
- non è necessario per -i
, ma altrimenti funziona esattamente allo stesso modo. O ffprobe
per la risposta di @ per.
exiftool
(originariamente destinato alla lettura dei metadati della fotocamera da file di immagini, ma successivamente espanso per leggere e scrivere metadati da quasi tutti i tipi di file multimediali) è molto comodo da usare per questo. Eseguilo con:
exiftool FILE.mp4 | grep Duration
Probabilmente dovrai exiftool
prima installare , ma questo è facilmente eseguibile con il seguente comando (su Debian e derivati come Ubuntu ecc.):
apt install libimage-exiftool-perl
Naturalmente, questa risposta è solo un'altra alternativa. Molte delle altre risposte sono buone. :)
Ancora più semplice:
avprobe file.mp4 -show_format_entry duration
Aggiungendo alla soluzione pers , questo può essere usato su un'intera directory:
for f in *; do ffmpeg -i "$f" 2>&1 | grep Duration | cut -d " " -f 4 | sed s/,// | tr -d "\n" && echo " $f"; done
può anche essere esteso | sort
per avere i file ordinati in base alla loro lunghezza.
puoi aggiungerlo a .bashrc
o .bash_aliases
per poterlo fare lsvlength | sort
su una directory
alias lsvlength='for f in *; do ffmpeg -i "$f" 2>&1 | grep Duration | cut -d " " -f 4 | sed s/,// | tr -d "\n" && echo " $f"; done'
ffprobe
è una soluzione più elegante della ffmpeg
quale genera un errore se non viene indicato il percorso di output.
ffprobe video.mp4 2>&1 | grep -E '^ +Duration' | cut -d':' -f2- | cut -d, -f1
Se vuoi vedere la durata di alcuni video in una directory, puoi usare il seguente comando
exiftool * | grep ^ Durata | cut -d '' -f 26
grep
e così via. Semplicemente exiftool -T -Duration *.mkv
(o qualunque modello di file)
Come puoi vedere, ci sono molti modi per farlo.
ffprobe mediafile -show_entries format=format=duration 2>&1 | grep DURATION
dove mediafile è il nome del file, fornirà un output simile al seguente. Il primo è la durata del primo flusso (in genere video) e il secondo fornisce la durata del secondo flusso (in genere audio)
DURATION : 00:21:40.132000000
DURATION : 00:21:40.062000000