T-CREATOR

FFmpeg 静的ビルド完全版:x264/x265/aom/opus/fdk-aac 対応のフル装備手順

FFmpeg 静的ビルド完全版:x264/x265/aom/opus/fdk-aac 対応のフル装備手順

動画編集やストリーミング配信を行う際、FFmpeg は欠かせないツールです。しかし、配布されているバイナリでは必要なコーデックが含まれていなかったり、システムの共有ライブラリに依存していて環境が変わると動作しなかったりする問題に直面することがあります。

そんな課題を解決するのが「静的ビルド」という手法です。本記事では、x264、x265、AV1(libaom)、Opus、fdk-aac といった主要なコーデックをすべて組み込んだ FFmpeg を、依存関係を気にせず動作する静的バイナリとしてビルドする完全手順をご紹介します。初めての方でも迷わず実践できるよう、各ステップを丁寧に解説していきますね。

背景

静的ビルドが必要とされる理由

FFmpeg は動画・音声ファイルの変換、エンコード、ストリーミングなど、マルチメディア処理のスイスアーミーナイフとも言える存在です。しかし、通常のパッケージマネージャー経由でインストールすると、いくつかの制約が生じます。

#項目動的ビルド(通常版)静的ビルド
1ライブラリ依存システムの共有ライブラリに依存すべてバイナリに組み込み
2環境移植性環境が変わると動作しない可能性どの環境でも動作
3コーデック対応パッケージ提供範囲に限定任意のコーデックを組み込み可能
4バイナリサイズ小さい(数 MB)大きい(数十 MB)
5アップデートパッケージ管理で容易手動で再ビルドが必要

動的ビルドでは、システムにインストールされた共有ライブラリ(.so や.dll ファイル)を参照して動作します。そのため、別のサーバーや Docker コンテナに移動すると、ライブラリのバージョン違いや不在により動作しないことがあるのです。

主要コーデックの役割

今回ビルドに組み込む各コーデックには、それぞれ重要な役割があります。

以下の図は、FFmpeg と各コーデックライブラリの関係性を示したものです。

mermaidflowchart TB
  ffmpeg["FFmpeg<br/>コアエンジン"]

  subgraph video["映像コーデック"]
    x264["x264<br/>H.264エンコーダ"]
    x265["x265<br/>H.265/HEVCエンコーダ"]
    aom["libaom<br/>AV1エンコーダ"]
  end

  subgraph audio["音声コーデック"]
    opus["libopus<br/>Opusコーデック"]
    fdk["fdk-aac<br/>高品質AACエンコーダ"]
  end

  ffmpeg --> x264
  ffmpeg --> x265
  ffmpeg --> aom
  ffmpeg --> opus
  ffmpeg --> fdk

  x264 -->|MP4/MKV出力| output["エンコード済み<br/>動画ファイル"]
  x265 -->|MP4/MKV出力| output
  aom -->|WebM/MP4出力| output
  opus -->|WebM/Ogg出力| output
  fdk -->|MP4/AAC出力| output

図で理解できる要点

  • FFmpeg は複数のコーデックライブラリを統合管理するコアエンジン
  • 映像系(x264/x265/aom)と音声系(opus/fdk-aac)のライブラリが連携
  • 各コーデックが異なる出力形式に対応

それぞれのコーデックは、以下のような特徴を持っています。

x264(H.264 エンコーダ):最も広く使われている映像コーデックで、ほぼすべてのデバイスで再生可能です。動画配信サービスや YouTube でも標準的に使われていますね。

x265(H.265/HEVC エンコーダ):H.264 の後継規格で、同じ画質でファイルサイズを約半分に圧縮できます。4K 動画の配信などで威力を発揮するでしょう。

libaom(AV1 エンコーダ):次世代の映像コーデックで、H.265 よりさらに高効率な圧縮が可能です。YouTube や Netflix が採用を進めています。

libopus(Opus コーデック):音声コーデックの中でも非常に高品質で、低ビットレートでも優れた音質を実現します。Web 会議やゲーム配信に最適ですね。

