Ubuntu 24.04でFFmpegを安全かつ再現可能にコンパイルする方法

トランスコード、リマックス、フィルタ処理、調査、ストリーミング、音声・動画生成が必要なとき、私がまず手に取るのがFFmpegです。多くの環境ではUbuntuのパッケージ版が最適ですが、より新しいリリースや、外部ライブラリを厳密に指定した構成が必要ならソースビルドが役立ちます。

このガイドでは、Ubuntu 24.04 LTS(Noble)FFmpeg 9.0.1をビルドします。インストール先は、現在のユーザーのホームディレクトリ内にあるバージョン別ディレクトリです。これなら/usr/bin/ffmpegを上書きせず、sudo make installで未管理のファイルを/usr/localへ書き込むこともなく、PATHを変える前に新しいビルドをテストできます。

パッケージ名とリリースへのリンクは、2026年9月1日にUbuntuとFFmpegの公式情報で確認しました。これは幅広く実用的な構成であり、文字どおり「FFmpegの全機能」ではありません。FFmpegには多数のオプションライブラリがあり、ライセンス上同時に選べない構成や、ハードウェア固有のSDKもあります。

まずソースビルドが本当に必要か判断する

現在インストールされているものを確認します。

if command -v ffmpeg >/dev/null 2>&1; then
  command -v ffmpeg
  ffmpeg -version | sed -n '1p'
fi

Ubuntu版に必要なコーデックとフィルタが含まれているなら、保守されるパッケージを使い、ここで終了するのが簡単です。

sudo apt update
sudo apt install ffmpeg

UbuntuパッケージはAPT経由で更新されます。ソースビルドは自動更新されません。ソースから入れる場合は、新しいFFmpegリリースを確認し、重要な修正があれば自分で再ビルドする必要があります。

この構成で有効にするもの

以下の構成では、よく使われるCPUコーデックと文字・音声機能を追加します。

  • x264およびx265によるH.264・HEVCエンコード
  • libvpxによるVP8・VP9
  • dav1dによるAV1デコード
  • MP3、Opus、Vorbis、Theora
  • ASS字幕とdrawtext関連のフォントシェーピング
  • SoX ResamplerとGnuTLSによるHTTPS

FFmpeg標準のAACエンコーダーはそのまま有効なので、Fraunhofer FDK AACや--enable-nonfreeは不要です。ハードウェアエンコーダーは、GPU、ドライバー、ヘッダー、FFmpegリリースごとに要件が異なるため、基本構成には含めません。

ステップ1:必要なビルド依存関係だけをインストールする

次のパッケージ名はUbuntu 24.04の公式パッケージ索引に存在します。一部の外部コーデック開発パッケージはUbuntuのuniverseコンポーネントにあるため、Nobleの公式リポジトリが有効になっていることを確認してください。

sudo apt-get update
sudo apt-get install -y --no-install-recommends \
  build-essential \
  ca-certificates \
  curl \
  gpg \
  libass-dev \
  libdav1d-dev \
  libfreetype-dev \
  libfribidi-dev \
  libgnutls28-dev \
  libharfbuzz-dev \
  libmp3lame-dev \
  libopus-dev \
  libsoxr-dev \
  libtheora-dev \
  libvorbis-dev \
  libvpx-dev \
  libx264-dev \
  libx265-dev \
  nasm \
  pkg-config \
  xz-utils \
  zlib1g-dev

APTがパッケージを見つけられない場合、無関係なPPAをそのまま追加してはいけません。最初にUbuntuのリリースと設定済みリポジトリを確認します。

. /etc/os-release
printf '%s %s\n' "$NAME" "$VERSION_ID"
apt-cache policy libx264-dev libx265-dev libass-dev

この手順の対象はUbuntu 24.04です。ほかのUbuntuリリースで使う前に、公式索引でパッケージ名を確認し直してください。

ステップ2:署名付きソースリリースをダウンロードして検証する

バージョン、作業ディレクトリ、インストール先を変数にします。古いソースや変更済みソースの上へ展開せず、別のディレクトリに保管してください。

FFMPEG_VERSION='9.0.1'
FFMPEG_WORK_DIR="$HOME/src/ffmpeg-$FFMPEG_VERSION-build"
FFMPEG_PREFIX="$HOME/.local/ffmpeg-$FFMPEG_VERSION"

mkdir -p "$FFMPEG_WORK_DIR"
cd "$FFMPEG_WORK_DIR"

curl --fail --location \
  --output "ffmpeg-$FFMPEG_VERSION.tar.xz" \
  "https://ffmpeg.org/releases/ffmpeg-$FFMPEG_VERSION.tar.xz"
