Como obtenho o número de quadros em um vídeo na linha de comando do linux?

27

Eu tenho um arquivo de vídeo e quero obter o número de quadros de vídeo que estão nele. Posso usar ffmpeg para obter a duração do vídeo e o FPS. No entanto, não vejo nada óbvio para o número total de frames.

Em teoria, um deve ser capaz de multiplicar o comprimento (em segundos) pelo FPS para obter o número de quadros, mas neste caso o comprimento (34,43 segundos) e a taxa de quadros (29,97 fps) dão um não-inteiro, o que me faz pensar que estou fazendo algo errado.

Eu preciso ser capaz de fazer isso na linha de comando de uma maneira totalmente automatizada e não-gráfica. Eu também preciso que isso seja bem exato, e não uma estimativa (se é que isso é possível com arquivos de vídeo)

Eu tentei usar tcprobe em alguns arquivos. Para alguns arquivos AVI funciona, mas para alguns arquivos VOB, a saída tcprobe não tem o número de quadros. Eu recebo esta saída:

[tcprobe] MPEG program stream (PS)
[tcprobe] summary for myfile.vob, (*) = not default, 0 = not detected
import frame size: -g 720x480 [720x576] (*)
     aspect ratio: 4:3 (*)
       frame rate: -f 29.970 [25.000] frc=4 (*)
                   PTS=2199.3972, frame_time=33ms bitrate=7000 kbps
      audio track: -a 0 [0] -e 48000,16,5 [48000,16,2] -n 0x2000 [0x2000] (*)
                   PTS=2199.2763, bitrate=192 kbps
                   -D 3 --av_fine_ms 20 (frames & ms) [0] [0]
    
por Rory 17.12.2009 / 17:17

11 respostas

13

Isso é horrível, estúpido e lento, mas parece funcionar:

ffmpeg -i foo.avi -vcodec copy -f rawvideo -y /dev/null 2>&1 | tr ^M '\n' | awk '/^frame=/ {print $2}'|tail -n 1

Ele também funcionará em arquivos truncados e fluxos brutos (é por isso que você não obtém nada para arquivos .vob)

    
por 01.01.2010 / 18:04
29

ffprobe pode ser usado para obter informações sobre um arquivo de mídia:

ffprobe -select_streams v -show_streams input.avi

Você receberá detalhes sobre o fluxo:

nb_frames=159697

Procure nb_frames com grep :

ffprobe -select_streams v -show_streams input.avi 2>/dev/null | grep nb_frames | sed -e 's/nb_frames=//'

Isso funciona para avi, mp4 e etc Para alguns contêineres, ele não mostra um valor válido, MPEG.

Nesse caso, isso funciona ffprobe -show_packets a.mpg 2>/dev/null | grep video | wc -l

    
por 13.06.2014 / 16:22
15

Eu postei isso em outro pergunta . Usando a ferramenta tcprobe (do pacote transcode ), o número de quadros é incluído na informação. Use a opção -i para obter um despejo de informações do arquivo:

$ tcprobe -i foo.avi
[tcprobe] RIFF data, AVI video
[avilib] V: 29.970 fps, codec=XVID, frames=38630, width=512, height=384
[avilib] A: 48000 Hz, format=0x55, bits=16, channels=2, bitrate=128 kbps,
[avilib]    53707 chunks, 21768720 bytes, VBR
[tcprobe] summary for foo.avi, (*) = not default, 0 = not detected
import frame size: -g 512x384 [720x576] (*)
       frame rate: -f 29.970 [25.000] frc=4 (*)
      audio track: -a 0 [0] -e 48000,16,2 [48000,16,2] -n 0x55 [0x2000] (*)
                   bitrate=128 kbps
           length: 38630 frames, frame_time=33 msec, duration=0:21:28.954

Observe que o número de quadros é dado em duas linhas aqui (2ª linha de saída e última linha de saída).

    
por 17.12.2009 / 18:28
6

Descobri que mediainfo --fullscan inputfile | grep "Frame count" funciona muito bem para a maioria dos arquivos.

Sistemas baseados em Debian podem instalá-lo com apt-get install mediainfo

