Wie finde ich Bilder pro Sekunde in einer Videodatei?

44

Gibt es eine einfache Möglichkeit, die fps eines Videos in Ubuntu zu finden? In Windows verwende ich Gspot, um alle Informationen zu einer Videodatei herauszufinden. Aber in Ubuntu finde ich es sehr schwierig, diese grundlegenden Informationen herauszufinden. Jede Hilfe wird geschätzt.

Vivek
quelle
Dies ist nicht möglich, da nicht alle Videodateien ein "fps" haben (da eine VFR-Codierung vorhanden ist).
Fkraiem
VFR-Videos haben immer noch eine durchschnittliche Bildrate - ob dies sinnvoll ist oder nicht, hängt von der Anwendung ab.
Thomasrutter

Antworten:

47

Dies wird Ihnen die Framerate sagen, wenn es nicht variable Framerate ist:

ffmpeg -i Dateiname

Beispielausgabe mit verdecktem Dateinamen:

Eingabe # 0, matroska, webm, aus 'somerandom.mkv':
  Dauer: 01: 16: 10.90, Start: 0.000000, Bitrate: N / A
    Stream Nr. 0.0: Video: h264 (Hoch), yuv420p, 720 x 344 [PAR 1: 1 DAR 90:43], 25 fps, 25 tbr, 1 k tbn, 50 tbc (Standard)
    Stream # 0.1: Audio: AAC, 48000 Hz, Stereo, S16 (Standard)
ffmpeg -i Dateiname 2> & 1 | sed -n "s /.*, \ (. * \) fp. * / \ 1 / p"

Jemand hat mit einem bearbeitet, der nicht so funktioniert hat, wie ich es wollte. Es wird hier verwiesen.
Zusätzliche Bearbeitung ... Wenn Sie den Wert tbr möchten, funktioniert diese Sed-Linie

sed -n s /.*, \ (. * \) tbr. * / \ 1 / p
RobotHumans
quelle
Ich musste tb anstelle von fp im Einzeiler verwenden. Es sieht so aus, als ob nicht alle Videodateien fps melden, sondern alle autput etwas wie tbr tbc, das den gleichen Wert hat.
sup
gültig, aber der Einzeiler aus der Bearbeitung gab den Tbc-Wert und nicht den Tbr-Wert in dieser bestimmten Ausgabemenge aus. etwas, worüber ich nachdenken sollte, warum ich es geändert habe ... Ich würde eher daran scheitern, als daran, dass es überhaupt nicht bemerkt wird.
RobotHumans
Ich denke, am Ende sed -n "s/.*, \(.*\) tbr.*/\1/pvermisst ", nein?
sup
6
ffmpeg ist nicht veraltet, avconv stammt aus einem Zweig von ffmpeg und um Verwirrung bei denjenigen zu vermeiden, die die ffmpeg-Alternative verwenden, wurde der falsche Zweig als veraltet markiert, damit diese Benutzer wissen, dass sich die von ihnen verwendete Version geändert hat. Ihr Kommentar ist irreführend und kann dazu führen, dass Benutzer Zeit mit Nachforschungen verschwenden.
Chris
1
Was ist, wenn die Bildrate variabel ist?
0xcaff
29
ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate infile

Ergebnis:

2997/100
Steven Penny
quelle
3
Dies ist wahrscheinlich die beste Antwort, da sie die EXAKTE Bildrate angibt (im Beispiel 24000/1001 = 23.976023976)
ztg
1
Manchmal bekomme ich 0/0je nach Format
Daniel_L
1
Je nachdem, was Sie möchten, funktioniert dies entweder oder nicht. Es gibt die Bildrate der Kodierung an, jedoch nicht die tatsächliche Bildrate des Videos. Beispiel: Ein in 60 fps codiertes 30 fps-Video gibt 60 fps aus, die tatsächliche Ausgabe beträgt jedoch immer noch 30 fps.
Harvey
8
Dies hat nicht funktioniert, wenn der Video-Stream nicht der erste Stream ist. Sie erhalten 0/0, wenn es sich um einen Audio-Stream handelt. Ich werde bearbeiten, um zu setzen -select_streams V:0, die den ersten bewegten Videostream auswählen.
Sam Watkins
2
@ SamWatkins Ergänzung ist wichtig. Ohne es wird der Befehl ausgegeben 0/0.
JDHAO
4

Hier ist eine Python-Funktion, die auf Steven Pennys Antwort mit ffprobe basiert und die genaue Bildrate angibt

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
quelle
2

Die Alternative zur Kommandozeile ist das Anzeigen der Eigenschaften Ihrer Datei über das Kontextmenü in Nautilus (grafischer Dateimanager). Für Audio- / Videodateien erhalten Sie dort einen zusätzlichen Reiter mit zusätzlichen Informationen.

user32288
quelle
2

Dies ist ein Python-Skript, um dies mit mplayer zu tun, falls jemand interessiert ist. Es wird gebraucht 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
sup
quelle
0

Sie können mit der rechten Maustaste auf die Zieldatei, Eigenschaften, Audio / Video, klicken, aber die genaue Bildrate wird nicht angezeigt. Um eine genaue Bildrate zu erhalten, können Sie MediaInfo installieren.

vladmateinfo
quelle
0

Nur für den Fall, dass jemand darüber stolpert ... Sie können natürlich input arg als Pfad verwenden;)

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
quelle
0

Normalerweise verwende ich exiftool, um Informationen über einen beliebigen Dateityp exiftool file.swfabzurufen ... Zum Beispiel kann ich mit dem Befehl die Bildrate einer beliebigen SWF-Datei ermitteln, was ich mit dieser nicht erreichen kannffmpeg

aesede
quelle
-1
ffprobe <media> 2>&1| grep ",* fps" | cut -d "," -f 5 | cut -d " " -f 2
Daya
quelle
1
erklären, was es tun wird?
Donnerstag,