curl --fail --location \
  --output "ffmpeg-$FFMPEG_VERSION.tar.xz.asc" \
  "https://ffmpeg.org/releases/ffmpeg-$FFMPEG_VERSION.tar.xz.asc"
curl --fail --location \
  --output ffmpeg-devel.asc \
  https://ffmpeg.org/ffmpeg-devel.asc

tarballの署名だけでなく、署名鍵のフィンガープリントも検証します。一時的なGnuPGホームを使うため、通常のユーザー鍵リングには混在しません。

FFMPEG_GPG_HOME="$(mktemp -d)"
chmod 700 "$FFMPEG_GPG_HOME"

gpg --homedir "$FFMPEG_GPG_HOME" --import ffmpeg-devel.asc
gpg --homedir "$FFMPEG_GPG_HOME" --with-colons --fingerprint \
  | awk -F: '$1 == "fpr" {print $10}' \
  | grep -Fx 'FCF986EA15E6E293A5644F10B4322F04D67658D8'

gpg --homedir "$FFMPEG_GPG_HOME" --verify \
  "ffmpeg-$FFMPEG_VERSION.tar.xz.asc" \
  "ffmpeg-$FFMPEG_VERSION.tar.xz"

フィンガープリントの比較または署名検証に失敗した場合は、先へ進まないでください。両方に成功したらアーカイブを展開します。

tar -xf "ffmpeg-$FFMPEG_VERSION.tar.xz"
cd "$FFMPEG_WORK_DIR/ffmpeg-$FFMPEG_VERSION"

ステップ3:バージョン別のユーザー領域向けに設定する

ダウンロードしたリリース自身のconfigureスクリプトを実行します。

./configure \
  --prefix="$FFMPEG_PREFIX" \
  --disable-doc \
  --enable-gpl \
  --enable-gnutls \
  --enable-libass \
  --enable-libdav1d \
  --enable-libfreetype \
  --enable-libfribidi \
  --enable-libharfbuzz \
  --enable-libmp3lame \
  --enable-libopus \
  --enable-libsoxr \
  --enable-libtheora \
  --enable-libvorbis \
  --enable-libvpx \
  --enable-libx264 \
  --enable-libx265

ここでは意図的に--enable-sharedを使いません。インストールされたFFmpegプログラムはUbuntuの外部コーデックライブラリを引き続き利用しますが、独自のFFmpeg共有ライブラリをシステムのローダーパスへ追加しないため、sudo ldconfigも不要です。

オプションを追加する前に、ダウンロードしたソースリリースに付属するconfigureヘルプを確認してください。

./configure --help

configureが失敗した場合、有用な証拠は通常ffbuild/config.logの末尾付近にあります。想定したライブラリについては、pkg-configにも直接問い合わせます。

tail -n 80 ffbuild/config.log
pkg-config --modversion x264
pkg-config --modversion libass

NASMが見つからないというエラーに対して、最適化済みx86アセンブリを意図的に捨てたい場合を除き、--disable-x86asmで回避しないでください。Nobleのnasmパッケージをインストールし、configureを再実行します。

ステップ4:sudoを使わずビルドしてインストールする

マシンに合う並列ジョブ数を選びます。4は控えめな開始値です。小さなVMでは減らし、メモリに余裕があると確認できた場合だけ増やしてください。

FFMPEG_JOBS="${FFMPEG_JOBS:-4}"
make -j"$FFMPEG_JOBS"
make install

FFMPEG_PREFIXは現在のユーザーのホームディレクトリ内なので、make installにroot権限は不要なはずです。権限を要求された場合はsudoを足すのではなく、停止して./configureが表示したprefixを確認してください。

ステップ5:自分がビルドした正確なバイナリを検証する

古い/usr/bin/ffmpegが問題を隠さないよう、検証中は絶対パスを使います。

FFMPEG_BIN="$FFMPEG_PREFIX/bin/ffmpeg"
FFPROBE_BIN="$FFMPEG_PREFIX/bin/ffprobe"

"$FFMPEG_BIN" -version
"$FFMPEG_BIN" -buildconf
"$FFMPEG_BIN" -hide_banner -encoders \
  | grep -E 'libx264|libx265|libvpx|libmp3lame|libopus'
"$FFMPEG_BIN" -hide_banner -filters \
  | grep -E 'drawtext|subtitles|aresample'

次のスモークテストは、短い映像と音を自分で生成してエンコードし、結果を調べます。個人のメディアファイルは不要です。

FFMPEG_TEST_OUTPUT="$FFMPEG_WORK_DIR/ffmpeg-smoke-test.mp4"

