Come ottenere la durata del video in secondi?


70

Come posso ottenere la durata del video in secondi?

Cosa ho provato:

ffmpeg -i file.flv 2>&1 | grep "Duration"
  Duration: 00:39:43.08, start: 0.040000, bitrate: 386 kb/s


mediainfo file.flv | grep Duration
Duration : 39mn 43s

Questo che cosa vicino, ma non è così preciso, 2383 è di 39,71 minuti

ffmpeg -i file.flv 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,// | sed 's@\..*@@g' | awk '{ split($1, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }'
2383

Risposte:


36

Per ottenere minuti, devi dividere 2383 secondi per 60.

39.7167

e quindi moltiplicare la parte frazionaria .7167 per 60 per ottenere i secondi rimanenti.

43.002

Quindi sono 39 minuti, 43 secondi. L'applicazione sembra darti un valore preciso.


97

Basta usare ffprobedirettamente. Non c'è bisogno di sed, grepecc ci sono diversi "durate" è possibile acquistare (a seconda del vostro ingresso).

Durata del formato (contenitore)

$ ffprobe -v error -show_entries format=duration \
  -of default=noprint_wrappers=1:nokey=1 input.mp4

30.024000

L'aggiunta -sexagesimaldell'opzione utilizzerà il formato ORA: MM: SS.MICROSECONDS:

0:00:30.024000

Durata del flusso video

$ ffprobe -v error -select_streams v:0 -show_entries stream=duration \
  -of default=noprint_wrappers=1:nokey=1 input.mp4
30.000000

I comandi di cui sopra provengono dal Wiki FFmpeg: Suggerimenti FFprobe .

Con ffmpeg

Potrebbe essere necessario decodificare completamente l'input se il contenitore o la durata del flusso risultano mancanti o imprecisi (probabilmente a causa di un file danneggiato o troncato).

$ ffmpeg -i input.mp4 -f null -
  …
  frame= 1587 fps=0.0 q=0.0 Lsize=N/A time=00:01:03.48 bitrate=N/A

In questo esempio time=00:01:03.48è la durata:

Il tempo che dipenderà ovviamente dipenderà dalla complessità della decodifica e dalla durata dell'input e dalle capacità del computer.


Questi non funzionano per i file .m2v hai una soluzione anche per loro
utdev

@utdev Vedi la ffmpegsezione "Con ".
Llogan,

La tua terza soluzione mi dà un momento sbagliato, il mio video ha una durata di 01:19:00 ma il comando mi restituisce time = 01: 09: 15.32, hai indovinato perché questo sta accadendo
utdev

Molto utile la durata del flusso multimediale. Grazie.
Siamo Borg il

Per chiunque utilizzi avprobe, i parametri sono leggermente diversi: avprobe -v errore -show_format_entry durata. \ Sample.mp4
Brad

33

Se hai ffmpeg, dovresti anche avere ffprobe:

ffprobe -i input.file -show_format | grep duration
ffprobe -i input.file -show_format -v quiet | sed -n 's/duration=//p'

Ciò fornirà anche frazioni di secondi, se questo è un problema è possibile elaborarlo ulteriormente con sed.


come posso rimuovere la frazione di secondi?
Tina J,

@TinaJ Basta collegarlo con printf, come | xargs printf %.0f- questo restituirà un valore intero.
Ilia Rostovtsev,

3

Per il mio ffmpeg-0.6.5-1.el6.rf.x86_64, per ottenere solo il secondo, il formato del comando ffprobe è:

ffprobe <file> -show_format 2>&1 | sed -n 's/duration=//p' 

come posso rimuovere la frazione di secondi?
Tina J,

3

Soluzione con mplayer che fornisce direttamente i secondi:

mplayer -identify -frames 0 -vo null -nosound file.flv 2>&1 | awk -F= '/LENGTH/{print $2}'

2
mediainfo --Output='General;%Duration%' file.flv

Ciò genera la durata in millisecondi come un singolo valore intero. Non è necessario grep / cut / sed / ...


