はじめに
現在、H.264 の動画コーデックが広く利用されています。
YouTubeをはじめ、多くの動画は H.264 で符号化されて配信・保存されています。
H.264 を利用するサービス提供やソフトウェアの再配布をする場合、ライセンス問題が発生します。
この記事では、どの様なライセンス問題があり、どのように回避するのかを説明します。
2つのライセンス問題
MPEG-LAライセンス
先ずは、特許に関するライセンスです。
Wikipedia では、以下のように記載されています。
H.264には多数の特許権が含まれており、本規格を採用したハードウェアやソフトウェア製品を製造する企業は、特許使用料であるパテント料の支払いが求められる。これらのライセンスに関する管理は、パテントプールであるMPEG-LAコンソーシアムが特許権者からの委託を受けて業務を代行している。

GPLv2/GPLv3ライセンス
H.264 を扱える OSS のライセンスに注意が必要となります。
H.264 のデコード、エンコードを行ったり、動画や静止画を扱える便利な OSS として、
OpenCV が広く利用されていますが、バックエンドに FFmpeg を利用しています。
FFmpeg(標準構成)のライセンスは GPL となり、FFmpeg/OpenCV をリンクするだけで、
全ソースコードの開示義務が発生します。

回避する方法
2つのライセンス問題を解消するために、OpenH264 を利用します。
注意
OpenH264 を利用する場合は注意点があります。最後までお読みください。
MPEG-LAライセンス
OpenH264 の公式ページに、以下の記載があります。
We will not pass on our MPEG-LA licensing costs for this module, and based on the current licensing environment, this will effectively make H.264 free for use on supported platforms.
また、FAQで以下の記載があります。
the team can use the binary module distributed by Cisco, in which case Cisco will cover the MPEG LA licensing fees.
纏めると、
「Ciscoが提供するバイナリを使用する場合、MPEG-LAライセンスの支払いは不要」
ということです。

GPLv2/GPLv3ライセンス
OpenH264 の公式ページに、以下の記載があります。
Cisco has taken their H.264 implementation, and open sourced it under BSD license terms.
OpenH264 自体は BSD ライセンスのため、GPLライセンス問題を回避可能です。
つまり、OpenH264 を FFmpeg のプラグインとして H.264 のデコードに使用すれば、
MPEG-LAライセンス問題と合わせて解決することができます。
メモ
FFmpeg は、H.264 のデコードに x264 というライブラリを使用しており、
このライブラリが GPL のため、伝搬して FFmpeg も GPL ライセンスになっています。
OpenCV/FFmpeg/OpenH264のビルド方法
apt などのパッケージ管理ツールで OpenCV/FFmpeg をインストールすると、
先のライセンス問題が発生します。
そのため、ここからは OpenCV / FFmpeg / OpenH264 のカスタムビルド方法について記載します。
Ubuntu 20.04 LTS の環境で動作確認済みの方法となります。
必要となる追加パッケージ
command
$ sudo apt install \
cmake \
make \
git \
g++ \
pkg-config \
nasm \
yasm
OpenH264
command
$ git clone -b v1.7.0 --depth 1 --single-branch https://github.com/cisco/openh264.git
$ cd openh264
$ make -j nproc
$ sudo make install-shared
$ sudo ldconfig
必要なヘッダー類をインストールしたら、Cisco が提供しているバイナリで上書きします。
command
$ curl -o ./libopenh264-1.7.0-linux64.4.so.bz2 -L https://github.com/cisco/openh264/releases/download/v1.7.0/libopenh264-1.7.0-linux64.4.so.bz2
$ bunzip2 libopenh264-1.7.0-linux64.4.so.bz2
$ sudo cp libopenh264-1.7.0-linux64.4.so /usr/local/lib/libopenh264.so.1.7.0
FFmpeg
command
$ git clone -b n4.2.7 --depth 1 --single-branch https://git.ffmpeg.org/ffmpeg.git
$ cd ffmpeg
$ ./configure \
--disable-gpl \
--enable-libopenh264 \
--enable-pic \
--enable-shared
$ make -j nproc
$ sudo make install
$ sudo ldconfig

