記念すべき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が貧弱だとエンコードに結構時間がかかるので、必要に応じて解像度を小さくするなどしてください。
エンコード中…
エンコードが完了したら、再生してみましょう。
せっかくffplayも出力されているので、ffplayで再生してみます。
$ ffplay ~/Desktop/OutputFile.mp4
ちゃんと再生されました。
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/