fdk-aac(高品質 AAC エンコーダ):AAC の中でも最高品質のエンコーダーで、Apple 製品や Spotify などで広く使われています。

課題

通常の FFmpeg インストールで直面する問題

パッケージマネージャーで FFmpeg をインストールする際、以下のような課題に直面することがあります。

mermaidflowchart TD
  start["FFmpegを<br/>インストール"]
  check1{"必要なコーデックは<br/>含まれている?"}
  check2{"共有ライブラリは<br/>揃っている?"}
  check3{"ライセンス的に<br/>問題ない?"}

  start --> check1
  check1 -->|No| problem1["★ コーデックが<br/>足りない"]
  check1 -->|Yes| check2
  check2 -->|No| problem2["★ 依存関係<br/>エラー"]
  check2 -->|Yes| check3
  check3 -->|No| problem3["★ ライセンス<br/>制約"]
  check3 -->|Yes| success["正常に動作"]

  problem1 --> rebuild["再ビルドが<br/>必要"]
  problem2 --> rebuild
  problem3 --> rebuild

図で理解できる要点

  • 通常インストールでは 3 つのチェックポイントで問題が発生しうる
  • いずれかの問題が発生すると再ビルドが必要になる

コーデックの不足

Ubuntu の apt や CentOS の yum でインストールした FFmpeg には、ライセンス上の理由で fdk-aac が含まれていないことが多いです。また、最新の AV1 コーデック(libaom)も古いパッケージには入っていません。

bash# 通常インストールしたFFmpegのコーデック確認
ffmpeg -codecs | grep -i h265
bash# H.265は対応しているが、fdk-aacが見つからない例
ffmpeg -codecs | grep -i fdk
# → 何も表示されない

このように、必要なコーデックが使えず、高品質なエンコードができない問題が発生します。

環境依存の問題

動的リンクされた FFmpeg は、システムの共有ライブラリに依存しているため、以下のようなエラーが発生することがあるのです。

bash# 別の環境でFFmpegを実行
./ffmpeg -version
plaintext# エラー例:共有ライブラリが見つからない
Error: libx264.so.157: cannot open shared object file: No such file or directory
Error: libx265.so.192: cannot open shared object file: No such file or directory

特に Docker コンテナを使う場合や、古い OS から新しい OS へ移行する際に、このような問題に悩まされることが多いですね。

ライセンスとパテントの制約

fdk-aac や x264 などの一部コーデックは、特許やライセンスの関係で、ディストリビューションの公式パッケージに含まれていないことがあります。商用利用する際には、各コーデックのライセンス条項を確認する必要があるでしょう。

解決策

静的ビルドによる完全な FFmpeg 環境の構築

これらの課題を解決するのが「静的ビルド」です。すべての依存ライブラリを FFmpeg バイナリに組み込むことで、どの環境でも動作する単一の実行ファイルを作成できます。

mermaidflowchart LR
  subgraph build["ビルドプロセス"]
    source["ソースコード<br/>取得"]
    compile["各ライブラリを<br/>個別にビルド"]
    link["FFmpegに<br/>静的リンク"]
  end

  subgraph libs["依存ライブラリ"]
    x264_src["x264"]
    x265_src["x265"]
    aom_src["libaom"]
    opus_src["libopus"]
    fdk_src["fdk-aac"]
  end

  source --> compile
  x264_src --> compile
  x265_src --> compile
  aom_src --> compile
  opus_src --> compile
  fdk_src --> compile
  compile --> link
  link --> binary["ffmpeg<br/>静的バイナリ<br/>(単一ファイル)"]

図で理解できる要点

  • 各コーデックライブラリを個別にビルドしてから統合
  • 最終的に依存関係のない単一バイナリが生成される

ビルド環境の準備

まず、ビルドに必要なツールとライブラリをインストールします。Ubuntu/Debian 系のシステムを例に説明しますね。

bash# システムパッケージの更新
sudo apt update && sudo apt upgrade -y

必要なビルドツールをインストールします。これらは各ライブラリをコンパイルする際に使用されます。

