Linux Mint 19.2でffmpegをソースコードからビルドする方法

記念すべき300回目の投稿です。
今回は Linux Mint 19.2 “Tina” 64bit 上でffmpegやライブラリをソースコードからコンパイルしたいと思います。

その前に、ffmpegについて少し説明
ffmpegは、動画や音声をエンコードするのに使われるフリーソフトです。
恐らく、ほとんどの動画変換ソフトに組み込まれていると思います。

ffmpeg単体でも動画のエンコードは可能ですが、コマンドラインで操作するソフトなので慣れていないととっつきにくいかもしれません。


下準備
まずは、ffmpegやライブラリのビルドに必要なものをインストールします。

$ sudo apt install autoconf automake build-essential cmake git-core libass-dev libfreetype6-dev libgnutls28-dev libsdl2-dev libtool libva-dev libvdpau-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo wget yasm zlib1g-dev libnuma-dev

次にffmpegやライブラリのソースコードなどを格納するディレクトリを作成します。

$ mkdir -p ~/ffmpeg_sources ~/bin

下準備は以上で完了です。
続いて、ライブラリのコンパイルに移ります。


nasmのインストール
ちなみにmakeの後の「-j4」はCPUのコア数x2を入力することでCPUの演算能力をフルに使ってコンパイルすることができます。
例えば、AMD Ryzen 5 3600 (6コア、12スレッド)なら make -j12 という感じです。

$ cd ~/ffmpeg_sources
$ wget -O nasm-2.15.03.tar.bz2 https://www.nasm.us/pub/nasm/releasebuilds/2.15.03/nasm-2.15.03.tar.bz2

$ tar -jxvf nasm-2.15.03.tar.bz2
$ cd nasm-2.15.03

$ ./autogen.sh
$ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"

$ make -j4
$ make install

次に、シンボリックリンクを張ります。
これをやっておかないとx265コンパイル時にエラーが出てコンパイルできません。

$ sudo ln -s ~/bin/nasm /usr/bin/nasm

libaomのインストール

$ cd ~/ffmpeg_sources
$ git -C aom pull 2> /dev/null || git clone --depth 1 https://aomedia.googlesource.com/aom

$ mkdir -p aom_build && cd aom_build

$ PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED=off -DENABLE_NASM=on ../aom

$ PATH="$HOME/bin:$PATH" make -j4
$ make install

libx264のインストール

$ cd ~/ffmpeg_sources
$ git -C x264 pull 2> /dev/null || git clone --depth 1 https://code.videolan.org/videolan/x264.git

$ cd x264
$ PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static --enable-pic

$ PATH="$HOME/bin:$PATH" make -j4
$ make install

libx265のインストール

$ sudo apt install mercurial
$ cd ~/ffmpeg_sources
$ if cd x265 2> /dev/null; then hg pull && hg update && cd ..; else hg clone https://bitbucket.org/multicoreware/x265; fi
$ cd x265/build/linux

$ PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED=off ../../source

$ PATH="$HOME/bin:$PATH" make -j4
$ make install

libvpxのインストール

$ cd ~/ffmpeg_sources
$ git -C libvpx pull 2> /dev/null || git clone --depth 1 https://chromium.googlesource.com/webm/libvpx.git
$ cd libvpx
$ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm

$ PATH="$HOME/bin:$PATH" make -j4
$ make install

libfdk-aacのインストール
※ライセンスの関係上、libfdk-aacを組み込んだffmpegは配布が不可能になります。

$ cd ~/ffmpeg_sources
$ git -C fdk-aac pull 2> /dev/null || git clone --depth 1 https://github.com/mstorsjo/fdk-aac
$ cd fdk-aac
$ autoreconf -fiv
$ ./configure --prefix="$HOME/ffmpeg_build" --disable-shared

$ make -j4
$ make install

libmp3lameのインストール

$ cd ~/ffmpeg_sources
$ wget -O lame-3.100.tar.gz https://downloads.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz
$ tar -zxvf lame-3.100.tar.gz
$ cd lame-3.100
$ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --disable-shared --enable-nasm

$ PATH="$HOME/bin:$PATH" make -j4
$ make install

