*

LinuxでFFmpegをほぼ全自動でビルドする(CentOS、Ubuntu等に対応)

  最終更新日:2015/12/01

Pocket

FFmpeg build

 LinuxでFFmpegをほぼ全自動でビルドする方法をまとめました。開発環境のパッケージをインストールして、後はスクリプトを実行するだけでビルド&インストールまで行うことができます。

 ビルドするFFmpegは、libavcodecでサポートされている標準エンコーダの他に以下のエンコーダを追加します。

スポンサーリンク

前置き

 この情報は以下のFFmpegのWikiの情報を元にまとめました。

 本記事を最後まで読んで、なおかつ上記Wikiのページを見ると分かりますが、スクリプトの内容はほぼ同じです。では、Wikiを見れば良いではないかと思われるでしょうが、Wikiの手順通りに実行すると少し問題が発生します。手順通りだとFFmpegを自分のホームディレクトリにインストールすることになり、自分以外使えないものになってしまうのです。

 そこで、その困った状況を解消して誰でも使えるようにFFmpegをビルドしようと言うのが本記事の内容です。なお、複数のライブラリをインストールしますが、インストール済みのライブラリのパッケージとは競合しないので既存環境を汚しません。

 本記事の内容は64bit版(amd64)のLinux OSで実行して下さい。32bit版(i386)ではビルドに失敗します。

開発環境構築

 開発環境を構築するために必要なパッケージをインストールします。以下のコマンドを実行して下さい。UbuntuとCentoOSの場合で異なります。試してはいませんが、DebianとMintでもUbuntuと同じ方法でインストールできると思います。

・CentOS
# yum -y install autoconf automake cmake freetype-devel gcc gcc-c++ git \
   libtool make mercurial nasm pkgconfig zlib-devel

・Ubuntu
# sudo apt-get -y --force-yes install autoconf automake build-essential \
   cmake git libass-dev libfreetype6-dev libgpac-dev libsdl1.2-dev \
   libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev \
   libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev mercurial pkg-config \
   texi2html zlib1g-dev

FFmpegビルド

 以下の手順でコマンドを実行します。スクリプトの内容は本記事の最後に掲載しています。

 スクリプトはrootユーザーで実行して下さい(sudoでも可)。ユーザーIDをチェックしているので、root以外で実行すると失敗します。なお、デフォルトのインストール先は”/usr/local/ffmpeg_build”ディレクトリになります。

# vi ffmpeg_build.sh

  ・FFmpegビルドスクリプトの内容をコピペします。
  ・ソースコードを展開するディレクトリは変数src_dirにて変更可能
  ・実行ファイル、ライブラリのインストール先は変数prefix_dirにて変更可能

# chmod +x ffmpeg_build.sh
# ./ffmpeg_build.sh

  ・正常に進めば30分未満で終了

 スクリプトの実行が完了したら、PATH環境変数にFFmpegのインストール先を追加して下さい。インストール先を変更していない場合、以下の手順内容になります。

・共通
$ export PAHT=$PATH:/usr/local/ffmpeg_build/bin

・CentOS
$ vi .bash_profile

  変更前)
   PATH=$PATH:$HOME/.local/bin:$HOME/bin

  変更後)
   PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/ffmpeg_build/bin

・Ubuntu
$ vi .bashrc

  以下をファイル末尾に追記
  export PATH=$PATH:/usr/local/ffmpeg_build/bin

FFmpegビルドスクリプト

 ダブルクリックするとスクリプト全体を選択した状態になるのでCtrl+Cでコピーして下さい。

 FFmpegも関連するエンコーダも日々更新されるため、ビルドに失敗することがあります。その際はコメント欄から遠慮なくご連絡下さい。その際は必ずLinuxの種類とバージョンの情報、コンソールに表示されたエラーの内容をお知らせ頂くようお願いいたします。調査の上、回答いたします。

 並列コンパイルに対応しているので、3行目の”cpu_core=2”となっている箇所をビルド環境のCPUコア数に応じて変更して下さい。例えば、CPUコア数が4の時は”cpu_core=4”として下さい。

 ビルドするエンコーダを選択できるようにしています。4行目以降の”enable_xxx=1”の箇所を”=0”にするとビルド対象外になります。例えばVP8が不要であれば、6行目を”enable_vp8=0”としてください。

#!/bin/sh
 