OpenCV
command
$ git clone -b 4.2.0 --depth 1 --single-branch https://github.com/Itseez/opencv.git
$ git clone -b 4.2.0 --depth 1 --single-branch https://github.com/Itseez/opencv_contrib.git
$ cd opencv
$ mkdir build && cd build
$ cmake \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
-D BUILD_JAVA=OFF \
-D BUILD_SHARED_LIBS=ON \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_GENERATE_PKGCONFIG=YES \
-D WITH_FFMPEG=ON \
..

おわりに
いかがでしたでしょうか。
ライセンスの解釈は、各会社や会社の法務部によって判断が異なりますので、
商用で利用される際は、一度相談してみるとよいかと思います。

おまけ:ビルドスクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
#!/bin/bash # # setup variables # work_dir=${PWD} # # install necessary modules # sudo apt install \ cmake \ make \ git \ g++ \ sudo \ pkg-config \ nasm \ yasm # # OpenH264 # cd ${work_dir} git clone -b v1.7.0 --depth 1 --single-branch https://github.com/cisco/openh264.git cd openh264 make -j `nproc` sudo make install-shared sudo ldconfig # # replace openh264 library to avoid license issue # cd ${work_dir} curl -o ./libopenh264-1.7.0-linux64.4.so.bz2 -L https://github.com/cisco/openh264/releases/download/v1.7.0/libopenh264-1.7.0-linux64.4.so.bz2 bunzip2 libopenh264-1.7.0-linux64.4.so.bz2 sudo cp libopenh264-1.7.0-linux64.4.so /usr/local/lib/libopenh264.so.1.7.0 # # FFmpeg: # ffmpeg/focal-updates,focal-security 7:4.2.7-0ubuntu0.1 amd64 # Tools for transcoding, streaming and playing of multimedia files # cd ${work_dir} git clone -b n4.2.7 --depth 1 --single-branch https://git.ffmpeg.org/ffmpeg.git cd ffmpeg ./configure \ --disable-gpl \ --enable-libopenh264 \ --enable-pic \ --enable-shared make -j `nproc` sudo make install sudo ldconfig # # OpenCV: # libopencv-dev/focal 4.2.0+dfsg-5 amd64 # development files for opencv # libopencv-contrib-dev/focal 4.2.0+dfsg-5 amd64 # development files for libopencv-contrib4.2 # cd ${work_dir} git clone -b 4.2.0 --depth 1 --single-branch https://github.com/Itseez/opencv.git git clone -b 4.2.0 --depth 1 --single-branch https://github.com/Itseez/opencv_contrib.git cd opencv mkdir build cd build cmake \ -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ \ -D BUILD_IPP_IW=OFF \ -D BUILD_ITT=OFF \ -D BUILD_JAVA=OFF \ -D BUILD_PACKAGE=OFF \ -D BUILD_PROTOBUF=OFF \ -D BUILD_SHARED_LIBS=ON \ -D BUILD_TESTS=OFF \ -D BUILD_opencv_apps=OFF \ \ -D CMAKE_BUILD_TYPE=Release \ -D CMAKE_INSTALL_PREFIX=/usr/local \ \ -D CV_ENABLE_INTRINSICS=OFF \ -D CV_TRACE=OFF \ \ -D ENABLE_CCACHE=OFF \ \ -D OPENCV_GENERATE_PKGCONFIG=YES \ \ -D WITH_1394=OFF \ -D WITH_EIGEN=OFF \ -D WITH_FFMPEG=ON \ -D WITH_GSTREAMER=OFF \ -D WITH_GTK=OFF \ -D WITH_IPP=OFF \ -D WITH_ITT=OFF \ -D WITH_JASPER=OFF \ -D WITH_LAPACK=OFF \ -D WITH_OPENCL=OFF \ -D WITH_OPENCLAMDBLAS=OFF \ -D WITH_OPENCLAMDFFT=OFF \ -D WITH_TIFF=OFF \ -D WITH_V4L=OFF \ -D WITH_WEBP=OFF \ .. make -j `nproc` sudo make install sudo ldconfig # # finished # cd ${work_dir} |

参考