bash# コンパイラとビルドツール
sudo apt install -y \
  autoconf \
  automake \
  build-essential \
  cmake \
  git-core \
  libass-dev \
  libfreetype6-dev \
  libgnutls28-dev \
  libmp3lame-dev \
  libsdl2-dev \
  libtool \
  libva-dev \
  libvdpau-dev \
  libvorbis-dev \
  libxcb1-dev \
  libxcb-shm0-dev \
  libxcb-xfixes0-dev \
  meson \
  ninja-build \
  pkg-config \
  texinfo \
  wget \
  yasm \
  zlib1g-dev

次に、ビルド作業用のディレクトリを作成します。

bash# 作業ディレクトリとインストール先を作成
mkdir -p ~/ffmpeg_sources ~/ffmpeg_build ~/bin

これで、ソースコードを配置する ffmpeg_sources、ビルド成果物を配置する ffmpeg_build、最終的なバイナリを配置する bin の 3 つのディレクトリが準備できました。

NASM(高速アセンブラ)のインストール

多くのコーデックライブラリは、高速化のためにアセンブリ言語を使用しています。そのため、最新版の NASM が必要です。

bash# NASMのソースコードをダウンロード
cd ~/ffmpeg_sources
wget https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.bz2
bash# 解凍してビルド
tar xjvf nasm-2.15.05.tar.bz2
cd nasm-2.15.05
bash# configureとmakeでビルド・インストール
./autogen.sh
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make -j$(nproc)
make install

-j$(nproc) オプションは、CPU のコア数に応じて並列ビルドを行うことで、ビルド時間を短縮できます。

具体例

各コーデックライブラリのビルド

それでは、実際に各コーデックライブラリを順番にビルドしていきましょう。各ライブラリは独立してビルドし、最後に FFmpeg に統合します。

x264(H.264 エンコーダ)のビルド

x264 は最も広く使われている H.264 エンコーダーです。まずソースコードを取得します。

bash# x264のGitリポジトリをクローン
cd ~/ffmpeg_sources
git clone --depth 1 https://code.videolan.org/videolan/x264.git
cd x264

次に、静的ライブラリとしてビルドするための設定を行います。

bash# configureで静的ビルドを指定
./configure \
  --prefix="$HOME/ffmpeg_build" \
  --bindir="$HOME/bin" \
  --enable-static \
  --enable-pic

--enable-static で静的ライブラリを生成し、--enable-pic で Position Independent Code(位置独立コード)を有効にします。これにより、他のライブラリと組み合わせやすくなるのです。

bash# ビルドとインストール
make -j$(nproc)
make install

x265(H.265/HEVC エンコーダ)のビルド

x265 は H.265/HEVC コーデックのエンコーダーで、CMake を使ってビルドします。

bash# x265のソースコードを取得
cd ~/ffmpeg_sources
git clone --depth 1 https://bitbucket.org/multicoreware/x265_git.git
cd x265_git/build/linux

CMake で静的ビルドの設定を行います。

bash# CMakeで設定(静的ライブラリとして)
cmake -G "Unix Makefiles" \
  -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" \
  -DENABLE_SHARED=OFF \
  -DENABLE_CLI=OFF \
  ../../source

-DENABLE_SHARED=OFF で動的ライブラリの生成を無効化し、静的ライブラリのみを生成します。

bash# ビルドとインストール
make -j$(nproc)
make install

libaom(AV1 エンコーダ)のビルド

libaom は次世代コーデック AV1 の参照実装です。Google や Mozilla、Netflix などが開発に参加しています。

bash# libaomのソースコードを取得
cd ~/ffmpeg_sources
git clone --depth 1 https://aomedia.googlesource.com/aom
cd aom
bash# ビルドディレクトリを作成
mkdir -p aom_build
cd aom_build

CMake で静的ビルドを設定します。AV1 はエンコード時間がかかるため、最適化オプションも指定しますね。

bash# CMakeで設定
cmake -G "Unix Makefiles" \
  -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" \
  -DENABLE_SHARED=OFF \
  -DENABLE_NASM=ON \
  -DBUILD_SHARED_LIBS=OFF \
  ..