Grazie - questo era proprio quello che stavo cercando. Può essere installato su MacOS conbrew install mediainfo
Alex K il

0

Mi sono imbattuto nel problema di ottenere alcuni metadati strani e errati da alcuni file video con cui stavo lavorando e non sono riuscito a trovare un modello o qualsiasi tipo di gestione usando codice e strumenti come ffmpeg, mp4box, ffprobe, mediainfo, mplayer, per ottenere la durata reale del video.

Identificare la durata reale del video era un requisito per un progetto su cui stavo lavorando e l'unico modo per trovare il giusto risultato era ricodificare il file video usando ffmpeg e forzare i file codificati per ignorare i metadati del file originale, come:

ffmpeg -i INPUT_FILENAME -acodec copy -vcodec copy -map_metadata -1 OUTPUT_FILENAME"

(Potrebbe funzionare più velocemente di quanto ti aspetti. Sono rimasto sorpreso, per il tipo di contenuto e per l'ambiente che stavo usando, il tempo medio era di 2 secondi)

... e poi ottieni la durata usando uno strumento a tua scelta. Mi piace mediainfo, a proposito: - "mediainfo FILE --Inform =" Video;% Duration% "ti dà la durata in millisecondi.


Non hai fornito più informazioni o soluzioni migliori di altre risposte
Sam

0

Se devi solo eseguire una query sui metadati:

ffprobe -hide_banner -v quiet -show_streams -print_format flat video.mp4

[...]

streams.stream.0.duration="5221.146009"

[...]

Quindi puoi analizzarlo:

while read -r; do
  if [[ "$REPLY" =~ ^streams\.stream\.([0-9])+\.duration=\"([^"]+)\"$ ]]; then
    echo -E Duration of stream "${BASH_REMATCH[1]}": "${BASH_REMATCH[2]}"
  fi
done < <(ffprobe -hide_banner -v quiet -show_streams -print_format flat video.mp4)

Ma se si desidera ottenere la durata effettiva del contenitore, è necessario decodificarlo:

AV_LOG_FORCE_NOCOLOR=y ffmpeg -nostdin -hide_banner -nostats -loglevel info -i video.mp4 -f null -c copy - 2>&1 | tail -n 2

Ci vorrà del tempo CPU per decodificarlo, fino a quando:

[...]

frame=130527 fps=53271 q=-1.0 Lsize=N/A time=01:27:01.12 bitrate=N/A speed=2.13e+03x
video:152014kB audio:40790kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

Quindi, puoi analizzarlo:

if [[ "$(AV_LOG_FORCE_NOCOLOR=y ffmpeg -nostdin -hide_banner -nostats -loglevel info -i video.mp4 -f null -c copy - 2>&1 | tail -n 2 | head -n 1)" =~ \ time=([0-9]+):([0-9]{2}):([0-9]{2})\.([0-9]+) ]]; then
  declare duration=0 us="${BASH_REMATCH[4]}" t
  for t in "${BASH_REMATCH[@]:1:3}"; do
    ((duration *= 60))
    ((duration += ${t#0} ))
  done
  while [ ${#us} -lt 6 ]; do us+=0; done
  ((us >= 500000)) && ((duration++))
  ((duration)) || ((duration++))
fi
echo -E Duration: "$duration"

-6

Se vuoi una durata ACCURATA, dimentica FFmpeg. Fornisce solo una stima basata su dimensione del file e bitrate medio. Ho trovato, in alcuni casi, la durata stimata del doppio di 2x!

Su Linux, se il file viene creato e modificato solo durante la suddetta registrazione video, una soluzione alternativa sarebbe quella di utilizzare il tempo di creazione e ultima modifica per calcolare la durata, come in:

stat -c "%X %Y" video.mpg | awk '{print $2 - $1}'

5
Dove hai trovato che ffmpeg non è preciso?
aleb,

4
% X è l'ora dell'ultimo accesso. % Y è il tempo dall'ultima modifica. Questo non dice nulla sulla lunghezza del video.
Joe Hillenbrand,

1
Questo sembra essere un troll
George Chalhoub l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.