Як знайти кадри в секунду будь-якого відеофайлу?


44

Чи є якийсь простий спосіб знайти кадр у кадрі відео в ubuntu? У Windows я використовую Gspot, щоб дізнатися всю інформацію про відеофайл. Але в ubuntu мені дуже важко з'ясувати цю основну інформацію. Будь-яка допомога вдячна.


Це неможливо, оскільки не всі відеофайли мають "fps" (оскільки існує кодування VFR).
fkraiem

Відео VFR все ще має середню частоту кадрів - корисна чи ні, залежить від програми.
thomasrutter

Відповіді:


47

Це підкаже вам частоту кадрів, якщо це не змінна частота кадрів:

ffmpeg -і ім'я файлу

Вибірка з прихованим ім'ям файлу:

Введення № 0, matroska, webm, з 'somerandom.mkv':
  Тривалість: 01: 16: 10,90, початок: 0,000000, бітрейт: Н / А
    Потік № 0,0: Відео: h264 (Високий), yuv420p, 720x344 [PAR 1: 1 DAR 90:43], 25 кадрів в секунду, 25 tbr, 1k tbn, 50 tbc (за замовчуванням)
    Потік № 0.1: Аудіо: aac, 48000 Гц, стерео, s16 (за замовчуванням)
ffmpeg -і ім'я файлу 2> & 1 | sed -n "s /.*, \ (. * \) fp. * / \ 1 / p"

Хтось редагував один, який не зовсім працював так, як я хотів. Він посилається тут
Додатковими редагувати ... Якщо ви хочете отримати значення TBR цього SED роботи лінії

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

Мені потрібно було використовувати tb замість fp в одноланковому. Здається, не всі відеофайли повідомляють про fps, але всі автозаписи мають щось на зразок tbr tbc, який має однакове значення.
sup

дійсно, але однолінійний з редагування виводу-ed значення tbc не є значенням tbr у цьому конкретному наборі виводу. щось врахувати, чому я змінив це ... Я вважаю, що це не вдалося по-справжньому помітно, ніж спосіб, який зовсім не помічений.
RobotHumans

Я думаю , що sed -n "s/.*, \(.*\) tbr.*/\1/pпромахи "в кінці кінців, немає?
sup

6
ffmpeg не є застарілим, avconv прийшов з гілки ffmpeg, і щоб уникнути плутанини для тих, хто використовує ffmpeg альтернативу, підроблена гілка була позначена як застаріла, щоб повідомити тим користувачам, що версія, яку вони використовують, змінюється. ваш коментар вводить в оману і може змусити користувачів витрачати час на дослідження цього
Кріс

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)
ntg

1
іноді я отримую 0/0залежно від формату
Daniel_L

1
Залежно від того, що ви хочете, це або працює, або ні. Він повідомляє частоту кадрів кодування, але не фактичну частоту кадрів відео. Наприклад, відео 30 кадрів в секунду, закодоване в 60 кадрів в секунду, повідомлять про 60 кадрів в секунду, але фактичний вихід буде тривати 30 кадрів в секунду.
Харві

8
Це не спрацювало, якщо відеопотік не перший потік, ви отримаєте 0/0, якщо він перегляне аудіопотік. Я відредагую, щоб поставити -select_streams V:0, що вибере перший рухомий відеопотік.
Сем Уоткінс

2
@ Доповнення SamWatkins є важливим. Без нього команда дала вихід 0/0.
jdhao

4

Ось функція пітона на основі відповіді Стівена Пенні за допомогою 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

2

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


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.


0

На всякий випадок, якщо хтось натрапить на це ... ви, звичайно, можете ввести аргумент введення як шлях;)

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

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


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

1
поясніть, що це буде робити?
rɑːdʒɑ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.