libopusのインストール

$ cd ~/ffmpeg_sources
$ git -C opus pull 2> /dev/null || git clone --depth 1 https://github.com/xiph/opus.git
$ cd opus
$ ./autogen.sh
$ ./configure --prefix="$HOME/ffmpeg_build" --disable-shared

$ make -j4
$ make install

twolameのインストール

$ cd ~/ffmpeg_sources
$ wget -O twolame-0.4.0.tar.gz https://downloads.sourceforge.net/twolame/twolame-0.4.0.tar.gz
$ tar -zxvf twolame-0.4.0.tar.gz
$ cd twolame-0.4.0
$ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --disable-shared

$ make -j4
$ make install

wavpackのインストール

$ cd ~/ffmpeg_sources
$ wget -O wavpack-5.3.0.tar.bz2 http://www.wavpack.com/wavpack-5.3.0.tar.bz2
$ tar -jxvf wavpack-5.3.0.tar.bz2
$ cd wavpack-5.3.0
$ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --disable-shared

$ make -j4
$ make install

liboggのインストール

$ cd ~/ffmpeg_sources

$ wget -O libogg-1.3.4.tar.gz https://downloads.xiph.org/releases/ogg/libogg-1.3.4.tar.gz

$ tar -zxvf libogg-1.3.4.tar.gz
$ cd libogg-1.3.4 $ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --disable-shared

$ PATH="$HOME/bin:$PATH" make -j4
$ make install

libtheoraのインストール

$ cd ~/ffmpeg_sources
$ wget -O libtheora-1.1.1.tar.bz2 http://downloads.xiph.org/releases/theora/libtheora-1.1.1.tar.bz2
$ tar -jxvf libtheora-1.1.1.tar.bz2
$ cd libtheora-1.1.1
$ PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --disable-shared

$ make -j4
$ make install

