Как найти кадры в секунду любого видео файла?
Есть ли простой способ найти fps видео в Ubuntu? В Windows я использую Gspot, чтобы узнать всю информацию о видеофайле. Но в Ubuntu мне очень трудно найти эту основную информацию. Любая помощь приветствуется.
15 ответов
Это скажет вам частоту кадров, если это не переменная частота кадров:
ffmpeg -i имя файла
Пример вывода с закрытым именем файла:
Введите #0, matroska,webm, из 'somerandom.mkv': Продолжительность: 01:16:10,90, старт: 0,000000, битрейт: нет данных Поток #0.0: видео: h264 (высокий), yuv420p, 720x344 [PAR 1:1 DAR 90:43], 25 кадров в секунду, 25 тбр, 1 т тбн, 50 тбк (по умолчанию) Поток #0.1: Аудио: aac, 48000 Гц, стерео, s16 (по умолчанию)
ffmpeg -i filename 2> & 1 | sed -n "s /.*, \ (. * \) fp. * / \ 1 / p"
Кто-то отредактировал тот, который не совсем работал так, как я хотел. Это ссылка здесь
Дополнительное редактирование... Если вы хотите значение tbr, эта строка работает
sed -n "s/.*, \(.*\) tbr.*/\1/p"
ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate infile
Результат:
2997/100
Вот функция python, основанная на ответе Стивена Пенни с использованием ffprobe, которая дает точную частоту кадров
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
Получить среднюю частоту кадров, выраженную в виде дроби:
фракция =$(ffprobe -v error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=nw=1:nk=1 "${input}")
Затем разделите его, округлив до ближайшего целого числа:
python -c "печать (раунд (${дробь}))"
Альтернативой командной строке является поиск свойств вашего файла через контекстное меню в Nautilus (графический файловый менеджер). Для аудио / видео файлов вы получите дополнительную вкладку с дополнительной информацией.
Это скрипт на python, чтобы сделать это с помощью mplayer, на случай, если кому-то будет интересно. Это использовано path/to/script path/to/movie_name1 path/to/movie/name2
так далее
#!/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
Я обычно использую exiftool
получить информацию о любом типе файла... Например, с помощью команды exiftool file.swf
Я могу знать частоту кадров любого SWF-файла, чего я не могу достичь с ffmpeg
Вы также можете получить частоту кадров с помощью mediainfo cli .
mediainfo "filename.mov" "--inform=Video;%FrameRate%"
Вы можете щелкнуть правой кнопкой мыши целевой файл, Свойства, Аудио / Видео, но вы не получите точную частоту кадров. Чтобы получить точную частоту кадров, вы можете установить MediaInfo.
На всякий случай, если кто-то наткнется на это... вы, конечно, можете использовать input arg в качестве пути;)
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)))
Код Python для получения нескольких вещей, включая количество кадров в секунду (fps), количество кадров, высоту, ширину.
def get_video_info(filename):
#r_frame_rate is "the lowest framerate with which all timestamps can be
#represented accurately (it is the least common multiple(LCM) of all framerates in the stream)."
result = subprocess.run(
[
"ffprobe",
"-v",
"error",
"-select_streams",
"v:0",
"-show_entries",
"stream=avg_frame_rate,r_frame_rate,nb_frames,width,height",
filename,
],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
ffprobe_out = str(result.stdout, 'utf-8')
print(ffprobe_out)
r_frame_rate = int(ffprobe_out.split('r_frame_rate=')[1].split('\n')[0].split('/')[0])
avg_frame_rate = int(ffprobe_out.split('avg_frame_rate=')[1].split('\n')[0].split('/')[0])
nb_frames = int(ffprobe_out.split('nb_frames=')[1].split('\n')[0])
height = int(ffprobe_out.split('height=')[1].split('\n')[0])
width = int(ffprobe_out.split('width=')[1].split('\n')[0])
return (r_frame_rate, avg_frame_rate, nb_frames, height, width)
$fps = exec("ffprobe -v error -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries stream=r_frame_rate input.mkv");
$fps = round(strstr($fps, '/' , true) / substr (strstr($fps, '/'), 1 ), 2);
Пример вывода:
29.97
или же
59.94
framerate=$(( $(ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate "$1" | sed 's#/# / #g') ))
^ это вернет точную частоту кадров и произведет вычисления с ней, чтобы дать вам окончательную точную частоту кадров (она преобразует 25.000/1
к 25
, например)
Нет необходимости в Python (требуется оболочка, подобная Bash)
ffprobe <media> 2>&1| grep ",* fps" | cut -d "," -f 5 | cut -d " " -f 2