cpu_core=2
enable_h264=1
enable_h265=1
enable_vp8=1
enable_aac=1
enable_mp3=1
enable_ogg=1
enable_opus=1
enable_ass=1
 
src_dir="$HOME/ffmpeg_sources"
prefix_dir="/usr/local/ffmpeg_build"
 
PATH=$prefix_dir/bin:$PATH
enable_option=""
 
print_error()
{
    echo "error: $1"
}
 
uid=`id | sed 's/uid=\([0-9]\+\)(.\+/\1/'`
 
if [ $uid -ne 0 ];then
    print_error "not root user"
    exit 1
fi
 
mkdir -p $src_dir
mkdir -p $prefix_dir
 
aconf_ver=`LANG=C autoconf -V | head -n 1 | sed -e "s/autoconf (GNU Autoconf) \([0-9]*\)\.\([0-9]*\)/\1\2/"`
if [ $aconf_ver -lt 269 ]; then
    echo "---------- build autoconf ----------"
    wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
    tar xvzf autoconf-2.69.tar.gz 
    cd autoconf-2.69
    ./configure --prefix="$prefix_dir" --bindir="$prefix_dir/bin"
    make
    make install
fi
 
 
echo "---------- build Yasm ----------"
cd $src_dir
git clone --depth 1 git://github.com/yasm/yasm.git
if [ $? -ne 0 ]; then
    print_error "git clone yasm" && exit 1
fi
cd yasm
autoreconf -fiv
./configure --prefix="$prefix_dir" --bindir="$prefix_dir/bin"
make -j${cpu_core}
if [ $? -ne 0 ]; then
    print_error "make yasm" && exit 1
fi
make install
make distclean
 
 
if [ $enable_h264 -eq 1 ]; then
    echo "---------- build libx264  ----------"
    cd $src_dir
    git clone --depth 1 git://git.videolan.org/x264
    if [ $? -ne 0 ]; then
        print_error "git clone x264" && exit 1
    fi
    cd x264
    ./configure --prefix="$prefix_dir" --bindir="$prefix_dir/bin" --enable-static
    make -j${cpu_core}
    if [ $? -ne 0 ]; then
        print_error "make libx264" && exit 1
    fi
    make install
    make distclean
    enable_option="${enable_option} --enable-libx264"
fi
 
 
if [ $enable_h265 -eq 1 ]; then
    echo "---------- build libx265  ----------"
    cd $src_dir
    hg clone https://bitbucket.org/multicoreware/x265/#stable
    if [ $? -ne 0 ]; then
        print_error "hg clone x265" && exit 1
    fi
    cd $src_dir/x265/build/linux
    cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$prefix_dir" -DENABLE_SHARED:bool=off ../../source
    make -j${cpu_core}
    if [ $? -ne 0 ]; then
        print_error "make libx265" && exit 1
    fi
    make install
    make clean
    enable_option="${enable_option} --enable-libx265"
fi
 
 
if [ $enable_aac -eq 1 ]; then
    echo "---------- build libfdk_aac ----------"
    cd $src_dir
    git clone --depth 1 git://git.code.sf.net/p/opencore-amr/fdk-aac
    if [ $? -ne 0 ]; then
        print_error "git clone fdk-aac" && exit 1
    fi
    cd fdk-aac
    autoreconf -fiv
    ./configure --prefix="$prefix_dir" --disable-shared
    make -j${cpu_core}
    if [ $? -ne 0 ]; then
        print_error "make libfdk_aac" && exit 1
    fi
    make install
    make distclean
    enable_option="${enable_option} --enable-libfdk-aac"
fi
 
 
if [ $enable_mp3 -eq 1 ]; then
    echo "---------- build libmp3lame ----------"
    cd $src_dir
    wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
    if [ $? -ne 0 ]; then
        print_error "wget lame" && exit 1
    fi
    tar xzvf lame-3.99.5.tar.gz
    cd lame-3.99.5
    ./configure --prefix="$prefix_dir" --bindir="$prefix_dir/bin" --disable-shared --enable-nasm
    make -j${cpu_core}
    if [ $? -ne 0 ]; then
        print_error "make libmp3lame" && exit 1
    fi
    make install
    make distclean
    enable_option="${enable_option} --enable-libmp3lame"
