如何找到任何视频文件的每秒帧数?


44

有什么简单的方法可以在ubuntu中查找视频的fps?在Windows中,我使用Gspot查找有关视频文件的所有信息。但是在ubuntu中,我很难找到这些基本信息。任何帮助表示赞赏。


这是不可能的,因为并非所有视频文件都具有“ fps”(因为存在VFR编码)。
fkraiem

VFR视频仍具有平均帧速率-是否有用取决于应用程序。
thomasrutter

Answers:


47

这将告诉您帧率是否不是可变帧率:

ffmpeg -i文件名

带有文件名的示例输出被遮盖:

从'somerandom.mkv'输入#0,matroska,webm:
  持续时间:01:16:10.90,开始:0.000000,比特率:N / A
    流#0.0:视频:h264(高),yuv420p,720x344 [PAR 1:1 DAR 90:43],25 fps,25 tbr,1k tbn,50 tbc(默认)
    流#0.1:音频:aac,48000 Hz,立体声,s16(默认)
ffmpeg -i文件名2>&1 | sed -n“ s /.*,\(。* \)fp。* / \ 1 / p”

有人用我不想要的方式进行编辑。在此处引用它。
附加编辑...如果您想要tbr值,则此sed行有效

sed -n“ s /.*,\(。* \)tbr。* / \ 1 / p”

我需要在单行代码中使用tb而不是fp。似乎并非所有视频文件都报告fps,但似乎所有输出都具有tb tbc之类的值。
2012年

有效,但从编辑中输出的是一排tbc值,而不是此特定输出集中的tbr值。我为什么要更改它的一些思考...我宁愿它以一种真正引人注目的方式而不是根本没有注意到的方式而失败。
RobotHumans 2012年

我认为sed -n "s/.*, \(.*\) tbr.*/\1/p失误"到底,不是吗?
2012年

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

1
有时我会0/0视格式而定
Daniel_L

1
根据您的需要,此方法是否起作用。它报告编码的帧速率,但不报告视频的实际帧速率。例如,编码为60fps的30fps视频将报告60fps,但实际输出仍为30fps。
哈维

8
如果视频流不是第一流,则此方法不起作用,如果您查看音频流,则将获得0/0。我将编辑put -select_streams V:0,它将选择第一个运动视频流。
山姆·沃特金斯

2
@SamWatkins的补码很重要。没有它,命令将给出output 0/0
jdhao 2018年

4

这是一个基于ffprobe的基于Steven Penny答案的python函数,可提供准确的帧频

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

如果有人感兴趣,这是一个使用mplayer进行操作的python脚本。它被使用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

万一有人偶然发现了这个...您当然可以使用输入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)))

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ʒɑ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.