¿Cómo encontrar fotogramas por segundo de cualquier archivo de video?

44

¿Hay alguna forma simple de encontrar los fps de un video en ubuntu? En Windows utilizo Gspot para encontrar toda la información sobre un archivo de video. Pero en ubuntu me resulta muy difícil encontrar esta información básica. Cualquier ayuda es apreciada.

Vivek
fuente
Esto no es posible, porque no todos los archivos de video tienen un "fps" (porque existe codificación VFR).
fkraiem
Los videos VFR aún tienen una velocidad de fotogramas promedio; si esto es útil o no depende de la aplicación.
thomasrutter

Respuestas:

47

Esto le indicará la velocidad de fotogramas si no es una velocidad de fotogramas variable:

ffmpeg -i nombrearchivo

Salida de muestra con nombre de archivo oculto:

Entrada # 0, matroska, webm, de 'somerandom.mkv':
  Duración: 01: 16: 10.90, inicio: 0.000000, tasa de bits: N / A
    Stream # 0.0: Video: h264 (High), yuv420p, 720x344 [PAR 1: 1 DAR 90:43], 25 fps, 25 tbr, 1k tbn, 50 tbc (predeterminado)
    Secuencia # 0.1: Audio: aac, 48000 Hz, estéreo, s16 (predeterminado)
ffmpeg -i nombre de archivo 2> & 1 | sed -n "s /.*, \ (. * \) fp. * / \ 1 / p"

Alguien editó con uno que no funcionó como yo quería. Se hace referencia aquí
Edición adicional ... Si desea el valor tbr, esta línea sed funciona

sed -n "s /.*, \ (. * \) tbr. * / \ 1 / p"
RobotHumanos
fuente
Necesitaba usar tb en lugar de fp en el one-liner. Parece que no todos los archivos de video informan fps, pero todos registran algo como tbr tbc que tiene el mismo valor.
Sup
válido, pero la línea de la salida de edición editó el valor tbc, no el valor tbr en este conjunto particular de salida. algo a considerar sobre por qué lo cambié ... Prefiero que falle de una manera realmente notable que de una manera que no se nota en absoluto.
RobotHumans
Creo que se sed -n "s/.*, \(.*\) tbr.*/\1/ppierde "al final, ¿no?
Sup
66
ffmpeg no está en desuso, avconv vino de una rama de ffmpeg y para evitar confusiones para aquellos que usan la alternativa ffmpeg, la rama falsa se marcó como en desuso para informar a los usuarios que la versión que estaban usando estaba cambiando. su comentario es engañosa y podría hacer que los usuarios pierden el tiempo investigando este
Chris
1
¿Qué pasa si es velocidad de fotogramas variable?
0xcaff
29
ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate infile

Resultado:

2997/100
Steven Penny
fuente
3
Esta es probablemente la mejor respuesta, ya que da la velocidad de cuadro EXACTA (en el ejemplo 24000/1001 = 23.976023976)
ntg
1
a veces me pongo 0/0dependiendo del formato
Daniel_L
1
Dependiendo de lo que quieras, esto funciona o no. Informa la velocidad de fotogramas de la codificación, pero no la velocidad de fotogramas real del video. Por ejemplo, un video de 30 fps codificado en 60 fps reportará 60 fps pero aún tendrá 30 fps en la salida real.
Harvey
8
Esto no funcionó si la transmisión de video no es la primera transmisión, obtendrá 0/0 si observa una transmisión de audio. Editaré para poner -select_streams V:0, que seleccionará la primera secuencia de video en movimiento.
Sam Watkins el
2
El complemento de @ SamWatkins es importante. Sin ella, el comando da salida 0/0.
jdhao
4

Aquí hay una función de Python basada en la respuesta de Steven Penny usando ffprobe que proporciona la velocidad de fotogramas exacta

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
ntg
fuente
2

La alternativa a la línea de comandos es mirar las propiedades de su archivo a través del menú contextual en Nautilus (administrador de archivos gráfico). Para los archivos de audio / video, obtienes una pestaña adicional allí con información adicional.

user32288
fuente
2

Este es un script de Python para hacer esto usando mplayer, en caso de que alguien esté interesado. Se usa 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
cenar
fuente
0

Puede hacer clic con el botón derecho en el archivo de destino, Propiedades, Audio / Video, pero no obtendrá la velocidad de fotogramas exacta. Para obtener una velocidad de fotogramas precisa, puede instalar MediaInfo.

vladmateinfo
fuente
0

En caso de que alguien tropiece con esto ... por supuesto, puede usar input arg como ruta;)

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)))
WhatAMesh
fuente
0

Normalmente uso exiftoolpara obtener información de cualquier tipo de archivo ... Por ejemplo, con el comando exiftool file.swfpuedo conocer la velocidad de fotogramas de cualquier archivo swf, algo que no puedo lograr conffmpeg

aesede
fuente
-1
ffprobe <media> 2>&1| grep ",* fps" | cut -d "," -f 5 | cut -d " " -f 2
Daya
fuente
1
explicar lo que hará?
rɑːdʒɑ