fi
 
 
if [ $enable_opus -eq 1 ]; then
    echo "---------- build libopus ----------"
    cd $src_dir
    git clone git://github.com/xiph/opus.git
    if [ $? -ne 0 ]; then
        print_error "git clone opus" && exit 1
    fi
    cd opus
    ./autogen.sh
    ./configure --prefix="$prefix_dir" --disable-shared
    make -j${cpu_core}
    if [ $? -ne 0 ]; then
        print_error "make libopus" && exit 1
    fi
    make install
    make distclean
    enable_option="${enable_option} --enable-libopus"
fi
 
 
if [ $enable_ogg -eq 1 ]; then
    echo "---------- build libogg  ----------"
    cd $src_dir
    wget http://downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.gz
    if [ $? -ne 0 ]; then
        print_error "wget libogg" && exit 1
    fi
    tar xzvf libogg-1.3.2.tar.gz
    cd libogg-1.3.2
    ./configure --prefix="$prefix_dir" --disable-shared
    make -j${cpu_core}
    if [ $? -ne 0 ]; then
        print_error "make libogg" && exit 1
    fi
    make install
    make distclean
 
    echo "---------- build libvorbis ----------"
    cd $src_dir
    wget http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.4.tar.gz
    if [ $? -ne 0 ]; then
        print_error "wget libvorbis" && exit 1
    fi
    tar xzvf libvorbis-1.3.4.tar.gz
    cd libvorbis-1.3.4
    LDFLAGS="-L$prefix_dir/lib" CPPFLAGS="-I$prefix_dir/include" ./configure --prefix="$prefix_dir" --with-ogg="$prefix_dir" --disable-shared
    make -j${cpu_core}
    if [ $? -ne 0 ]; then
        print_error "make libvorbis" && exit 1
    fi
    make install
    make distclean
    enable_option="${enable_option} --enable-libvorbis"
fi
 
 
if [ $enable_vp8 -eq 1 ]; then
    echo "---------- build libvpx ----------"
    cd $src_dir
    git clone --depth 1 https://chromium.googlesource.com/webm/libvpx.git
    if [ $? -ne 0 ]; then
        print_error "git clone libvpx" && exit 1
    fi
    cd libvpx
    ./configure --prefix="$prefix_dir" --disable-examples
    make -j${cpu_core}
    if [ $? -ne 0 ]; then
        print_error "make libvpx" && exit 1
    fi
    make install
    make clean
    enable_option="${enable_option} --enable-libvpx"
fi
 
 
if [ $enable_ass -eq 1 ]; then
    echo "---------- build libass ----------"
    cd $src_dir
    git clone --depth 1 https://github.com/libass/libass.git
    if [ $? -ne 0 ]; then
        print_error "git clone libass" && exit 1
    fi
    cd libass
    autoreconf -fiv
    ./configure --prefix="$prefix_dir" --disable-shared
    make -j${cpu_core}
    if [ $? -ne 0 ]; then
        print_error "make libass" && exit 1
    fi
    make install
    make clean
    enable_option="${enable_option} --enable-libass"
fi
 
 
echo "---------- build FFmpeg ----------"
cd $src_dir
git clone --depth 1 git://source.ffmpeg.org/ffmpeg
if [ $? -ne 0 ]; then
    print_error "git clone ffmpeg" && exit 1
fi
cd ffmpeg
PKG_CONFIG_PATH="$prefix_dir/lib/pkgconfig" ./configure \
  --prefix="$prefix_dir" --extra-cflags="-I$prefix_dir/include" \
  --extra-ldflags="-L$prefix_dir/lib" \
  --bindir="$prefix_dir/bin" \
  --pkg-config-flags="--static" \
  --enable-gpl \
  --enable-nonfree \
  --enable-libfreetype \
  $enable_option
make -j${cpu_core}
if [ $? -ne 0 ]; then
    print_error "make ffmpeg" && exit 1
fi
make install
make distclean
hash -r

スクリプトの更新履歴

  • 2015年10月11日
    • 並列コンパイルに対応
  • 2015年10月14日
    • 並列ビルドに対応
    • ビルド対象のエンコーダを選択可能に変更
    • エラー処理追加
    • CentOS 6.xでopusのビルドに失敗する不具合を修正
  • 2015年11月26日
    • libass(字幕)に対応
  • 2015年12月1日
    • FFmpegのconfigureエラー対策:x265のダウンロードをstable対象に変更
Pocket