Como verificar por quanto tempo um vídeo (mp4) está usando o shell?

16

Eu preciso carregar ftp todos os arquivos mp4 em um diretório com duração> 4 minutos usando o shell. Não consigo encontrar nenhum script para verificar a duração de um vídeo. Alguém tem alguma idéia de como fazer isso?

Muito obrigado!

Thomas
fonte
11
ver este stackoverflow.com/questions/3844430/... :-) espero que isso ajude
harish.venkat

Respostas:

23

Isso fornecerá a duração de um vídeo.

ffmpeg -i myvideo 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//
por
fonte
Também funciona para URLs de vídeo remotos, por exemplo, ffmpeg -i " instagram.fewr1-1.fna.fbcdn.net/t50.2886-16/… " 2> & 1 | Duração grep | cut -d '' -f 4 | s sed /, //
skidadon
O formato das mensagens de log do FFmpeg é garantido? Caso contrário, não gosto muito - isso poderia parar de funcionar com qualquer versão.
Ondra Žižka
7

Mediainfo é uma ferramenta rápida para este fim:

$ mediainfo --Inform="Video;%Duration%"  [inputfile]

Você pode encontrar mais opções em uma resposta mais completa .

Nos meus testes, ffprobedemora 0,3 segundos e mediainfo0,09 segundos.

qubodup
fonte
Isso dá resultados estranhos ... como 2679600 ... melhor usar mediainfo --Inform="Video;%Duration/String%" [inputfile]... o que lhe daria algo como 43 min 50s
Robert Riedl
5

Você pode tentar usar o comando avconv ..

Primeiro você deve instalar:

Instale através do centro de software

se você digitar o comando com a bandeira -i, obterá informações sobre o vídeo:

avconv -i test.mp4

Na saída, há um campo chamado Duração

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

Agora você pode usar o comando para obter apenas o valor do campo Duration

Tipo:

avconv -i file.mp4 2>&1 | grep 'Duration' | awk '{print $2}' | sed s/,//

No meu caso, o resultado é:

00:58:28.05

58 minutos e 28,05 segundos.

Espero que isso seja útil!

Roman Raguet
fonte
11
Isso também pode ser usado com avprobe- sem necessidade de -i, mas, caso contrário, funciona exatamente da mesma maneira. Ou ffprobepara a resposta de @ per.
evilsoup
4

exiftool(originalmente destinado à leitura de metadados da câmera a partir de arquivos de imagem, mas posteriormente expandido para ler e gravar metadados a partir de quase qualquer tipo de arquivo de mídia) é muito conveniente de usar. Execute-o com:

exiftool FILE.mp4 | grep Duration

Você provavelmente precisará instalar exiftoolprimeiro, mas isso é feito facilmente com o seguinte comando (no Debian e derivados como Ubuntu etc.):

apt install libimage-exiftool-perl

Obviamente, essa resposta é apenas outra alternativa. Muitas das outras respostas também são boas. :)

zrajm
fonte
2

Ainda mais simples:

avprobe file.mp4 -show_format_entry duration
Joan Albert Silvestre
fonte
Atualmente, recebo a mensagem "A opção 'show_format_entry' está obsoleta. Em vez disso, use '-show_entries format = duration'"
Faheem Mitha
1

Adicionando à solução pers , isso pode ser usado em um diretório inteiro:

for f in *; do ffmpeg -i "$f" 2>&1 | grep Duration | cut -d " " -f 4 | sed s/,//  | tr -d "\n" && echo " $f"; done

pode até ser estendido | sortpara que os arquivos sejam classificados por seu comprimento.

você pode adicionar isso .bashrcou .bash_aliasesfazer isso lsvlength | sortem um diretório

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'
mcnesio
fonte
1

ffprobeé uma solução mais elegante do ffmpegque gera um erro se não for fornecido o caminho de saída.

ffprobe video.mp4 2>&1 | grep -E '^ +Duration' | cut -d':' -f2- | cut -d, -f1
Ondra Žižka
fonte
0

Se você quiser ver a duração de alguns vídeos em um diretório, use o seguinte comando

exiftool * | grep ^ Duração | cut -d '' -f 26

meisamhakimi
fonte
11
Não há necessidade de usar grepe tal. Simplesmente exiftool -T -Duration *.mkv(ou qualquer padrão de arquivo)
PerlDuck
0

Como você pode ver, existem várias maneiras de conseguir isso. ffprobe mediafile -show_entries format=format=duration 2>&1 | grep DURATIONonde mediafile é o nome do arquivo, fornecerá uma saída semelhante à abaixo. O primeiro é a duração do primeiro fluxo (normalmente vídeo) e o segundo fornece a duração do segundo fluxo (normalmente áudio)

  DURATION        : 00:21:40.132000000
  DURATION        : 00:21:40.062000000
Elder Geek
fonte