bash# ビルドとインストール
make -j$(nproc)
make install

libopus(Opus コーデック)のビルド

Opus は低遅延・高音質を両立した音声コーデックで、Web 会議やストリーミングに最適です。

bash# libopusのソースコードを取得
cd ~/ffmpeg_sources
git clone --depth 1 https://github.com/xiph/opus.git
cd opus
bash# autogen.shで設定スクリプトを生成
./autogen.sh

静的ライブラリとしてビルドするための設定を行います。

bash# configureで静的ビルドを指定
./configure \
  --prefix="$HOME/ffmpeg_build" \
  --disable-shared \
  --enable-static

--disable-shared で動的ライブラリを無効化し、--enable-static で静的ライブラリを有効化します。

bash# ビルドとインストール
make -j$(nproc)
make install

fdk-aac(高品質 AAC エンコーダ)のビルド

fdk-aac は Fraunhofer IIS が開発した高品質な AAC エンコーダーです。商用利用時はライセンス条項を確認してください。

bash# fdk-aacのソースコードを取得
cd ~/ffmpeg_sources
git clone --depth 1 https://github.com/mstorsjo/fdk-aac.git
cd fdk-aac
bash# autoreconfで設定スクリプトを生成
autoreconf -fiv

静的ライブラリとしてビルドします。

bash# configureで静的ビルドを指定
./configure \
  --prefix="$HOME/ffmpeg_build" \
  --disable-shared \
  --enable-static
bash# ビルドとインストール
make -j$(nproc)
make install

FFmpeg 本体のビルド

すべてのコーデックライブラリのビルドが完了したら、いよいよ FFmpeg 本体をビルドします。ここが最も重要な工程ですね。

以下の図は、FFmpeg ビルドの全体フローを示しています。

mermaidflowchart TD
  download["FFmpegソースコード<br/>ダウンロード"]
  configure["configure実行<br/>(各コーデック有効化)"]
  check{"依存ライブラリは<br/>すべて検出された?"}
  make["make実行<br/>(並列ビルド)"]
  install["make install<br/>バイナリ配置"]
  verify["動作確認<br/>(コーデック対応確認)"]

  download --> configure
  configure --> check
  check -->|Yes| make
  check -->|No| error["★ エラー<br/>ライブラリパス確認"]
  error --> configure
  make --> install
  install --> verify

図で理解できる要点

  • configure で依存関係を検出してからビルド
  • エラー時はライブラリパスを確認して再 configure
bash# FFmpegのソースコードを取得
cd ~/ffmpeg_sources
git clone --depth 1 https://github.com/FFmpeg/FFmpeg.git
cd FFmpeg

次に、PKG_CONFIG_PATH を設定して、ビルドしたライブラリを FFmpeg が見つけられるようにします。

bash# PKG_CONFIG_PATHを設定
export PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig"

これで、先ほどビルドした各ライブラリの .pc ファイル(パッケージ設定ファイル)を FFmpeg が参照できるようになりました。

続いて、configure スクリプトを実行します。ここで各コーデックを有効化します。

bash# FFmpegのconfigureを実行
./configure \
  --prefix="$HOME/ffmpeg_build" \
  --pkg-config-flags="--static" \
  --extra-cflags="-I$HOME/ffmpeg_build/include" \
  --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
  --extra-libs="-lpthread -lm" \
  --ld="g++" \
  --bindir="$HOME/bin" \
  --enable-gpl \
  --enable-gnutls \
  --enable-libass \
  --enable-libfdk-aac \
  --enable-libfreetype \
  --enable-libmp3lame \
  --enable-libopus \
  --enable-libvorbis \
  --enable-libx264 \
  --enable-libx265 \
  --enable-libaom \
  --enable-nonfree \
  --enable-static \
  --disable-shared

各オプションの意味を解説します。

