OpenH264 に対応した FFmpeg をビルド

2021/9/11

はじめに

iOS アプリに動画を組み込む場合、コーデック第一の選択肢として、H.264 が挙げられ、それと同時に H.264 ライセンスと向き合うことを余儀なくされるわけですが、そもそも、アプリ組み込み以前に、H.264 動画を用意すること(H.264 エンコード)自体にクリアすべきライセンス問題があります。

エンコードに限って言えば、OpenH264 という利用側がライセンス料を回避でき得る有難いライブラリがあるので、それを FFmpeg に組み込んで利用することにしました。

前提

本記事に関連するライセンスについて

  • H.264 エンコードにはライセンス料がかかる
  • OpenH264(ただし、Cisco が配布する binary module に限る)はライセンス料支払い済み
  • OpenH264 をソースコードからビルドして利用する場合は(前項目に該当しないため)ライセンス料がかかる

ただし、ライセンスに関する見解は個人の理解の範疇に過ぎませんので、実際にご利用になる際は、鵜呑みにせずに正しくご検討ください。

ビルド

ビルド環境は docker を使うことにして、下記、Dockerfile を用意しました。

Dockerfile

FROM ubuntu:20.04

RUN apt-get update \
  && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
    autoconf \
    automake \
    build-essential \
    cmake \
    git-core \
    libass-dev \
    libfreetype6-dev \
    libgnutls28-dev \
    libtool \
    libvorbis-dev \
    meson \
    ninja-build \
    pkg-config \
    texinfo \
    wget \
    yasm \
    zlib1g-dev \
    # On Ubuntu 20.04
    libunistring-dev \
    libaom-dev \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

ENV USERNAME ffmpeg

RUN adduser $USERNAME
USER $USERNAME
WORKDIR /home/$USERNAME/

RUN mkdir -p ~/ffmpeg_sources ~/ffmpeg_build

# libopenh264 ソースコードをダウンロード。
RUN cd ~/ffmpeg_sources \
  && wget --no-check-certificate https://github.com/cisco/openh264/archive/refs/tags/v2.1.1.tar.gz
# ライセンスフィー解決済み libopenh264 バイナリをダウンロード。
RUN cd ~/ffmpeg_sources \
  && wget --no-check-certificate https://github.com/cisco/openh264/releases/download/v2.1.1/libopenh264-2.1.1-linux-arm64.6.so.bz2
# FFmpeg をダウンロード。
RUN cd ~/ffmpeg_sources \
  && wget --no-check-certificate https://github.com/FFmpeg/FFmpeg/archive/refs/tags/n4.4.tar.gz

# libopenh264 をソースコードからビルドし、共有ライブラリとしてインストール。
RUN cd ~/ffmpeg_sources \
  && tar xf v2.1.1.tar.gz \
  && cd openh264-2.1.1 \
  && make -j `nproc` \
  && make PREFIX="$HOME/ffmpeg_build" install-shared

# 上記でビルドした libopenh264 をライセンスフィー解決済み libopenh264 バイナリで差し替え。
RUN cd ~/ffmpeg_sources \
  && bunzip2 libopenh264-2.1.1-linux-arm64.6.so.bz2 \
  && cp libopenh264-2.1.1-linux-arm64.6.so ~/ffmpeg_build/lib/libopenh264.so.2.1.1

# FFmpeg を libopenh264 込みでビルド。
RUN cd ~/ffmpeg_sources \
  && tar xf n4.4.tar.gz \
  && cd FFmpeg-n4.4 \
  && PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
    --prefix="$HOME/ffmpeg_build" \
    --enable-libopenh264 \
  && make -j `nproc` \
  && make install

補足

Ubuntu における FFmpeg ビルドについて

公式 Wiki を参考にしています。

libopenh264.so の差し替えについて

FFmpeg に を OpenH264 を組み込むべく、--enable-libopenh264 でビルドしようとすると、pkg-config で必要なライブラリを探そうとするため、適切な .pc ファイルまで生成してくれる make install-shared を利用しています。ただし、そのままだと前述の通り、ライセンス料を支払わなければいけないので、適切なバイナリで差し替えています。

ffmpeg コマンド実行について

下記の例の通り、LD_LIBRARY_PATH の設定をお忘れなく。

LD_LIBRARY_PATH="$HOME/ffmpeg_build/lib:$LD_LIBRARY_PATH" ffmpeg_build/bin/ffmpeg \
  -i vp9/${name}.webm  \
  -vcodec libopenh264 \
  openh264/${name}.mp4

おわりに

OpenH264 に感謝です。

参考