Archive

Posts Tagged ‘build’

Build latest ffmpeg from source

2012/01/11 1 comment

FFmpeg logoI use ffmpeg a lot in my work because I need to process lots of multimedia resources programmatically (without human intervention). The prebuilt binaries of ffmpeg usually suffice for your average encoding/decoding tasks (if due to your particular needs you lack certain propietary codecs you can always grab a more codec-rich build such as the one medibuntu offers). But sometimes you need advanced features such as filters (overlays,  scaling, padding…) and since filters are a constantly evolving feature it is interesting to know how to build ffmpeg from source.

Removing old stuff and solving dependencies

First, you need to install git (if you don’t already have it):

sudo apt-get install git

Next, uninstall any previous ffmpeg builds from your system (if you’re building ffmpeg with x264 support like I’m going to do, uninstall x264 as well):

sudo apt-get remove ffmpeg x264 libx264-dev
sudo apt-get autoremove

Now we need to install a bunch of dependencies. This list may vary depending on the ffmpeg configuration you want to use. Don’t worry too much if you forget about some codec or dependency at this point, ffmpeg will tell you if something’s missing in the configuration step.

In my case, I wanted as many codecs as I could remember available to ffmpeg so as you can see the dependency list is quite long:

sudo apt-get install build-essential git-core checkinstall yasm texi2html \
     libfaac-dev libjack-jackd2-dev libmp3lame-dev libopencore-amrnb-dev \
     libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libva-dev libvdpau-dev \
     libvorbis-dev libvpx-dev libx11-dev libxfixes-dev libxvidcore-dev \
     zlib1g-dev librtmp-dev libgsm0710-dev libgsm0710mux-dev libgsm1-dev \
     libgsmme-dev libschroedinger-dev libspeechd-dev libspeex-dev \
     libspeexdsp-dev libspeex-ocaml-dev libdc1394-22-dev

Ok, if you read the dependency list (did you, really?) you’ll have noticed that x264 isn’t among the installed packages. The reason is that I’ll also be building x264 from source because the prebuilt binaries (I’m talking about the ones in Ubuntu’s repository) seem to be too old for the ffmpeg we’re about to build.

Building x264 as a shared library

First, clone x264‘s git repository to grab the latest version of the code. Then, use the –enable-shared flag when configuring to build it as a shared library, otherways ffmpeg won’t be able to use it.

cd
git clone git://git.videolan.org/x264.git
cd x264
./configure --enable-shared
make
sudo make install

Optionally, you can use checkinstall to build a .deb package and thus make the binaries redistributable:

sudo checkinstall --pkgname=libx264 \
    --pkgversion="2:0.$(grep X264_BUILD x264.h -m1 | \
    cut -d' ' -f3).$(git rev-list HEAD | wc -l)+git$(git rev-list HEAD -n 1 | \
    head -c 7)" --backup=no --deldoc=yes \
    --fstrans=no --default

Well, now that we’ve got all the libraries we need it’s time to build our customized ffmpeg.

Building ffmpeg

Since  January 2011 ffmpeg no longer uses svn to host the code, you should keep this in mind when you read other ffmpeg tutorials (they may be outdated).

cd
git clone git://source.ffmpeg.org/ffmpeg.git
cd ffmpeg
./configure --enable-avfilter --enable-vdpau --enable-bzlib \
    --enable-libgsm --enable-libschroedinger --enable-libspeex \
    --enable-pthreads --enable-zlib --enable-libvpx \
    --disable-stripping --enable-runtime-cpudetect \
    --enable-vaapi --enable-swscale --enable-libdc1394 \
    --enable-shared --disable-static --enable-librtmp \
    --enable-gpl --enable-version3 --enable-nonfree \
    --enable-postproc --enable-libfaac --enable-libmp3lame \
    --enable-libopencore-amrnb --enable-libopencore-amrwb \
    --enable-libtheora --enable-libvorbis --enable-libx264 \
    --enable-libxvid --enable-x11grab --enable-filter=movie
make
sudo make install

Building ffmpeg takes quite some time, be patient. When everything’s done, call ffmpeg without parameters to see if it works.

In my case it didn’t, so I had to use strace to find out what was wrong.

Fixing runtime problems

sudo strace ffmpeg

Reveals the following:

access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
(...)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)

It seems ffmpeg is trying to access two files that don’t exist. I’ll create them and see if that works.

sudo touch /etc/ld.so.nohwcap
sudo touch /etc/ld.so.preload

And… that actually worked!

Now you have a fully functional customized ffmpeg build. Congratulations.

If you want to know more about the latest features and examples of ffmpeg filters, please check out the libavfilter documentation.