Como encontrar quadros por segundo de qualquer arquivo de vídeo?


44

Existe alguma maneira simples de encontrar os fps de um vídeo no ubuntu? No Windows, eu uso o Gspot para descobrir todas as informações sobre um arquivo de vídeo. Mas no ubuntu, acho muito difícil descobrir essas informações básicas. Qualquer ajuda é apreciada.


Isso não é possível, porque nem todos os arquivos de vídeo têm "fps" (porque a codificação VFR existe).
fkraiem

Os vídeos VFR ainda têm uma taxa de quadros média - se isso é útil ou não, depende do aplicativo.
thomasrutter

Respostas:


47

Isso informará a taxa de quadros se não for variável:

nome do arquivo ffmpeg -i

Exemplo de saída com nome de arquivo obscurecido:

Entrada # 0, matroska, webm, de 'somerandom.mkv':
  Duração: 01: 16: 10.90, início: 0.000000, taxa de bits: N / A
    Stream nº 0.0: Vídeo: h264 (Alto), yuv420p, 720x344 [PAR 1: 1 DAR 90:43], 25 qps, 25 tbr, 1k tbn, 50 tbc (padrão)
    Stream # 0.1: Áudio: aac, 48000 Hz, estéreo, s16 (padrão)
ffmpeg -i nome do arquivo 2> & 1 | sed -n "s /.*, \ (. * \) fp. * / \ 1 / p"

Alguém editou com um que não funcionou exatamente como eu queria. É referenciada aqui
Edição adicional ... Se você quiser o valor tbr, esta linha sed funciona

sed -n "s /.*, \ (. * \) tbr. * / \ 1 / p"

Eu precisava usar tb em vez de fp no one-liner. Parece que nem todos os arquivos de vídeo reportam fps, mas todos carregam algo como tbr tbc, que tem o mesmo valor.
sup

válido, mas o one-liner da edição gerou o valor tbc e não o valor tbr nesse conjunto específico de saída. algo a considerar por que eu mudei ... Prefiro falhar de uma maneira realmente perceptível do que de uma maneira que não é notada.
RobotHumans

Eu acho que sed -n "s/.*, \(.*\) tbr.*/\1/pfalta "no final, não?
sup

6
O ffmpeg não está obsoleto, o avconv veio de um ramo do ffmpeg e, para evitar confusão entre os usuários da alternativa ffmpeg, o ramo falso foi marcado como obsoleto para informar aos usuários que a versão que estavam usando estava mudando. seu comentário é enganosa e pode causar aos usuários de perder tempo pesquisando esse
Chris

1
E se for uma taxa de quadros variável?
0xcaff

29
ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate infile

Resultado:

2997/100

3
Essa é provavelmente a melhor resposta, pois fornece a taxa de quadros EXATA (no exemplo 24000/1001 = 23.976023976)
ntg 20/01/16

1
às vezes eu recebo 0/0dependendo do formato #
1147 Daniel_L

1
Dependendo do que você deseja, isso funciona ou não. Ele relata a taxa de quadros da codificação, mas não a taxa de quadros real do vídeo. Por exemplo, um vídeo de 30fps codificado em 60fps reportará 60fps, mas ainda terá 30fps na saída real.
Harvey

8
Isso não funcionou se o fluxo de vídeo não for o primeiro, você receberá 0/0 se observar um fluxo de áudio. Vou editar para colocar -select_streams V:0, que selecionará o primeiro fluxo de vídeo em movimento.
Sam Watkins

2
O complemento de @ SamWatkins é importante. Sem ele, o comando deu saída 0/0.
Jdhao 06/0618

4

Aqui está uma função python baseada na resposta de Steven Penny usando ffprobe que fornece a taxa de quadros exata

ffprobe 'Upstream Color 2013 1080p x264.mkv' -v 0 -select_streams v -print_format flat -show_entries stream=r_frame_rate
import sys
import os
import subprocess
def get_frame_rate(filename):
    if not os.path.exists(filename):
        sys.stderr.write("ERROR: filename %r was not found!" % (filename,))
        return -1         
    out = subprocess.check_output(["ffprobe",filename,"-v","0","-select_streams","v","-print_format","flat","-show_entries","stream=r_frame_rate"])
    rate = out.split('=')[1].strip()[1:-1].split('/')
    if len(rate)==1:
        return float(rate[0])
    if len(rate)==2:
        return float(rate[0])/float(rate[1])
    return -1

2

A alternativa à linha de comando é examinar as propriedades do seu arquivo através do menu de contexto do Nautilus (gerenciador de arquivos gráficos). Para arquivos de áudio / vídeo, você recebe uma guia adicional com informações extras.


2

Este é um script python para fazer isso usando o mplayer, caso alguém esteja interessado. É usado path/to/script path/to/movie_name1 path/to/movie/name2etc

#!/usr/bin/python
# -*- coding: utf-8 -*-

import subprocess
import re
import sys

pattern = re.compile(r'(\d{2}.\d{3}) fps')
for moviePath in sys.argv[1:]:
    mplayerOutput = subprocess.Popen(("mplayer", "-identify", "-frames", "0", "o-ao", "null", moviePath), stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
    fps = pattern.search(mplayerOutput).groups()[0]
    print fps

0

Você pode clicar com o botão direito do mouse no arquivo de destino, Propriedades, Áudio / Vídeo, mas não obterá a taxa de quadros exata. Para obter uma taxa de quadros precisa, você pode instalar o MediaInfo.


0

Apenas no caso de alguém tropeçar nisso ... é claro que você pode usar arg de entrada como o caminho;)

import numpy as np
import os
import subprocess

def getFramerate():
    con = "ffprobe -v error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=noprint_wrappers=1:nokey=1 D:\\Uni\\Seminar\\leecher\\Ninja\\stream1.mp4"

    proc = subprocess.Popen(con, stdout=subprocess.PIPE, shell=True)
    framerateString = str(proc.stdout.read())[2:-5]
    a = int(framerateString.split('/')[0])
    b = int(framerateString.split('/')[1])
    return int(np.round(np.divide(a,b)))

0

Eu costumo usar exiftoolpara obter informações de qualquer tipo de arquivo ... Por exemplo, com o comando exiftool file.swfeu posso conhecer a taxa de quadros de qualquer arquivo swf, algo que não consigo comffmpeg


-1
ffprobe <media> 2>&1| grep ",* fps" | cut -d "," -f 5 | cut -d " " -f 2

1
explicar o que vai fazer?
rɑːdʒɑ
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.