png2theora.c:(.text+0x251): undefined reference to `png_sizeof’
のようなエラーが出た場合
example/png2theora.c の465行目と467行目あたりに

3*height*width*png_sizeof(*row_data));
height*png_sizeof(*row_pointers));

と書かれているので

3*height*width*sizeof(*row_data));
height*sizeof(*row_pointers));

のように「png_sizeof」を「sizeof」に書き直してから再度「make」「make install」を実行します。

参照
https://qiita.com/y_irabu/items/5f46002a4dcd89daf73c


libvorbisのインストール

$ cd ~/ffmpeg_sources
$ wget -O libvorbis-1.3.7.tar.gz https://downloads.xiph.org/releases/vorbis/libvorbis-1.3.7.tar.gz
$ tar -zxvf libvorbis-1.3.7.tar.gz
$ cd libvorbis-1.3.7
$ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --disable-shared

$ make -j4
$ make install

libopenjpegのインストール

$ cd ~/ffmpeg_sources
$ wget -O openjpeg-2.3.1.tar.gz https://github.com/uclouvain/openjpeg/archive/v2.3.1.tar.gz
$ tar -zxvf openjpeg-2.3.1.tar.gz
$ cd openjpeg-2.3.1

$ mkdir build
$ cd build
$ cmake -G "Unix Makefiles" .. -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DBUILD_PKGCONFIG_FILES=ON -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release
 
$ PATH="$HOME/bin:$PATH" make -j4
$ make install

libudfreadのインストール

$ cd ~/ffmpeg_sources
$ git -C libudfread pull 2> /dev/null || git clone --depth 1 git://github.com/vlc-mirror/libudfread.git

$ cd libudfread
$ autoreconf -fiv

$ PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --disable-shared --enable-static

$ PATH="$HOME/bin:$PATH" make -j4
$ make install

libxml2のインストール

$ sudo apt install python-dev

$ cd ~/ffmpeg_sources
$ wget -O libxml2-git-snapshot.tar.gz ftp://xmlsoft.org/libxml2/libxml2-git-snapshot.tar.gz
$ tar -zxvf libxml2-git-snapshot.tar.gz

$ cd libxml2-2.9.7
$ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --disable-shared

$ make -j4
$ make install

libblurayのインストール

$ sudo apt install liblzma-dev
$ cd ~/ffmpeg_sources
$ git -C libbluray pull 2> /dev/null || git clone --depth 1 git://git.videolan.org/libbluray.git

$ cp -r libudfread/src libbluray/contrib/libudfread/src
$ cd libbluray

$ autoreconf -fiv
$ PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build"  --disable-shared --enable-static --enable-udf --disable-bdjava-jar

$ PATH="$HOME/bin:$PATH" make -j4
$ make install

libopencore-amrのインストール

$ cd ~/ffmpeg_sources
$ wget -O opencore-amr-0.1.5.tar.gz http://downloads.sourceforge.net/project/opencore-amr/opencore-amr/opencore-amr-0.1.5.tar.gz
$ tar -zxvf opencore-amr-0.1.5.tar.gz
$ cd opencore-amr-0.1.5

$ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --disable-shared

$ make -j4
$ make install

libwebpのインストール

$ cd ~/ffmpeg_sources
$ wget -O libwebp-1.1.0.tar.gz https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.1.0.tar.gz

$ tar -zxvf libwebp-1.1.0.tar.gz
$ cd libwebp-1.1.0

$ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --disable-shared

$ make -j4
$ make install

libspeexのインストール

$ cd ~/ffmpeg_sources
$ wget -O speex-1.2.0.tar.gz https://downloads.xiph.org/releases/speex/speex-1.2.0.tar.gz

$ tar -zxvf speex-1.2.0.tar.gz
$ cd speex-1.2.0

$ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --disable-shared

$ make -j4
$ make install

libsoxrのインストール

$ cd ~/ffmpeg_sources

$ wget -O soxr-0.1.3-Source.tar.xz https://downloads.sourceforge.net/soxr/soxr-0.1.3-Source.tar.xz

$ tar -Jxvf soxr-0.1.3-Source.tar.xz
$ cd soxr-0.1.3-Source

$ mkdir build
$ cd build
$ cmake -G "Unix Makefiles" .. -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DBUILD_SHARED_LIBS=NO -DWITH_OPENMP=NO

$ make -j4
$ make install

zlibのインストール

$ cd ~/ffmpeg_sources
$ wget -O zlib-1.2.11.tar.gz http://www.zlib.net/zlib-1.2.11.tar.gz

$ tar -zxvf zlib-1.2.11.tar.gz
$ cd zlib-1.2.11

$ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --static

$ make -j4
$ make install

OpenH264のインストール

$ cd ~/ffmpeg_sources
$ git -C openh264 pull 2> /dev/null || git clone --depth 1 https://github.com/cisco/openh264.git

$ cd openh264

$ PATH="$HOME/bin:$PATH" make -j4
$ PATH="$HOME/bin:$PATH" make PREFIX="$HOME/ffmpeg_build" install-static

gmpのインストール


$ cd ~/ffmpeg_sources
$ wget -O gmp-6.2.0.tar.xz https://gmplib.org/download/gmp/gmp-6.2.0.tar.xz

$ tar -Jxvf gmp-6.2.0.tar.xz
$ cd gmp-6.2.0

$ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --enable-cxx

$ make -j4
$ make install

libzimgのインストール

$ cd ~/ffmpeg_sources
$ git -C zimg pull 2> /dev/null || git clone --depth 1 https://github.com/sekrit-twc/zimg.git

$ cd zimg
$ ./autogen.sh
$ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --disable-shared

$ make -j4
$ make install

libgmeのインストール

$ cd ~/ffmpeg_sources
$ wget -O game-music-emu-0.6.3.tar.xz https://bitbucket.org/mpyne/game-music-emu/downloads/game-music-emu-0.6.3.tar.xz

$ tar -Jxvf game-music-emu-0.6.3.tar.xz
$ cd game-music-emu-0.6.3

$ mkdir build
$ cd build

$ cmake -G "Unix Makefiles" ../ -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DENABLE_UBSAN=OFF

$ make -j4
$ make install

libgsmのインストール

cd ~/ffmpeg_sources
wget -O gsm-1.0.19.tar.gz http://www.quut.com/gsm/gsm-1.0.19.tar.gz

tar -zxvf gsm-1.0.19.tar.gz
cd gsm-1.0-pl19

make -j4

cp lib/libgsm.a ~/ffmpeg_build/lib
cp inc/gsm.h ~/ffmpeg_build/include

ffmpegのインストール
ようやくffmpegのコンパイルです。
ffmpegのコンパイルには時間がかかるので気長に待ちます。

ちなみに、Linux Mintを入れている自分のオンボロノートパソコンではCPU(2コア、2スレッド)をフルに使っても30分程度かかりました。

$ sudo apt install libunistring-dev

$ cd ~/ffmpeg_sources
$ wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
$ tar -jxvf ffmpeg-snapshot.tar.bz2

$ cd ffmpeg
$ PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./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" --bindir="$HOME/bin" --enable-gpl --enable-version3 --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libbluray --enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree --enable-libtwolame --enable-libwavpack --enable-libopenjpeg --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-opengl --enable-libwebp --enable-libspeex --enable-libsoxr --enable-zlib --enable-libopenh264 --enable-gmp --enable-libzimg --enable-libgme --enable-libgsm

$ PATH="$HOME/bin:$PATH" make -j4
$ make install

$ hash -r
$ source ~/.profile

コンパイルが完了し make install すれば、~/bin の中に「ffmpeg」「ffplay」「ffprobe」などができているはずです。


動作確認
最後にffmpegがちゃんと動作するか確認をします。
サンプルの動画などがあればエンコードしてみましょう。

$ ffmpeg -threads 0 -y -i ~/Desktop/InputFile.mpg -c:v libx264 -mbd 2 -coder 1 -bufsize 8192k -g 300 -s 1280x720 -aspect 16:9 -r 30000/1001 -crf 20 -preset medium -tune animation -c:a libfdk_aac -b:a 128k -ac 2 -ar 44100 -vol 256 -f mp4 ~/Desktop/OutputFile.mp4

上記の例では、Desktopにある「InputFile.mpg」を以下の設定でエンコードし「OutputFile.mp4」として出力しています。

【動画コーデック】libx264
【解像度】1280×720
【アスペクト比】16:9
【毎秒フレームレート】29.97fps
【動画ビットレート】CRF20(可変ビットレート)
【プリセット】medium
【チューニング】animation

【音声コーデック】FDK-AAC
【音声ビットレート】128kbps
【オーディオチャンネル】ステレオ
【サンプリング周波数】44.100kHz

CPUが貧弱だとエンコードに結構時間がかかるので、必要に応じて解像度を小さくするなどしてください。

エンコード中…
screenshot20200727

エンコードが完了したら、再生してみましょう。
せっかくffplayも出力されているので、ffplayで再生してみます。

$ ffplay ~/Desktop/OutputFile.mp4

ちゃんと再生されました。
Screenshot20200727_2


ffmpegやライブラリをアンインストールしたい場合
以下のようにディレクトリを削除してしまえばOKです。

$ rm -rf ~/ffmpeg_build ~/bin/{ffmpeg,ffprobe,ffplay,x264,lame,nasm,ndisasm}

ソースコードなども削除したい場合は、~/ffmpeg_sourcesを加えます。

rm -rf ~/ffmpeg_build ~/ffmpeg_sources ~/bin/{ffmpeg,ffprobe,ffplay,x264,lame,nasm,ndisasm}

以上です。
備忘録なので数多くのライブラリをコンパイルしていますが、正直こんなに必要ありませんよね。

個人用途で使うのであれば自分が必要だと思うものだけ入れて、あとは省いてしまって構わないと思います。


参考にさせていただいたサイト様

Compile FFmpeg for Ubuntu, Debian, or Mint
https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu

[FFmpeg] ライブラリ全部入り
https://qiita.com/pb_tmz08/items/f57b3b121dd9c4e0318e

Unable to compile FFmpeg on Ubuntu 20.04
https://askubuntu.com/questions/1252997/unable-to-compile-ffmpeg-on-ubuntu-20-04

General Documentation
https://www.ffmpeg.org/general.html

お気に入りの動画を携帯で見よう
http://blog.k-tai-douga.com/

コメントを残す