Jak znaleźć liczbę klatek na sekundę dowolnego pliku wideo?

44

Czy jest jakiś prosty sposób na znalezienie fps wideo w Ubuntu? W systemie Windows używam Gspot, aby znaleźć wszystkie informacje o pliku wideo. Ale w ubuntu bardzo trudno jest mi znaleźć tę podstawową informację. Każda pomoc jest mile widziana.

Vivek
źródło
Nie jest to możliwe, ponieważ nie wszystkie pliki wideo mają „fps” (ponieważ istnieje kodowanie VFR).
fkraiem
Filmy VFR nadal mają średnią liczbę klatek na sekundę - to, czy jest to przydatne, zależy od aplikacji.
thomasrutter,

Odpowiedzi:

47

To powie ci framerate, jeśli nie jest zmienną framerate:

nazwa pliku ffmpeg -i

Przykładowe dane wyjściowe z ukrytą nazwą pliku:

Wpisz nr 0, matroska, webm, z 'somerandom.mkv':
  Czas trwania: 01: 16: 10.90, start: 0,000000, szybkość transmisji: nie dotyczy
    Strumień # 0.0: Wideo: h264 (High), yuv420p, 720x344 [PAR 1: 1 DAR 90:43], 25 fps, 25 tbr, 1k tbn, 50 tbc (domyślnie)
    Strumień # 0.1: Audio: aac, 48000 Hz, stereo, s16 (domyślnie)
ffmpeg -i nazwa pliku 2> i 1 | sed -n "s /.*, \ (. * \) fp. * / \ 1 / p"

Ktoś edytował z takim, który nie działał tak, jak chciałem. Jest tu odniesienie
Dodatkowa edycja ... Jeśli chcesz mieć wartość tbr, ta linia sed działa

sed -n "s /.*, \ (. * \) tbr. * / \ 1 / p"
RobotHumans
źródło
Musiałem użyć tb zamiast fp w jednowarstwowym. Wydaje się, że nie wszystkie pliki wideo zgłaszają fps, ale wszystkie autput coś w rodzaju tbr tbc, który ma tę samą wartość.
sup
poprawne, ale jeden wiersz z edycji wyprowadził wartość tbc, a nie wartość tbr w tym konkretnym zestawie danych wyjściowych. coś do rozważenia, dlaczego to zmieniłem ... Wolę, żeby zawiodło w naprawdę zauważalny sposób niż w sposób, który w ogóle nie jest zauważany.
RobotHumans
Myślę, że sed -n "s/.*, \(.*\) tbr.*/\1/ptęskni "w końcu, nie?
sup
6
ffmpeg nie jest przestarzałe, avconv pochodzi z gałęzi ffmpeg i aby uniknąć nieporozumień dla osób korzystających z alternatywy ffmpeg, fałszywa gałąź została oznaczona jako przestarzała, aby poinformować tych użytkowników, że wersja, której używali, się zmienia. twój komentarz jest mylący i może spowodować, że użytkownicy zmarnują czas na badanie tego
Chris
1
Co jeśli jest to zmienna liczba klatek na sekundę?
0xcaff
29
ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate infile

Wynik:

2997/100
Steven Penny
źródło
3
Jest to prawdopodobnie najlepszą odpowiedzią na to, że daje dokładną ilość klatek na sekundę (w przykładzie 24000/1001 = +23,976023976)
NTG
1
czasami dostaję się w 0/0zależności od formatu
Daniel_L
1
W zależności od tego, co chcesz, to działa albo nie. Podaje liczbę klatek na sekundę kodowania, ale nie rzeczywistą liczbę klatek na sekundę wideo. Na przykład wideo 30 klatek na sekundę zakodowane w 60 klatkach na sekundę zgłasza 60 klatek na sekundę, ale w rzeczywistości będzie to 30 klatek na sekundę.
Harvey,
8
To nie działało, jeśli strumień wideo nie jest pierwszym strumieniem, otrzymasz 0/0, jeśli spojrzy na strumień audio. Będę edytować, aby umieścić -select_streams V:0, który wybierze pierwszy ruchomy strumień wideo.
Sam Watkins,
2
@ Uzupełnienie SamWatkins jest ważne. Bez tego polecenie wydało wynik 0/0.
jdhao
4

Oto funkcja pytona oparta na odpowiedzi Stevena Penny'ego za pomocą ffprobe, która daje dokładną częstotliwość klatek

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
źródło
2

Alternatywą dla wiersza poleceń jest przeglądanie właściwości pliku za pomocą menu kontekstowego w Nautilus (graficzny menedżer plików). W przypadku plików audio / wideo dostępna jest dodatkowa karta z dodatkowymi informacjami.

użytkownik32288
źródło
2

To jest skrypt Pythona, aby to zrobić za pomocą mplayera, na wypadek, gdyby ktoś był zainteresowany. Jest używany path/to/script path/to/movie_name1 path/to/movie/name2itp

#!/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
łyk
źródło
0

Możesz kliknąć prawym przyciskiem myszy plik docelowy, Właściwości, Audio / Wideo, ale nie uzyskasz dokładnej liczby klatek na sekundę. Aby uzyskać dokładną liczbę klatek na sekundę, możesz zainstalować MediaInfo.

vladmateinfo
źródło
0

Na wypadek, gdyby ktoś natknął się na to ... możesz oczywiście użyć argumentu wejściowego jako ścieżki;)

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
źródło
0

Zwykle używam, exiftoolaby uzyskać informacje o dowolnym typie pliku ... Na przykład za pomocą polecenia exiftool file.swfznam liczbę klatek na sekundę dowolnego pliku SWF, czego nie mogę osiągnąćffmpeg

aesede
źródło
-1
ffprobe <media> 2>&1| grep ",* fps" | cut -d "," -f 5 | cut -d " " -f 2
Daya
źródło
1
wyjaśnić, co to zrobi?
rɑːdʒɑ