有没有找到 Ubuntu 上视频的帧率的简单方法?在 Windows 上,我使用 Gspot 来查找有关视频文件的所有信息。但是在 Ubuntu 上,我发现很难找到这些基本信息。任何帮助都将不胜感激。
ffmpeg -i 文件名文件名被隐藏后的示例输出:
输入 #0, matroska,webm, 来自 'somerandom.mkv': 时长: 01:16:10.90, 开始: 0.000000, 比特率: N/A 流 #0.0: 视频: h264 (High), 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"有人编辑了一个并不完全符合我的要求。在这里引用here
sed -n "s/.*, \(.*\) tbr.*/\1/p"
sed -n "s/.*, \(.*\) tbr.*/\1/p
最后缺少了 "
,对吗? - supffmpeg
的输出不适合机器解析。请改用专门用于此类用途的ffprobe
,您将不再需要使用sed
命令。请参考一些问题的答案或者访问FFmpeg Wiki: FFprobe获取更多信息。 - lloganffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate infile
结果:
2997/100
0/0
。 - Daniel_L0/0
。 - jdhaoinfile
参数之前需要-i
。命令应为ffprobe ..... -i infile
。 - Chef Pharaoh30/1
30/1
- Raleigh L.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
rate = out.decode("utf-8").split('"')[1].split('/')
会更好:它处理了多个视频流的情况。另外,我需要将子进程的输出转换为字符串,使用decode方法。 - FloPinguin获取给定的平均帧率,以分数表示:
fraction=$(ffprobe -v error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=nw=1:nk=1 "${input}")
然后将其四舍五入到最近的整数:
python -c "print (round(${fraction}))"
#!/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
120 fps
的视频,而且它也无法处理 25 fps
。此外,你需要转义 .
。所以,请使用:(\d+(\.\d+)?) fps
。 - slhcki
键就可以了。 - supexiftool
来获取任何文件类型的信息...
例如,使用命令exiftool file.swf
,我可以了解任何swf文件的帧速率,这是我无法通过ffmpeg
实现的。ffprobe <media> 2>&1| grep ",* fps" | cut -d "," -f 5 | cut -d " " -f 2
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)))