Recently I took the time to run a quick comparison test using FFmpeg for producing content with the x264 and xVid codecs. x264 produces H.264 content, while xVid encodes in MPEG4. I was a little surprised with the results.
The input file was sourced from BBC Motion Gallery.
It was an MPEG2 Program Stream with I-Frames, encoded at approximately
50Mbps. It also contained a single MP2 audio track at approximately
356kbps. To see the clip on BBC Motion Gallery, click here.
The clip was chosen because it is only 2 seconds long, so I could
transcode it quickly, and there is also lots of movement, so I expected
The output file container is QuickTime MOV, the video bitrate
around 2Mbps, the audio codec aac (through libfaac) at 128kbps. I
performed a 1 pass and 2 pass encode with x264 and xVid. The output
file was to be 720×404 in size, this is 16:9 aspect ratio. All files
were played back on a Windows XP machine using QuickTime Player 7.1.3.
Some cropping of the original MPEG2 was required to remove VITC at the
top and some black padding left and right. An example FFmpeg command
line I used is outlined below. As you can see, there are very few
optimisations other than the base settings.
FFMPEG command for the second pass x264 encode:
ffmpeg -i 2573-9.mpg -vcodec libx264 -f mov -b 2000k -acodec
libfaac -ab 128k -s 736×442 -croptop 34 -cropbottom 4 -cropleft 8
-cropright 8 -deinterlace -pass 2 2573-9_h264.mov
The final output file sizes are as follows:
- x264 1 pass: 599.558 kilobytes
- x264 2 pass: 553.767 kilobytes
- xVid 1 pass: 577.232 kilobytes
- xVid 2 pass: 559.947 kilobytes
So, while xVid one pass produced smaller file sizes than x264 one
pass, the x264 2 pass file is smaller than the xVid 2 pass file. Due to
the short duration of the input file, no comparison of encoder speed
could really be made. However, anecdotally from other ad hoc encoding
jobs, xVid does seem to be quicker.
Now, to the real proof of the pudding, what was the quality like. Have a look at the following image file, click the thumbnail for a larger version:
This is where I was surprised. The x264 files are on the left. 1
pass is bottom left. 2 pass is top left. The xVid files are on the
right. 1 pass bottom right. 2 pass top right. Clearly, the 1 pass xVid
file is superior to the 1 pass x264 file. I also believe that the 2
pass xVid file is slightly better quality then the 2 pass x264 file.
Areas for close inspection (we’re looking at the two top files here):
- Bottom right corner. There is more blocking and artifacts on the x264 file.
- Top right wing tip. The xVid file has better definition here.
- The underside of the wings and tail. Again the xVid file has better definition.
- The background fire. I think the xVid file has less artifacts and better definition in general.
- As there aren’t a lot of colours in the example video, it’s hard to
say which codec handles colour better, but there is obviously more
depth in each of the 2 pass samples, compared to the 1 pass output.
I was surprised that to my eye the xVid
content appeared to be superior to the x264 output. Perhaps with a more
complext FFmpeg command and options this would have changed.
I wanted to install FFmpeg on my Ubuntu Gutsy
Gibbon (7.10) desktop machine. This is so I can encode and transcode
video files to various formats locally, and also render projects from
the non-linear editor (NLE) PiTiVi.
This post will mainly cover just the commands I used to install FFmpeg on Gutsy, with very little commentary regarding why or how
things work. If you want a more in-depth look at installing FFmpeg, you
can read about the installation
of FFmpeg on my Debian Etch server earlier today – which ultimately
moves me closer to on-the-fly video transcoding of user submitted
content on Kapital Moto TV
Installing FFmpeg on Ubuntu Gutsy:
sudo apt-get build-dep ffmpeg
sudo apt-get install liblame-dev libfaad2-dev libfaac-dev
libxvidcore4-dev liba52-0.7.4 liba52-0.7.4-dev libx264-dev libdts-dev
checkinstall build-essential subversion
svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
make distclean (I used this because I already had an older SVN snapshot of FFMPEG downloaded, configured and made from last night)
./configure –enable-gpl –enable-pp
–enable-libvorbis –enable-libtheora –enable-liba52
–enable-libdc1394 –enable-libgsm –enable-libmp3lame –enable-libfaad
–enable-libfaac –enable-libxvid –enable-pthreads –enable-libx264 –enable-shared
Some things you might want to do when prompted to by checkinstall:
- Select 0 change maintainer name
- Select 3 to set version name. I used svn11213-ubuntu-gutsy-20071213
And that’s it FFmpeg installed on Ubuntu Gutsy.
NB: This How-To is now almost totally worthless as it is so out of date. Please click here for an updated version explaining how to install FFmpeg on Debian Squeeze.
I have to say, that the video manipulation
program FFmpeg, while very powerful, is not very user-friendly when it
comes to installation. While many Linux programs can be happily
installed from either a pre-compiled package, or downloading source and
compiling yourself, this isn’t necessarily the case with FFmpeg. The
ease of FFmpeg installation largely depends on how many different video
codecs and containers you want to be able to input or output. The
greater the number, the exponential increase in installation
difficulty. My main need was for FFmpeg to accept a wide range of input
formats, while outputting H.264 encoded QuickTime (MOV) files. Here’s
how I achieved this on a Debian Etch server……..
I’m going to assume that you are familiar with using the Linux
command prompt, moving between directories, editing text files and have
at least some experience compiling programs.
The first thing I would recommend doing is making an addition to your source repository lists.
Add the following line:
deb http://www.debian-multimedia.org stable main
This repository contains some essential libraries for xvid and
x264 (an open source H.264 codec) amongst other things. You’ll need to
install some software from here. The software may well be available
from other repositories too, that are already in your sources.list
file, but add this one to be safe.
Next rebuild your sources:
I would also recommend installing checkinstall. This program can
be used instead of a regular “make install” command and produces a deb
package file that will make re-installation or multiple machine
installs much easier. If checkinstall isn’t already on your machine
download it from:
Maybe navigate here with lynx, maybe use wget once you’ve found
the actual file you need, maybe download it with a GUI based web
browser and then copy it to your desired directory. It’s your choice. I
grabbed the latest .deb package. After the download, execute the following as root:
dpkg -i checkinstall_1.6.1-1_i386.deb
Checkinstall should have happily installed on your system. Now it’s time to really get into FFmpeg.
Build the dependencies:
apt-get build-dep ffmpeg
Next we’re going to install a whole lot more useful software
that will allow FFmpeg to output many more than just the minimal file
apt-get install liblame-dev libfaad-dev libfaac-dev
libxvidcore4-dev liba52-0.7.4 liba52-0.7.4-dev libx264-dev
We’ve also ensured that you have the necessary tools installed
to compile from source (build-essential) and obtain files from the Subversion version control repositories.
We’re ready to checkout FFmpeg itself:
svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg,
At the time of writing the latest revision was 11212. If you’d
feel more comfortable not using the lastest bleeding edge version of FFmpeg, issue the Subversion command as follows:
svn checkout -r 11212 svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
This will ensure that you are also downloading the 11212 revision. Once downloaded, move into the ffmpeg directory (cd ffmpeg) and configure:
./configure –enable-gpl –enable-pp
–enable-libvorbis –enable-liba52 –enable-libdc1394 –enable-libgsm
–enable-libmp3lame –enable-libfaad –enable-libfaac –enable-pthreads
–enable-libx264 -enable-libxvid –enable-shared
So, what have we done here……
- gpl – allow use of GPL code, the resulting libav* and ffmpeg will be under GPL
- pp – enable GPLed postprocessing support
- libvorbis – enable Vorbis encoding via libvorbis (http://www.vorbis.com/)
- liba52 – enable GPLed liba52 support (http://liba52.sourceforge.net/)
- libdc1394 – enable IIDC-1394 grabbing using libdc1394 and libraw1394 (http://sourceforge.net/projects/libdc1394/)
- libgsm – enable GSM support via libgsm (http://packages.debian.org/testing/sound/libgsm-tools)
- libmp3lame – enable MP3 encoding via libmp3lame (http://lame.sourceforge.net/download.php)
- libfaad – enable FAAD support via libfaad (http://www.audiocoding.com/faad2.html)
- libfaac – enable FAAC support via libfaac (http://www.audiocoding.com/faac.html)
- pthreads – use pthreads (http://en.wikipedia.org/wiki/POSIX_Threads)
- libx264 – enable H.264 encoding via x264 (http://www.videolan.org/developers/x264.html)
- libxvid – enable Xvid encoding via xvidcore, native MPEG-4/Xvid encoder exists (http://www.xvid.org/)
The essence of his information, and many more options, can be found by typing ./configure –help first.
(You might also consider including libtheora in your configuration, but I forgot at the time)
We’re now ready to make the installation files so at the command prompt:
If something goes wrong, and you need to start again, a useful command to know is:
Make sure you do this first and then run the configure command again.
You will be asked a few questions, which should be
straightforward enough to answer – yes to creating the documentation,
choose a name, select D for Debian package, lastly select number 3 and
type a version name that means something to you. Mine was
svn11212-etch-20071213. Checkinstall will now create a Debian package
of FFmpeg, bespoke for your system with the configuration options
you’ve selected earlier. Checkinstall WILL NOT install the package, so
don’t forget to do that:
dpkg -i ffmpeg_svn11212-etch-20071213-1_i386.deb
With some small amount of luck, you should now have a working
version of FFmpeg installed on your Debian Etch server. You will be
able to output H.264 encoded files in a variety of containers.
Now the fun part really begins as you spend days tinkering with
commands to output the best possible files. Documentation for using
FFMPEG can be found at:
(Credit for getting me started in the right direction goes to Paul Battley and his FFmpeg Ubuntu Feisty install how-to)