- Qt 6.8
- Qt Multimedia
- Building FFmpeg from source on macOS
- Qt 6.8.3 Reference Documentation

# Building FFmpeg from source on macOS

This page explains how to configure and build FFmpeg on macOS. This involves:

- Get the FFmpeg source code.
- Install the required dependencies.
- Configure FFmpeg from the command line.
- Build the development libraries.

## Get the FFmpeg source code

You can get the FFmpeg source code in these ways:

- Download from the FFmpeg download page.
- Clone from git. For example, this command clones the version 7.1 of the FFmpeg sources to `~/ffmpeg`.

       % git clone --branch n7.1 https://git.ffmpeg.org/ffmpeg.git ffmpeg

It is recommended to use the same FFmpeg version as documented in the Qt Multimedia main page.

The following paragraphs assumes that you store the FFmpeg source code under `~/ffmpeg`.

## Prerequisites

To build FFmpeg, these tools and packages are required:

- Homebrew
- Homebrew packages (yasm).

### Installing Homebrew

To install Homebrew, run:

     % /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

### Installing Homebrew packages

To install Homebrew package Yasm, run:

     % brew install yasm

## Configuring and building FFmpeg

Create a `build` directory inside the `~/ffmpeg` directory and navigate into it:

     % mkdir ~/ffmpeg/build
     % cd ~/ffmpeg/build

To configure FFmpeg, run:

     % ../configure --prefix=/usr/local/ffmpeg --disable-doc --enable-network --enable-shared

The `--prefix` argument specifies a path where the FFmpeg development libraries are installed after building. The documentation is not needed, but network features should be enabled. To build FFmpeg as static libraries, omit the `--enable-shared` option.

In the previous code snippet, an absolute path was used for `--prefix` argument intentionally. If you specify a relative path (for example, `../install`), the dependencies will be referenced using this relative path and not the correct one using `@rpath`. Using absolute paths makes an FFmpeg build non-portable. To use relative paths and make FFmpeg build portable, you need to manually fix dependencies using otool.

Once the `configure` command finishes, build and install FFmpeg using the `make` command.

     % make -j install

If the build completes without errors, FFmpeg development libraries are installed in the `/usr/local/ffmpeg` directory. If you build Qt Multimedia, this path is stored in the `FFMPEG_DIR` variable used when configuring Qt Multimedia.

### Configuring and Building FFmpeg Universal Binaries

To create universal binaries on macOS (for example, for both x86_64 and arm64 architectures), follow these steps:

- Configure and build FFmpeg for arm64 architecture:

       % ../configure --prefix=/usr/local/ffmpeg/arm64 --disable-doc --enable-network \
           --enable-shared --enable-cross-compile --arch=arm64 --cc="clang -arch arm64"
       % make -j install

- Configure and build FFmpeg for x86_64 architecture:

       % ../configure --prefix=/usr/local/ffmpeg/x86_64 --disable-doc --enable-network \
           --enable-shared --enable-cross-compile --arch=x86_64 --cc="clang -arch x86_64"
       % make -j install

- Combine the builds into a universal binary using lipo.