Se você obtiver 2 linhas em vez de uma de saída, a primeira linha será a trilha de vídeo e a segunda linha será a faixa de áudio. Parece que isso ocorre em arquivos com áudio de taxa de bits variável.

Testado em amostras de .mkv, .m4v, .mp4, flv, vob e .avi a partir da data de edição.

Fontes: Como recuperar arquivo de vídeo informações da linha de comando no Linux e testando em versões do Ubuntu.

    
por 24.02.2016 / 14:01
3

ffprobe -select_streams v -show_frames -count_frames INPUT_FILE | grep pkt_duration_time=

Adicione a duração. Poderia ser mais extravagante com sed / awk e quais não.

A partir dos nossos testes, posso dizer que, por agora, demonstrou ser o mais fiável. Você obtém um número de quadros preciso e a duração exata. Mesmo com taxa de quadros variável, todas as outras ferramentas, como mediainfo, parecem ir malucas.

    
por 26.11.2014 / 15:36
2

Descobri que o número de quadros é na verdade o dobro da duração de fps * (não sei por que, eu ficaria feliz em saber).

Em um script meu, eu tenho:

# Get duration and fps
duration=$($FFMPEG -i $input 2>&1 | sed -n "s/.* Duration: \([^,]*\), start: .*//p")
fps=$($FFMPEG -i $input 2>&1 | sed -n "s/.*, \(.*\) tb.*//p")

hours=$(echo $duration | cut -d":" -f1)
minutes=$(echo $duration | cut -d":" -f2)
seconds=$(echo $duration | cut -d":" -f3)
# For some reason, we have to multiply by two (no idea why...)
# Get the integer part with cut
frames=$(echo "($hours*3600+$minutes*60+$seconds)*$fps*2" | bc | cut -d"." -f1)

E sim, por alguma razão eu tenho que pegar a parte inteira dela. Não faz sentido, mas este script sempre conseguiu converter meus vídeos corretamente até o momento.

    
por 17.12.2009 / 17:33
2

Testado no Ubuntu.

melt icecap.mp4 -consumer xml
  • melt - o melt foi criado como uma ferramenta de teste para o framework MLT, mas também é um poderoso editor de vídeo orientado por linha de comando multitrack. Ele também pode ser usado como um media player minimalista para arquivos de áudio e vídeo.

  • -consumer id [: arg] [nome = valor] *
              Definir o consumidor (sumidouro)

  • xml - Defina o consumidor (coletor) como saída formatada em xml

  • <property name="length">nnnn</property> - mostra o número de quadros, em que nnnn é substituído por um número inteiro que é igual ao número de quadros

Se você não tiver o melt, você pode instalá-lo no Ubuntu e em outros sistemas baseados no Debian com sudo apt-get install melt

    
por 03.12.2015 / 19:46
0

Você pode fazer isso adicionando e multiplicando os valores obtidos do ffprobe.

Nota: o ffprobe faz parte da libav (avconv) - a versão linux do ffmpeg.

#your command -
 ffprobe man.avi

Quando você fizer isso, obterá o número de quadros por segundo e também a duração do clipe.

Converta a duração do clipe em segundos e multiplique esse valor pelo número de quadros / segundo.

Lembre-se de arredondar o número para o número mais próximo.

    
por 17.06.2013 / 21:12
0

Isso lhe dá um valor específico sem ter que analisar a resposta da string de saída:

$ mediainfo --Inform = 'Vídeo;% FrameRate% \ n' VTS_07_4.VOB

23.976

    
por 04.08.2017 / 12:50
0

Diretamente com mediainfo , sem grep, sem espera, sem nada:

mediainfo --Inform='Video;%FrameCount%' $the_file

Para outras informações, consulte mediainfo --info-parameters

    
por 04.08.2017 / 13:08
0

linux

ffmpeg -i "/home/iorigins/Завантаження/123.mov" -f null /dev/null

rubi

result = 'ffmpeg -i #{path} -f null - 2>&1'
r = result.match("frame=([0-9]+)")
p r[1]
    
por 19.06.2018 / 19:06