#オプション説明
1--pkg-config-flags="--static"静的ライブラリを優先
2--enable-gplGPL ライセンスのコーデックを有効化
3--enable-nonfree非フリーライセンスのコーデックを有効化
4--enable-libx264x264 エンコーダーを有効化
5--enable-libx265x265 エンコーダーを有効化
6--enable-libaomAV1 エンコーダーを有効化
7--enable-libopusOpus コーデックを有効化
8--enable-libfdk-aacfdk-aac エンコーダーを有効化
9--enable-static静的ビルドを有効化
10--disable-shared動的ライブラリの生成を無効化

configure が成功したら、いよいよビルドを実行します。

bash# FFmpegをビルド(時間がかかります)
make -j$(nproc)

ビルドには環境によって 10 分〜30 分程度かかることがあります。並列ビルドを有効にしているので、コア数が多いほど速く完了するでしょう。

bash# ビルド成果物をインストール
make install

これで、~​/​bin ディレクトリに静的ビルドされた FFmpeg バイナリが配置されました。

ビルド結果の確認

ビルドが成功したか確認しましょう。まず、バイナリのパスを通します。

bash# パスを追加(.bashrcや.zshrcに追記すると永続化)
export PATH="$HOME/bin:$PATH"

FFmpeg のバージョンと対応コーデックを確認します。

bash# バージョン情報を表示
ffmpeg -version
plaintext# 出力例(一部抜粋)
ffmpeg version N-110234-g1234abcd
built with gcc 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04)
configuration: --enable-gpl --enable-libx264 --enable-libx265 --enable-libaom --enable-libopus --enable-libfdk-aac --enable-nonfree --enable-static --disable-shared

次に、各コーデックが有効になっているか確認します。

bash# H.264(x264)の確認
ffmpeg -codecs | grep -i h264
plaintext# 出力例
DEV.LS h264    H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 ) (encoders: libx264 libx264rgb )
bash# H.265(x265)の確認
ffmpeg -codecs | grep -i hevc
plaintext# 出力例
DEV.L. hevc    H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc ) (encoders: libx265 )
bash# AV1(libaom)の確認
ffmpeg -codecs | grep -i av1
plaintext# 出力例
DEV.L. av1     Alliance for Open Media AV1 (decoders: libdav1d libaom-av1 ) (encoders: libaom-av1 )
bash# Opusの確認
ffmpeg -codecs | grep -i opus
plaintext# 出力例
DEA.L. opus    Opus (decoders: opus libopus ) (encoders: opus libopus )
bash# AACの確認
ffmpeg -codecs | grep -i aac
plaintext# 出力例
DEA.L. aac     AAC (Advanced Audio Coding) (decoders: aac ) (encoders: libfdk_aac )

すべてのコーデックが表示されれば、ビルドは成功です。

実際のエンコード例

ビルドした FFmpeg を使って、実際に動画をエンコードしてみましょう。

H.264 でのエンコード

最も一般的な H.264 形式でエンコードします。

bash# 入力動画をH.264でエンコード
ffmpeg -i input.mp4 \
  -c:v libx264 \
  -preset medium \
  -crf 23 \
  -c:a aac \
  -b:a 128k \
  output_h264.mp4

-preset medium はエンコード速度と圧縮率のバランス設定、-crf 23 は品質設定(0〜51 で、低いほど高品質)です。

H.265 での高圧縮エンコード

同じ品質でファイルサイズを半分にする H.265 でエンコードします。

bash# H.265でエンコード(高圧縮)
ffmpeg -i input.mp4 \
  -c:v libx265 \
  -preset medium \
  -crf 28 \
  -c:a libfdk_aac \
  -b:a 128k \
  output_h265.mp4

H.265 はエンコード時間が H.264 の 2〜3 倍かかりますが、ファイルサイズは大幅に削減できます。

AV1 での次世代エンコード

最新の AV1 コーデックでエンコードします。

bash# AV1でエンコード(最高圧縮)
ffmpeg -i input.mp4 \
  -c:v libaom-av1 \
  -crf 30 \
  -b:v 0 \
  -strict experimental \
  -c:a libopus \
  -b:a 96k \
  output_av1.webm

AV1 は非常に高い圧縮率を実現しますが、エンコードには最も時間がかかります。

音声のみのエンコード(Opus)

高音質な音声ファイルを Opus でエンコードします。

