Как найти кадры в секунду любого видео файла?

44

Есть ли простой способ найти fps видео в Ubuntu? В Windows я использую Gspot, чтобы узнать всю информацию о видеофайле. Но в Ubuntu мне очень трудно найти эту основную информацию. Любая помощь приветствуется.

Вивек
источник
Это невозможно, потому что не все видеофайлы имеют «fps» (поскольку существует кодировка VFR).
fkraiem
VFR-видео по-прежнему имеют среднюю частоту кадров - зависит от того, полезно это или нет, зависит от приложения.
Томасруттер

Ответы:

47

Это скажет вам частоту кадров, если это не переменная частота кадров:

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"
RobotHumans
источник
Мне нужно было использовать тб вместо фп в однострочнике. Кажется, не все видеофайлы сообщают о fps, но все autput что-то вроде tbr tbc, который имеет одинаковое значение.
вс
допустимый, но одна строка из редактирования выдает значение tbc, а не значение tbr в этом конкретном наборе выходных данных. кое-что, чтобы подумать о том, почему я изменил это ... Я скорее потерплю неудачу действительно заметным способом, чем способом, который вообще не замечен.
RobotHumans
Я думаю, что sed -n "s/.*, \(.*\) tbr.*/\1/pскучает "в конце концов, нет?
вир
6
ffmpeg не устарела, avconv пришла из ветви ffmpeg, и во избежание путаницы для тех, кто использует альтернативу ffmpeg, поддельная ветка была помечена как устаревшая, чтобы дать пользователям знать, что версия, которую они использовали, менялась. Ваш комментарий вводит в заблуждение и может привести к тому, что пользователи будут тратить время на изучение этого
Chris
1
Что если это переменная частота кадров?
0xcaff
29
ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate infile

Результат:

2997/100
Стивен Пенни
источник
3
Вероятно, это лучший ответ в том смысле, что он дает ТОЧНУЮ частоту кадров (в примере 24000/1001 = 23,976023976)
нтг
1
иногда я получаю в 0/0зависимости от формата
Daniel_L
1
В зависимости от того, что вы хотите, это либо работает, либо нет. Он сообщает частоту кадров кодирования, но не фактическую частоту кадров видео. Например, видео со скоростью 30 кадров в секунду, закодированное в 60 кадров в секунду, сообщит о 60 кадрах в секунду, но все равно будет иметь фактическую скорость 30 кадров в секунду.
Харви
8
Это не сработало, если видеопоток не является первым потоком, вы получите 0/0, если он смотрит на аудиопоток. Я отредактирую, чтобы поставить -select_streams V:0, который выберет первый движущийся видео поток.
Сэм Уоткинс,
2
Дополнение @ SamWatkins важно. Без этого команда выдаст вывод 0/0.
Jdhao
4

Вот функция 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
NTG
источник
2

Альтернативой командной строке является поиск свойств вашего файла через контекстное меню в Nautilus (графический файловый менеджер). Для аудио / видео файлов вы получите дополнительную вкладку с дополнительной информацией.

user32288
источник
2

Это скрипт на 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
вир
источник
0

Вы можете щелкнуть правой кнопкой мыши целевой файл, Свойства, Аудио / Видео, но вы не получите точную частоту кадров. Чтобы получить точную частоту кадров, вы можете установить MediaInfo.

vladmateinfo
источник
0

На всякий случай, если кто-то наткнется на это ... вы, конечно, можете использовать 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)))
WhatAMesh
источник
0

Я обычно использую, exiftoolчтобы получить информацию о любом типе файла ... Например, с помощью команды exiftool file.swfя могу узнать частоту кадров любого SWF-файла, чего я не могу достичь сffmpeg

aesede
источник
-1
ffprobe <media> 2>&1| grep ",* fps" | cut -d "," -f 5 | cut -d " " -f 2
Дайя
источник
1
объясните что это будет делать?
2013 года