Enable libopenjpeg in FFmpeg for JPEG 2000

This guide explains how to enable and use the libopenjpeg library inside FFmpeg to achieve superior JPEG 2000 encoding. While FFmpeg includes an experimental native JPEG 2000 encoder, the external OpenJPEG library provides full standard compliance, better compression efficiency, and production-grade stability for archival and cinema workflows. Below, you will find step-by-step instructions to install necessary dependencies, compile FFmpeg with OpenJPEG support, verify the build, and execute high-quality encoding commands.

1. Install OpenJPEG Development Libraries

Before compiling FFmpeg, you must install the OpenJPEG version 2 development headers on your system.

Debian / Ubuntu:

sudo apt update
sudo apt install libopenjp2-7-dev pkg-config build-essential yasm

Fedora / RHEL:

sudo dnf install openjpeg2-devel pkgconfig gcc make yasm

macOS (via Homebrew):

brew install openjpeg pkg-config yasm

2. Configure and Compile FFmpeg

To activate the encoder, download the FFmpeg source code and configure the build flags to include --enable-libopenjpeg.

  1. Clone the FFmpeg source repository:

    git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
    cd ffmpeg
  2. Run the configuration script with the required flag enabled:

    ./configure --enable-gpl --enable-libopenjpeg

    Note: If you require a non-redistributable or custom build, adjust other flags accordingly. Ensure pkg-config detects OpenJPEG successfully during this step.

  3. Compile and install:

    make -j$(nproc)
    sudo make install

3. Verify the Installation

Ensure that the newly compiled FFmpeg binary recognizes the libopenjpeg encoder:

ffmpeg -encoders | grep openjpeg

If successful, the output will display:

 V..... libopenjpeg          OpenJPEG JPEG 2000 (codec jpeg2000)

4. Encoding High-Quality JPEG 2000 Video

With libopenjpeg enabled, invoke it using the -c:v libopenjpeg parameter.

Mathematically Lossless Encoding

To achieve perfect archival-quality compression without any loss of data, set the compression level to 0:

ffmpeg -i input.mov -c:v libopenjpeg -compression_level 0 output.mkv

Visually Lossless / Target Bitrate

For controlled file sizes (such as Digital Cinema Package preparation), specify a video bitrate:

ffmpeg -i input.mov -c:v libopenjpeg -b:v 250M output.j2k

Setting Cinema Profiles

For DCI-compliant JPEG 2000 streams (Cinema 2K or 4K), specify the profile and frame rate options supported by OpenJPEG:

ffmpeg -i input.mov -c:v libopenjpeg -cinema_mode 2k_24 -b:v 200M output.mkv

Using libopenjpeg ensures consistent color space handling, standard conformance, and maximum fidelity when working with JPEG 2000 streams.