bash# 音声のみをOpusでエンコード
ffmpeg -i input.mp4 \
  -vn \
  -c:a libopus \
  -b:a 96k \
  output.opus

-vn オプションで映像を除外し、音声のみを抽出してエンコードします。

トラブルシューティング

ビルドやエンコード時によく遭遇するエラーと解決方法を紹介します。

エラー 1:共有ライブラリが見つからない

エラーコード: なし(警告)

plaintextWARNING: library configuration mismatch
ERROR: libx264 not found

発生条件: PKG_CONFIG_PATH が正しく設定されていない場合に発生します。

解決方法:

  1. PKG_CONFIG_PATH を確認
  2. .pc ファイルの存在を確認
  3. configure を再実行
bash# 1. PKG_CONFIG_PATHの確認
echo $PKG_CONFIG_PATH
# → /home/username/ffmpeg_build/lib/pkgconfig が表示されるべき
bash# 2. .pcファイルの存在確認
ls $HOME/ffmpeg_build/lib/pkgconfig/
# → x264.pc, x265.pc などが存在するか確認
bash# 3. 環境変数を設定し直してconfigureを再実行
export PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig"
cd ~/ffmpeg_sources/FFmpeg
./configure [オプション...]

エラー 2:NASM のバージョンが古い

エラーコード: なし(ビルド失敗)

plaintextError: nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.

発生条件: システムにインストールされている NASM が古いバージョンの場合に発生します。

解決方法:

  1. NASM を最新版でビルド(本記事の「NASM のインストール」を参照)
  2. パスを確認して優先順位を調整
bash# NASMのバージョン確認
nasm --version
# → NASM version 2.15.05 以上が必要
bash# システムのNASMより先にビルド版を使うよう設定
export PATH="$HOME/bin:$PATH"
which nasm
# → /home/username/bin/nasm と表示されるべき

エラー 3:エンコード時のメモリ不足

エラーコード: なし(プロセス強制終了)

plaintextKilled

発生条件: 4K 動画を AV1 でエンコードする際など、メモリ消費が大きい場合に発生します。

解決方法:

  1. エンコード設定を調整(preset を速いものに変更)
  2. 2 パスエンコードを使用
  3. タイルエンコードを有効化
bash# 1パス目:解析のみ(メモリ消費少)
ffmpeg -i input.mp4 \
  -c:v libaom-av1 \
  -b:v 2M \
  -pass 1 \
  -f null /dev/null
bash# 2パス目:実際のエンコード
ffmpeg -i input.mp4 \
  -c:v libaom-av1 \
  -b:v 2M \
  -pass 2 \
  -c:a libopus \
  output.webm

2 パスエンコードにすることで、メモリ消費を抑えつつ高品質なエンコードが可能になります。

まとめ

本記事では、x264、x265、libaom、libopus、fdk-aac といった主要なコーデックをすべて組み込んだ FFmpeg の静的ビルド手順を解説しました。

静的ビルドによって、以下のメリットが得られます。

環境非依存:どの環境でも動作する単一バイナリが手に入り、Docker コンテナや異なるサーバー間での移動が簡単になります。

完全なコーデック対応:必要なすべてのコーデックを自由に組み込めるため、パッケージ版では対応していない形式でもエンコードできるようになりますね。

最新機能の利用:Git リポジトリからビルドすることで、公式パッケージより新しい機能やバグフィックスを利用できます。

一方で、以下の点には注意が必要です。

ビルド時間:すべてのライブラリをビルドするため、初回は 1 時間程度かかることがあります。

バイナリサイズ:静的ビルドのため、バイナリサイズは 100MB 程度になります(動的ビルドは数 MB です)。

セキュリティアップデート:セキュリティパッチは手動で再ビルドする必要があるため、定期的なアップデートを心がけましょう。

この手順を一度実行すれば、プロフェッショナルな動画エンコード環境が手に入ります。YouTube 配信、動画配信サービスの開発、映像制作など、さまざまな用途で活用できるでしょう。

ビルドした FFmpeg を使って、高品質な動画制作をお楽しみください。

関連リンク