Linux Mint 21でffmpegをソースからコンパイル

ffmpeg

今回は、Linux Mint 21でffmpegをソースコードからコンパイルする方法をご紹介したいと思います。ビルド環境は Linux Mint 21 Vanessa 64bit です。ライブラリはこんなに必要ではないと思うので、各自必要なものをコンパイルしてください。

下準備

$ sudo apt install autoconf automake build-essential cmake git 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 ccache

$ mkdir -p ~/ffmpeg_sources ~/bin ~/ffmpeg_build

NASM

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

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

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

$ PATH="$HOME/bin:$PATH" make -j4 CC="ccache gcc" CXX="ccache g++"
$ make install

libaom

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

$ 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 -DCMAKE_C_COMPILER="/usr/lib/ccache/gcc" -DCMAKE_CXX_COMPILER="/usr/lib/ccache/g++" ../aom

$ PATH="$HOME/bin:$PATH" make -j4 CC="ccache gcc" CXX="ccache g++"
$ make install

libx264

自分が使っているmakeする際のプロファイル(x264_sample.y4m)は こちら にあります。7zipで圧縮されているので解凍します。中にx264_sample.y4mがあるので、ホームディレクトリ直下に置いてください。

$ 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 fprofiled VIDS="$HOME/x264_sample.y4m" -j4 CC="ccache gcc" CXX="ccache g++"
$ 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 http://hg.videolan.org/x265; fi
$ cd x265/build/linux

$ PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED=off -DCMAKE_C_COMPILER="/usr/lib/ccache/gcc" -DCMAKE_CXX_COMPILER="/usr/lib/ccache/g++" ../../source

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 CC="ccache gcc" CXX="ccache g++"
$ make install

fdk-aac

Fraunhofer FDK AAC は、ドイツの Fraunhofer IIS によって開発された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 CC="ccache gcc" CXX="ccache g++"
$ 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 CC="ccache gcc" CXX="ccache g++"
$ 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 CC="ccache gcc" CXX="ccache g++"
$ 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 CC="ccache gcc" CXX="ccache g++"
$ make install

wavpack

$ cd ~/ffmpeg_sources
$ wget -O wavpack-5.5.0.tar.bz2 http://www.wavpack.com/wavpack-5.5.0.tar.bz2
$ tar -jxvf wavpack-5.5.0.tar.bz2
$ cd wavpack-5.5.0

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

$ make -j4 CC="ccache gcc" CXX="ccache g++"
$ make install

libogg

$ cd ~/ffmpeg_sources
$ wget -O libogg-1.3.5.tar.gz https://downloads.xiph.org/releases/ogg/libogg-1.3.5.tar.gz
$ tar -zxvf libogg-1.3.5.tar.gz
$ cd libogg-1.3.5

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

$ PATH="$HOME/bin:$PATH" make -j4 CC="ccache gcc" CXX="ccache g++"
$ 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 CC="ccache gcc" CXX="ccache g++"
$ make install
png2theora.c:(.text+0x251): undefined reference to `png_sizeof'
png2theora.c:(.text+0x277): undefined reference to `png_sizeof'

とエラーが出た場合、examples/png2theora.c465行目467行目あたりに

// 465行目
3*height*width*png_sizeof(*row_data));

// 467行目
height*png_sizeof(*row_pointers));

とあるので、この中の「png_sizeof」を「sizeof」に書きなおして、「make」「make install」してください。

FFmpeg:コーデック増し増しインストール - Qiita
#FFmpeg コーデック増し増しインストール2015/01/07 版 初校FFmpeg を使うか使わないかわからない、意味もよくわからず、コーデック増し増しでインストールしてみました。最後に…

aoTuV (libvorbis)

aoTuV (AOyumi TUned Vorbis) とは、蒼弓さんがチューニング・開発・配布を行っている Vorbis エンコーダです。

$ cd ~/ffmpeg_sources

$ git clone https://github.com/AO-Yumi/vorbis_aotuv.git
$ cd vorbis_aotuv

$ sudo chmod +x configure
$ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --disable-shared
$ PATH="$HOME/bin:$PATH" make -j4 CC="ccache gcc" CXX="ccache g++"
$ make install

libopenjpeg

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

$ 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 -DCMAKE_C_COMPILER="/usr/lib/ccache/gcc" -DCMAKE_CXX_COMPILER="/usr/lib/ccache/g++"
 
$ PATH="$HOME/bin:$PATH" make -j4 CC="ccache gcc" CXX="ccache g++"
$ make install

libxml2

$ sudo apt install python3

$ 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.13

$ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --disable-shared
$ make -j4 CC="ccache gcc" CXX="ccache g++"
$ make install

libwebp

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

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

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

$ make -j4 CC="ccache gcc" CXX="ccache g++"
$ 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 CC="ccache gcc" CXX="ccache g++"
$ PATH="$HOME/bin:$PATH" make PREFIX="$HOME/ffmpeg_build" install-static

FFmpeg

$ 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-libvpx --enable-libx264 --enable-libx265 --enable-nonfree --enable-libtwolame --enable-libopenjpeg --enable-opengl --enable-libwebp --enable-libopenh264 --enable-libxml2

$ PATH="$HOME/bin:$PATH" make -j4 CC="ccache gcc" CXX="ccache g++"
$ make install

$ hash -r
$ source ~/.profile

~/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 -filter:a volume=-2dB -f mp4 ~/Desktop/OutputFile.mp4

上記の例では Desktop にある「InputFile.mpg」を以下の設定でエンコードし 同じく Desktop に「OutputFile.mp4」として出力しています。あと、しばらく見ないうちに -vol オプションが廃止されていたことに驚きました。今では「-filter:a volume=-2dB」みたいに指定するんですねぇ。

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

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

以下はエンコード中の画像です。

エンコードが完了したら、出力された動画を再生してみましょう。

無事に再生されたら完了です。お疲れ様でした。

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}

参照元サイト

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

https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu
[FFmpeg] ライブラリ全部入り - Qiita
ffmpeg 全部入り5年くらい前に仕事でFFmpegに出会って以来、公私ともどもずっとお世話になっているので、そろそろ本気出して出来る限り多くのライブラリをリンクさせようと思ったのが9月初旬。…
Unable to compile FFmpeg on Ubuntu 20.04
I am following this compilation guide for FFmpeg. After compiling all the required dependencies, I get the following err...
General Documentation
FFMPEGで音声のボリュームを変更する | 技術的特異点
FFMPEGを使うことで音声のボリュームを変更することができます。 少し音量が小さいと感じる音声データ等に対し

各種ライブラリの公式サイト

NASM
x264, the best H.264/AVC encoder - VideoLAN
x264, the best H.264/AVC encoder
x265, the free H.265/HEVC encoder - VideoLAN
x265, the free H.265/HEVC encoder
LAME MP3 Encoder
TwoLAME - MPEG Audio Layer 2 Encoder
WavPack downloads
https://xiph.org/downloads/
aoTuV
aoTuV - Ogg Vorbis Encoder
OpenJPEG
Downloading and Installing WebP  |  Google for Developers
FFmpeg

コメント