Come trovare fotogrammi al secondo di qualsiasi file video?


44

Esiste un modo semplice per trovare gli fps di un video in Ubuntu? In Windows uso Gspot per scoprire tutte le informazioni su un file video. Ma in Ubuntu trovo molto difficile scoprire queste informazioni di base. Qualsiasi aiuto è apprezzato.


Questo non è possibile, perché non tutti i file video hanno un "fps" (perché esiste la codifica VFR).
fkraiem,

I video VFR hanno ancora un frame rate medio - se questo è utile dipende dall'applicazione.
thomasrutter,

Risposte:


47

Questo ti dirà il framerate se non è framerate variabile:

ffmpeg -i nomefile

Output di esempio con nome file oscurato:

Input # 0, matroska, webm, da 'somerandom.mkv':
  Durata: 01: 16: 10.90, inizio: 0.000000, bitrate: N / A
    Stream # 0.0: Video: h264 (High), yuv420p, 720x344 [PAR 1: 1 DAR 90:43], 25 fps, 25 tbr, 1k tbn, 50 tbc (impostazione predefinita)
    Stream # 0.1: Audio: aac, 48000 Hz, stereo, s16 (impostazione predefinita)
ffmpeg -i nome file 2> & 1 | sed -n "s /.*, \ (. * \) fp. * / \ 1 / p"

Qualcuno ha modificato con uno che non ha funzionato come volevo. Fa riferimento qui
Modifica aggiuntiva ... Se vuoi il valore tbr questa linea sed funziona

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

Avevo bisogno di usare tb invece di fp nel one-liner. Sembra che non tutti i file video riportino fps ma tutti trasmettono automaticamente qualcosa come tbr tbc che ha lo stesso valore.
sup

valido, ma il one-liner dell'output di modifica ha modificato il valore tbc non il valore tbr in questo particolare set di output. qualcosa da considerare sul perché l'ho cambiato ... Preferisco che fallisca in un modo davvero evidente piuttosto che in un modo che non si nota affatto.
RobotHumans,

Penso che sed -n "s/.*, \(.*\) tbr.*/\1/pmanchi "alla fine, no?
sup

6
ffmpeg non è deprecato, avconv proviene da un ramo di ffmpeg e per evitare confusione per coloro che usano l'alternativa ffmpeg il ramo falso è stato contrassegnato come deprecato per far sapere agli utenti che la versione che stavano usando stava cambiando. il tuo commento è fuorviante e potrebbe far perdere tempo agli utenti nella ricerca di questo
Chris

1
Cosa succede se si tratta di frame rate variabile?
0xcaff,

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

Risultato:

2997/100

3
Questa è probabilmente la risposta migliore in quanto fornisce il frame rate EXACT (nell'esempio 24000/1001 = 23.976023976)
ntg

1
a volte ottengo a 0/0seconda del formato
Daniel_L

1
A seconda di ciò che vuoi, funziona o no. Riporta il framerate della codifica, ma non il framerate effettivo del video. Ad esempio, un video a 30 fps codificato in 60 fps segnalerà 60 fps ma sarà comunque 30 fps nell'output effettivo.
Harvey,

8
Questo non ha funzionato se il flusso video non è il primo flusso, otterrai 0/0 se guarda un flusso audio. Modificherò per mettere -select_streams V:0, che selezionerà il primo flusso video in movimento.
Sam Watkins,

2
@ Il complemento di SamWatkins è importante. Senza di essa, il comando ha dato un output 0/0.
jdhao,

4

Ecco una funzione Python basata sulla risposta di Steven Penny che utilizza ffprobe che fornisce un frame rate esatto

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

L'alternativa alla riga di comando è esaminare le proprietà del file tramite il menu di scelta rapida in Nautilus (file manager grafico). Per i file audio / video è disponibile una scheda aggiuntiva con informazioni aggiuntive.


2

Questo è uno script Python per farlo usando mplayer, nel caso qualcuno fosse interessato. Si usa path/to/script path/to/movie_name1 path/to/movie/name2ecc

#!/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

È possibile fare clic con il pulsante destro del mouse sul file di destinazione, Proprietà, Audio / Video ma non si otterrà il framerate esatto. Per ottenere un framerate preciso è possibile installare MediaInfo.


0

Nel caso in cui qualcuno si imbatti in questo ... puoi ovviamente usare input arg come percorso;)

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

Di solito lo uso exiftoolper ottenere informazioni di qualsiasi tipo di file ... Ad esempio con il comando exiftool file.swfposso conoscere il framerate di qualsiasi file SWF, cosa che non riesco a ottenere conffmpeg


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

1
spiegare cosa farà?
rʒɑdʒɑ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.