93

Is there any simple way to find the fps of a video in ubuntu? In windows I use Gspot to find out all the information about a video file. But in ubuntu I find it very difficult to find out this basic information. Any help is appreciated.

Vivek
  • 3,829

15 Answers15

108

This will tell you the framerate if it's not variable framerate:

ffmpeg -i filename

Sample output with filename obscured:

Input #0, matroska,webm, from 'somerandom.mkv':
  Duration: 01:16:10.90, start: 0.000000, bitrate: N/A
    Stream #0.0: Video: h264 (High), yuv420p, 720x344 [PAR 1:1 DAR 90:43], 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
    Stream #0.1: Audio: aac, 48000 Hz, stereo, s16 (default)
ffmpeg -i filename 2>&1 | sed -n "s/.*, \(.*\) fp.*/\1/p"

Someone edited with one that didn't quite work the way I wanted. It's referenced here
Additional edit...If you want the tbr value this sed line works

sed -n "s/.*, \(.*\) tbr.*/\1/p"
RobotHumans
  • 30,112
58
ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate infile

Result:

2997/100
Zombo
  • 1
10

Here is a python function based on Steven Penny's answer using ffprobe that gives exact frame rate

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
muru
  • 207,228
ntg
  • 571
5

Retrieve the average frame-rate, given as a fraction:

fraction=$(ffprobe -v error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=nw=1:nk=1 "${input}")

Then divide it by rounding to the nearest integer:

python -c "print (round(${fraction}))"

2

The alternative to command line, is looking at the properties of your file via context menu in Nautilus (graphical file manager). For audio/video files you get an additional tab there with extra informations.

2

This is a python script to do this using mplayer, in case anyone is interested. It is used path/to/script path/to/movie_name1 path/to/movie/name2 etc

#!/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
muru
  • 207,228
sup
  • 4,964
1

I usually use exiftool to get info of any file type... For example with command exiftool file.swf I can know the framerate of any swf file, something I cannot achieve with ffmpeg

aesede
  • 131
1

Uses the stats script bundled by default with MPV. So just play the file with MPV and press i. A bunch of statistics including framerate will appear.

sup
  • 4,964
0

Just in case someone stumbles upon this... you can of course use input arg as the path ;)

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
  • 101
0
framerate=$(( $(ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate "$1" | sed 's#/# / #g') ))

^ this will return the exact frame rate, and do the maths on it, to give you the final exact frame rate (it will convert 25.000/1 to 25, for example)

No need for Python (requires a Bash-like shell)

sc0ttj
  • 1
0
$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);

Output Example: 29.97 or 59.94

Gryu
  • 8,002
  • 9
  • 37
  • 53
0

You can get the framerate with mediainfo cli too.

mediainfo "filename.mov" "--inform=Video;%FrameRate%"
Mint
  • 101
0

Python Code to Get a Few things including frames per second (fps), number of frames, height, width.

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)
0
ffprobe <media> 2>&1| grep ",* fps" | cut -d "," -f 5 | cut -d " " -f 2
Raja G
  • 105,327
  • 107
  • 262
  • 331
Daya
  • 11
0

You can right click the target file, Properties, Audio/Video but you will not get the exact framerate. To get a precise framerate you can install MediaInfo.

vladmateinfo
  • 1,475