Ubuntu 16.04: FFmpeg 3.0をビルドしてインストールする

Ubuntu 16.04ではデフォルトでFFmpegが入るようになってるようですが、Ubuntu 16.04へFFmpegをインストールする方法とそのライブラリをC++ソースコードで利用する手順をまとめました。

Ubuntu 14.04でも確認しております。

 

1 FFmpegとは

ffmpegコマンドを含む、ビデオ・オーディオをデコード・編集・エンコード

するツール・ライブラリです。

configureを叩いただけではH264のデコードはできるがエンコードができない状態になるっぽいので、エンコードもできるようにしました。

H264のエンコードにはOpenH264かNVENCを用いる方法がサポートされており、ここではOpenH264を用います。

2 OpenH264のビルドとインストール

FFmpeg側でv1.5.0を期待しているようです。configureとかないのでそのままmakeします。/usr/local配下にインストールされます。

sudo apt-get install -y nasm
git clone https://github.com/cisco/openh264
cd openh264
git checkout v1.5.0 -b v1.5.0
make && sudo make install

3 FFmpegのビルドとインストール

configureを叩いてmakeします。configureでprefixを指定しない場合、/usr/local配下にインストールされます。

$ sudo apt-get build-dep -y ffmpeg
$ git clone https://github.com/FFmpeg/FFmpeg
$ cd FFmpeg
$ git checkout n3.0.1 -b n3.0.1
$ ./configure \
  --toolchain=hardened \
  --enable-libopenh264 \
  --enable-gpl \
  --enable-shared \
  --disable-stripping \
  --disable-decoder=libopenjpeg \
  --disable-decoder=libschroedinger \
  --enable-avresample \
  --enable-avisynth \
  --enable-gnutls \
  --enable-ladspa \
  --enable-libass \
  --enable-libbluray \
  --enable-libbs2b \
  --enable-libcaca \
  --enable-libcdio \
  --enable-libflite \
  --enable-libfontconfig \
  --enable-libfreetype \
  --enable-libfribidi \
  --enable-libgme \
  --enable-libgsm \
  --enable-libmodplug \
  --enable-libmp3lame \
  --enable-libopenjpeg \
  --enable-libopus \
  --enable-libpulse \
  --enable-librtmp \
  --enable-libschroedinger \
  --enable-libshine \
  --enable-libsnappy \
  --enable-libsoxr \
  --enable-libspeex \
  --enable-libssh \
  --enable-libtheora \
  --enable-libtwolame \
  --enable-libvorbis \
  --enable-libvpx \
  --enable-libwavpack \
  --enable-libwebp \
  --enable-libx265 \
  --enable-libxvid \
  --enable-libzvbi \
  --enable-openal \
  --enable-opengl \
  --enable-x11grab
$ make && sudo make install

export LD_LIBRARY_PATH=/usr/local/libを実行してからffmpegコマンドを実行してください。

$ export LD_LIBRARY_PATH=/usr/local/lib # Please write into ${HOME}/.bashrc
$ ffmpeg
ffmpeg version n3.0.1 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.3.1 (Ubuntu 5.3.1-14ubuntu2.1) 20160413
  configuration: --prefix=/usr/local --toolchain=hardened
  --enable-libopenh264 --enable-gpl --enable-shared --disable-stripping
  --disable-decoder=libopenjpeg --disable-decoder=libschroedinger
  --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa
  --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca
  --enable-libcdio --enable-libflite --enable-libfontconfig
  --enable-libfreetype --enable-libfribidi --enable-libgme
  --enable-libgsm --enable-libmodplug --enable-libmp3lame
  --enable-libopenjpeg --enable-libopus --enable-libpulse
  --enable-librtmp --enable-libschroedinger --enable-libshine
  --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh
  --enable-libtheora --enable-libtwolame --enable-libvorbis
  --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265
  --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl
  --enable-x11grab


  libavutil      55. 17.103 / 55. 17.103
  libavcodec     57. 24.102 / 57. 24.102
  libavformat    57. 25.100 / 57. 25.100
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 31.100 /  6. 31.100
  libavresample   3.  0.  0 /  3.  0.  0
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.101 /  2.  0.101
  libpostproc    54.  0.100 / 54.  0.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'

4 FFmpegのlibavformatを利用してc++ソースコードをビルド

CXXFLAGSやLDLIBSを割り出すのにpkg-configコマンドを用いると楽です。以下は同じディレクトリにある*.ccなファイルを暗黙のターゲットでビルドするMakefileです。

FFMPEG_LIB = libavformat libavutil
LDLIBS := $(shell pkg-config $(FFMPEG_LIB) --libs)
CXXFLAGS = $(shell pkg-config $(FFMPEG_LIB) --cflags)
CXXFLAGS += -Wno-deprecated-declarations $(EXTRA_CXXFLAGS)
PROG := $(patsubst %.cc,%,$(wildcard *.cc))

all: $(PROG)

debug:
        EXTRA_CXXFLAGS=-g $(MAKE) all

clean:
        @$(RM) -f $(PROG)

以下の様なtest.ccという名前のc++コードを用います。FFmpegが提供するヘッダファイルはc++の場合にextern "C"でAPIを囲む処理の記述がないようなので、include文自体をextern "C"で囲みます。

#include <iostream>

extern "C" {
#include <libavformat/avformat.h>
}

int main()
{
  av_register_all();
  AVFrame *dummy = av_frame_alloc();
  av_frame_free(&dummy);
  return 0;
}

ビルドできました。export LD_LIBRARY_PATH=/usr/local/libを実行してからコマンドを実行してください。

$ ls
Makefile  test.cc
$ make
g++ -I/usr/local/include -Wno-deprecated-declarations     test.cc
-L/usr/local/lib -lavformat -lavutil -o test
$ ls
Makefile  test  test.cc