Como obter a duração do vídeo em segundos?

50

Como posso obter a duração do vídeo em segundos?

O que eu tentei:

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

Isso que perto, mas não é tão preciso, 2383 é 39,71 minutos

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
    
por user2783132 25.09.2013 / 21:35

8 respostas

25

Para obter minutos, você tem que dividir 2383 segundos por 60.

39.7167

e, em seguida, multiplique a parte fracionária .7167 por 60 para obter os segundos restantes.

43.002

São 39 minutos e 43 segundos. O aplicativo parece estar dando a você um valor preciso.

    
por 25.09.2013 / 21:41
70

Use apenas ffprobe diretamente. Não há necessidade de sed , grep , etc. Existem várias "durações" que você pode adquirir (dependendo da sua entrada).

Duração do formato (contêiner)

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

30.024000

Adicionar a opção -sexagesimal usará o formato de unidade de tempo HOURS: MM: SS.MICROSECONDS:

0:00:30.024000

Duração do fluxo de vídeo

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

Os comandos acima são de Wiki do FFmpeg: Dicas do FFprobe .

com ffmpeg

Você pode precisar decodificar completamente a entrada se achar que a duração do contêiner ou do fluxo está ausente ou imprecisa (possivelmente devido a um arquivo danificado ou truncado).

$ 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

Neste exemplo, time=00:01:03.48 é a duração:

O tempo que isso levará dependerá, é claro, da complexidade e duração da decodificação de sua entrada e das capacidades do seu computador.

    
por 27.07.2015 / 00:07
30

Se você tiver ffmpeg , também deverá ter ffprobe :

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

Isso também dará frações de segundos, se isso for um problema, você pode processar isso com sed.

    
por 25.09.2013 / 23:10
3

Solução com o mplayer que dá segundos diretamente:

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

Para o meu ffmpeg-0.6.5-1.el6.rf.x86_64, para obter apenas o segundo, o formato do comando ffprobe é:

ffprobe <file> -show_format 2>&1 | sed -n 's/duration=//p' 
    
por 17.06.2014 / 00:06
0
mediainfo --Output='General;%Duration%' file.flv

Isso produz a duração em milissegundos como um valor inteiro único. Não há necessidade de grep / cut / sed /...

    
por 05.05.2018 / 10:00
0

Eu me deparei com a questão de obter alguns metadados estranhos e incorretos de alguns arquivos de vídeo que eu estava trabalhando e não consegui encontrar um padrão ou qualquer tipo de manipulação usando código e ferramentas como ffmpeg, mp4box, ffprobe, mediainfo , mplayer, para obter a duração real do vídeo.

Identificar a duração real do vídeo era um requisito para um projeto em que eu estava trabalhando e a única maneira que encontrei para acertar o vídeo foi usando o ffmpeg e forçando os arquivos codificados a ignorar os metadados do arquivo original, como:

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

(Isso pode ser mais rápido do que você esperava. Fiquei surpreso, pelo tipo de conteúdo e pelo ambiente que eu estava usando, o tempo médio foi de 2 segundos)

... e, em seguida, obtenha a duração usando uma ferramenta à sua escolha. Eu gosto mediainfo, btw: - "mediainfo FILE --Inform=" Vídeo;% Duration% "lhe dá duração em milissegundos.

    
por 01.06.2017 / 03:01
-6

Se você deseja uma duração PRECISA, esqueça o FFmpeg. Ele apenas fornece uma estimativa com base na taxa de bits média e no tamanho do arquivo. Eu encontrei, em alguns casos, o tempo de duração estimado em 2x!

No Linux, se o arquivo for criado e modificado apenas durante a gravação do vídeo, uma solução alternativa seria usar a criação e a hora da última modificação para calcular a duração, como em:

stat -c "%X %Y" video.mpg | awk '{print $2 - $1}'
    
por 27.04.2015 / 03:59