Skip to main content

PlotBitrate

FFProbe Bitrate Graph

This project contains a script for plotting the bitrate of an audio or video stream over time. To get the frame bitrate data ffprobe is used from the ffmpeg package. The ffprobe data is streamed to python as xml frame metadata and optionally sorted by frame type. Matplotlib is used to plot the overall bitrate or each frame type on the same graph with lines for the peak and mean bitrates. The resulting bitrate graph can be saved as an image.

Possible outputs are:

  • Image types (png, svg, pdf, ...)
  • Raw frame data (csv, xml)

Requirements:

  • Python >= 3.6
  • FFmpeg >= 1.2 with the ffprobe command
  • Matplotlib
  • PyQt5 or PyQt6 (optional for image file output)

For using the script from source, install the requirements with pip install -e . or use pip install --group dev for development purposes.

Installation

pip install plotbitrate

If you encounter the error message qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found. while running plotbitrate, then you may need to install your distribution's libxcb-cursor0 package. If this package is already installed and/or doesn't resolve the issue, then you can try using QT_DEBUG_PLUGINS=1 plotbitrate input.mkv 2>&1 | grep "No such file" to determine if other libraries are missing.

Useful Options

The raw frame data can be stored in an xml file with the option -f xml_raw, which the graph can be plotted from. This is useful if the graph should be shown multiple times with different options, as the source file doesn't need to be scanned again.

The option --downscale (or -d) is useful if the video is very long and an overview of the bitrate fluctuation is sufficient and zooming in is not necessary. This behavior resembles that of the tool "Bitrate Viewer". With this option, videos will be shown as a downscaled graph, meaning not every second is being displayed. Multiple seconds will be grouped together and the max value will be drawn. This downscaling is not applied when viewing individual frame types as this would lead to wrong graphs. This behavior can be adjusted with the --max-display-values option. The default value is 700, meaning that at most 700 individual seconds/bars are drawn.

CSV Output

You may find it useful to save the raw frame data to a CSV file so the frame data can be processed using another tool. This turns plotbitrate into more of a helper tool rather than a visualization tool.

One example may be using gnuplot to show an impulse plot for every single frame split by frame type. Below is an example gnuplot script that mimics an earlier version of plotbitrate.

#!/usr/bin/gnuplot -persist
set datafile separator ","
plot "< awk -F, '{if($3 == \"I\") print}' frames.csv" u 1:2 t "I" w impulses lt rgb "red", \
     "< awk -F, '{if($3 == \"P\") print}' frames.csv" u 1:2 t "P" w impulses lt rgb "green", \
     "< awk -F, '{if($3 == \"B\") print}' frames.csv" u 1:2 t "B" w impulses lt rgb "blue"

The necessary input data can be generated using:

plotbitrate -o frames.csv input.mkv

Usage Examples

Show video stream bitrate in a window with progress.

plotbitrate input.mkv

Show downscaled video stream bitrate in a window.

plotbitrate -d input.mkv

Show video stream bitrate for each frame type in a window.

plotbitrate -t input.mkv

Save video stream bitrate to an SVG file.

plotbitrate -o output.svg input.mkv

Show audio stream bitrate in a window.

plotbitrate -s audio input.mkv

Save raw ffproble frame data as xml file.

plotbitrate -f xml_raw -o frames.xml input.mkv

Show bitrate graph from raw xml.

plotbitrate frames.xml

Show the bitrate, but fill the area below the curve with a solid color.

plotbitrate --solid input.mkv

It's possible to specify a custom FFPROBE_PATH in case you don't have it on your PATH or want a custom ffprobe:

# Unix
FFPROBE_PATH=/tmp/ffprobe plotbitrate input.mkv

# Windows
set FFPROBE_PATH=C:\temp\ffmpeg\bin\ffprobe.exe
plotbitrate input.mkv

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

plotbitrate-1.2.0.1.tar.gz (11.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

plotbitrate-1.2.0.1-py3-none-any.whl (12.7 kB view details)

Uploaded Python 3

File details

Details for the file plotbitrate-1.2.0.1.tar.gz.

File metadata

  • Download URL: plotbitrate-1.2.0.1.tar.gz
  • Upload date:
  • Size: 11.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.25 {"installer":{"name":"uv","version":"0.11.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"44","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for plotbitrate-1.2.0.1.tar.gz
Algorithm Hash digest
SHA256 ff1a0cb17e76c62f7a912e7da007b90c500309a66a41e71289b61d935b934885
MD5 59bc65aa5e3ae698a1a71dc02296d61e
BLAKE2b-256 175eefb2a0004bc19e24239fbc5d9d48596dd3256e61b1b84d2f7cd3a323f49f

See more details on using hashes here.

File details

Details for the file plotbitrate-1.2.0.1-py3-none-any.whl.

File metadata

  • Download URL: plotbitrate-1.2.0.1-py3-none-any.whl
  • Upload date:
  • Size: 12.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.25 {"installer":{"name":"uv","version":"0.11.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"44","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for plotbitrate-1.2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 9a3d71fe259bed161cd9c0db4797070c41ab7d7daceb71eca98e402cd0b12a09
MD5 50a49312572136884add8ca6d938de1c
BLAKE2b-256 17692a4163b112d46009557a1c86d8ff3423dd779a5f47b46885214e3e36029b

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.2.0.1 This release

2 files

1.2.0.0

2 files

1.1.3.0

1 file

1.1.2.0

1 file

1.1.1.1

1 file

1.1.1.0

1 file

1.1.0.0

1 file

1.0.8.0

1 file

1.0.7.4

1 file

1.0.7.3

1 file

1.0.7.2

1 file

1.0.7.1

1 file

1.0.7

1 file

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page