"$FFMPEG_BIN" -hide_banner \
  -f lavfi -i 'testsrc2=size=640x360:rate=30' \
  -f lavfi -i 'sine=frequency=1000:sample_rate=48000' \
  -t 3 \
  -c:v libx264 -preset veryfast -pix_fmt yuv420p \
  -c:a aac -shortest -y "$FFMPEG_TEST_OUTPUT"

"$FFPROBE_BIN" -v error \
  -show_entries stream=index,codec_name,codec_type \
  -show_entries format=duration \
  -of json "$FFMPEG_TEST_OUTPUT"

ビルドコマンドの成功だけでは、すべてのコーデック、フィルタ、デバイス、ドライバーが動く証明にはなりません。実際に使う経路を個別に確認してください。

このビルドを LazyEdit で実際の作業に使う

FFmpeg のコンパイルは通常、完成したワークフローではなく準備です。私が保守している LazyEdit は、前処理、文字起こし、多言語字幕、キーフレーム、メタデータ、任意の公開処理をまとめる LazyingArt のオープンソース動画ワークフローです。

LazyEdit は通常、Ubuntu のパッケージ版 FFmpeg で動作し、FFmpeg 9.0.1 を特に要求するものではありません。ソースビルドが必要なのは、実際に必要なコーデックやフィルタが欠けている場合だけです。このガイドのカスタム prefix を使うなら、LazyEdit を実行するのと同じ shell、tmux セッション、コンテナ、またはサービス内で、ffmpegffprobeの両方がその場所を参照していることを確認してください。対話 shell ひとつのPATHを変更しても、サービスが同じバイナリを使う証明にはなりません。

Ubuntuのパッケージを置き換えずにカスタムビルドを使う

現在のシェルだけで使う場合は次のとおりです。

export PATH="$FFMPEG_PREFIX/bin:$PATH"
hash -r
type -a ffmpeg
ffmpeg -version | sed -n '1p'

検証が終わるまでは、バージョン別prefixを永続的なPATHへ追加しないでください。更新時は新しいprefixへビルドし、絶対パスでテストしてからPATHの項目を切り替えます。Ubuntuのパッケージ版を/usr/binに残せば、切り戻し先も明確です。

ライセンス:GPLとnon-freeオプション

FFmpegは標準ではLGPLですが、この手順はx264とx265を有効にするため--enable-gplを使います。生成したバイナリを配布する場合は、FFmpegのGPL遵守案内と、リンクされるすべてのライブラリのライセンスを確認してください。

この基本構成ではFFmpeg標準のAACエンコーダーを使います。libfdk-aac-devを追加する場合、FFmpegのコーデック文書では--enable-libfdk-aacが必要です。このGPL構成と組み合わせるには--enable-nonfreeも必要になり、FFmpegはそのビルドを再配布不可として扱います。古い「全部有効にする」一覧にあったという理由だけで、これらのオプションを追加しないでください。

x264とx265が不要なら、両方の開発パッケージとconfigureオプションを省き、--enable-gplも外せます。最終的なライセンスは、単独のオプションではなく構成全体から判断してください。

ハードウェアアクセラレーションは別のビルド判断

configureオプションを1つ足せばGPUアクセラレーションが動くとは限りません。VAAPI、NVENC/NVDEC、Vulkanなどは、それぞれ異なるヘッダー、ドライバー、デバイス、実行時権限に依存します。まず対象リリースの./configure --helpを確認し、選んだ経路に必要な公式の依存関係だけを入れ、対象マシンでテストしてください。

ビルド後、次のコマンドでFFmpegに組み込まれたインターフェースを表示できます。

"$FFMPEG_BIN" -hide_banner -hwaccels

この一覧だけでは、対応GPUや正常なドライバーが存在する証明になりません。本番で頼る前に、実デバイスを使った小さなデコードまたはエンコードを確認します。

メンテナンスのチェックリスト

私はソースビルドについて次の習慣を保ちます。

  1. FFmpeg公式のダウンロードページとセキュリティページで新しいリリースを確認する。
  2. 新しいtarballと署名を取得し、公開済みフィンガープリントも再確認する。
  3. 動作中のビルドを上書きせず、新しいバージョン別prefixへビルドする。
  4. ffmpeg -versionffmpeg -buildconfの出力を配備メモとともに保存する。
  5. 合成スモークテストだけでなく、代表的なメディア処理も再テストする。
  6. 新しいバイナリが検証を通ってからPATHを切り替える。

apt install ffmpegより少し手間はかかりますが、この方法なら追跡可能なソースリリース、明示的な機能構成、Ubuntuのシステムバイナリを変更しない明確な切り戻し経路を得られます。

一次資料

2026年9月1日確認:

Leave a Reply