# `ffmpeg_debug_qp` [](#contributors-) Authors: Werner Robitza, Steve Göring, Pierre Lebreton, Nathan Trevivian, Valerio Triolo `ffmpeg-debug-qp` is based on ffmpeg and prints QP values of a video input on a per-frame, per-macroblock basis to STDERR. The tool comes with an additional Python parser to help interpret the output. **Contents:** - [Download](#download) - [Building from Source](#building-from-source) - [Requirements](#requirements) - [Building](#building) - [Installation](#installation) - [Usage](#usage) - [Direct Usage](#direct-usage) - [Python Usage](#python-usage) - [Developers: Static Build](#developers-static-build) - [Acknowledgements](#acknowledgements) - [Contributors](#contributors) - [License](#license) ## Download Pre-built static binaries are available for Linux and macOS (both x86_64 and ARM64): **[Download the latest release](https://github.com/slhck/ffmpeg-debug-qp/releases/latest)** These binaries have FFmpeg statically linked and require no additional dependencies. ## Building from Source If you prefer to build from source, follow the instructions below. ### Requirements - Python 3.9 or higher - ffmpeg 8.x or higher libraries ### Linux For building: - libavdevice, libavformat, libavfilter, libavcodec, libswresample, libswscale, libavutil - C compiler For example on Ubuntu: sudo apt -qq update && \ sudo apt install libavdevice-dev libavformat-dev libavfilter-dev libavcodec-dev libswresample-dev libswscale-dev libavutil-dev build-essential pkg-config ### macOS For building: - [Homebrew](https://brew.sh/) Then: brew install ffmpeg pkg-config ### Building In order to use this tool, you need to build the `ffmpeg_debug_qp` binary. If you have FFmpeg libraries installed on your system, simply run: ```bash make ``` The binary will be created under `ffmpeg_debug_qp` in the same folder. ### Installation You can add the binary to your `$PATH`, e.g. by copying it to `/usr/local/bin`: ```bash sudo cp ./ffmpeg_debug_qp /usr/local/bin/ # or for static build: sudo cp ./build/ffmpeg_debug_qp /usr/local/bin/ ``` This way, you can call it from anywhere on your system. ## Usage Run this tool on any of the supported file types: - MPEG-2 - MPEG-4 Part 2 - H.264 / MPEG-4 Part 10 (AVC) Supported formats: - MPEG-4 Part 14 - H.264 Annex B bytestreams ### Direct Usage Simply call the binary with the path to a file: ```console ./ffmpeg_debug_qp test/test.mp4 [h264 @ 0x124f043b0] New frame, type: I [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] << frame_type: I; pkt_size: 213 >> [h264 @ 0x124f043b0] New frame, type: P [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 [h264 @ 0x124f043b0] 1111111111111111111111111111111111111111 ``` You will see the QP values for each macroblock of every frame. Each pair of two numbers is a QP value, hence, in the above example, the QP values are `11`, `11` and so on. ### Python Usage You can run the supplied Python tool that helps you parse the results from `ffmpeg_debug_qp`. First, build the binary and add it to your `$PATH`. Then, from the project directory, run via [uv](https://docs.astral.sh/uv/): ```bash uv run ffmpeg-debug-qp-parser --help ``` Or install locally with pip: ```bash pip install . ffmpeg-debug-qp-parser --help ``` The tool options are as follows: ``` usage: ffmpeg-debug-qp-parser [-h] [-f] [-of OUTPUT_FORMAT] [-p PATH_TO_TOOL] [-l | -k] [-m | -a] video|logfile output Parse QP values from ffmpeg-debug-qp positional arguments: video|logfile Video file to generate output for, or existing logfile output Output file optional arguments: -h, --help show this help message and exit -f, --force Overwrite output -of OUTPUT_FORMAT, --output-format OUTPUT_FORMAT Output format, one of: ld-json (default), json or csv -p PATH_TO_TOOL, --path-to-tool PATH_TO_TOOL Path to ffmpeg_debug_qp executable (will search in $PATH by default) -l, --use-logfile Use precalculated logfile instead of the video -k, --keep-logfile Don't remove the temporary logfile 'video.debug' -m, --include-macroblock-data Include macroblock-level data, such as: type, interlaced and segmentation -a, --compute-averages-only Only compute the frame-average QPs ``` #### Python Example To run a basic example: ``` ffmpeg-debug-qp-parser input.mp4 output_file.json -m -of json ``` This reads the file `input.mp4` and produces a JSON file `output_file.json`, with a list of frames and each of their macroblocks in the format: ```json [ { "frameType": "I", "frameSize": 7787, "qpAvg": 26.87280701754386, "qpValues": [ { "qp": 25, "type": "i", "segmentation": "", "interlaced": "" }, { "qp": 26, "type": "i", "segmentation": "", "interlaced": "" }, ... ``` The frame and macroblock types are as per ffmpeg debug information. The same goes for segmentation and interlaced values. For example outputs, see: * Line-delimited JSON * [Averages only](examples/example-avgs.ldjson) * [Macroblock data](examples/example-mbdata.ldjson) * JSON * [Averages only](examples/example-avgs.json) * [Macroblock data](examples/example-mbdata.json) * CSV * [Averages only](examples/example-avgs.csv) * [Macroblock data](examples/example-mbdata.csv) ## Developers: Static Build To build a portable binary with FFmpeg statically linked, use CMake: ```bash # Download and build minimal FFmpeg (first time only) ./util/build-ffmpeg.sh --download # Build ffmpeg_debug_qp cmake -B build -DUSE_VENDORED_FFMPEG=ON cmake --build build ``` The binary will be created at `build/ffmpeg_debug_qp`. This binary only depends on system libraries and can be distributed without requiring FFmpeg to be installed. To rebuild FFmpeg (e.g., after changes): ```bash ./util/build-ffmpeg.sh --clean # Clean and reconfigure ./util/build-ffmpeg.sh # Just rebuild ``` This is what is used inside GitHub Actions to provide prebuilt binaries for Linux and macOS. ## Acknowledgements This code is based on: - the code from [Fredrik Pihl](https://gist.github.com/figgis/ea9ac513cdd99a10abf1) - which is adapted from the code example `demuxing_decoding.c` by Stefano Sabatini See also [this thread](https://ffmpeg.org/pipermail/libav-user/2015-May/008122.html) on the libav-user mailing list. Test video part of Big Buck Bunny (c) copyright 2008, Blender Foundation / www.bigbuckbunny.org ## Contributors
Werner Robitza 💻 |
Nathan Trevivian 💻 |
Lars The 💻 |
plebreton 💻 |
winking324 💻 |
Steve Göring 💻 |
|
Valerio Triolo 💻 |
||||||
|
|
||||||