Installing and using FFmpeg on Mac OS X
The FFmpeg project is a fast, accurate multimedia transcoder which can be applied in a variety of scenarios on OS X.
If you just want to add a good video transcoder to a toolset that already includes Final Cut Pro, Adobe Photoshop, and similar tools, FFmpegX may be your best choice because of its familiar Mac-style user interface.
But it's possible that you are interested in using FFmpeg to set up an automated, web based system to transcode a variety of input video formats to the Flash video format, which can easily be displayed on the web.
In this case it will be neccesary to approach FFmpeg on its own terms as a command-line, Linux-centric project. You will need to learn the installation techniques commonly used by open source projects, and the starting point for your work will be running Terminal and working mostly from the command line. This article will apply these techniques in a step-by-step manner to installing a version of FFmpeg which has most of the features you will need. Some techniques will be used without explanation, so be prepared to do some Googling to fill in the gaps in your knowledge.
Before you can follow these instructions, you must install Apple's Developer Tools.
MP3 is the audio codec most often used with Flash video, so you will need an MP3 encoder. FFmpeg doesn't include one, but it will use LAME, which creates good quality audio files, if you install it. Header files will be needed during the compile, so it is not enough to install a prebuilt binary using a package manager. Instead follow these directions to compile it from source:
Start by creating a working directory:
mkdir ~/lame cd ~/lame
On a good day you can get the latest source code release of LAME from Sourceforge. The file you want will be named lame-3.97.tar.gz or something similar.
If that doesn't work, do what I did and get the bleeding edge release from revision control:
cvs -d:pserver:email@example.com:/cvsroot/lame \ login cvs -z3 \ -d:pserver:firstname.lastname@example.org:/cvsroot/lame \ co -P lame
If you download the tar file, you need to unpack it as follows (this command is not necessary if you used CVS):
tar xvzf lame-3.97.tar.gz
After downloading and unpacking the source or checking it out from CVS, change to the main directory and then enter the three commands which are typically used to build open source projects:
cd lame-3.97 ./configure make sudo make install
Each command will take a minute or so to complete. You should keep an eye out for any errors which may occur, but installing LAME is generally trouble-free.
Optional: FAAC and FAAD
Since Quicktime commonly uses AAC for audio, you may want to encode and decode that format. Here again FFmpeg doesn't include built-in codecs, but it will use the codecs provided by another open source project if you install them first.
Installing these codecs used to be so difficult that I wouldn't even have tried to address it in an introductory article, but recent improvements mean that you can simply download the latest releases and follow the instructions they provide, for example:
mkdir ~/faad cd ~/faad curl -O http://downloads.sourceforge.net/faac/faad2-2.6.1.tar.gz tar xvzf faad2-2.6.1.tar.gz cd faad2 less INSTALL # (follow the instructions you see there)
It's generally a good idea to poke around in the main directory for files named INSTALL and README and pay attention to the instructions there. Often that's all you need.
Building FFmpeg for Mac OS X Leopard
Recent versions of FFmpeg will compile successfully on versions of OS X as far back as 10.3. Before that OS X used an older version of the C compiler which is no longer compatible with FFmpeg. It's possible to get an older version of FFmpeg running on OS X 10.2 (read on), but you may not be satisfied with its capabilities.
If you have a choice it's best to run a recent version of FFmpeg, which means downloading the source code from one of the revision control systems used by the developers, or getting a nightly snapshot. Using revision control for something this simple is pretty easy, and it's a useful technique, so that's what we'll do. Recent versions of Xcode already include Subversion (a newish revision control tool which really isn't so bad), so we'll use that.
First create a working directory:
mkdir ~/ffmpeg cd ~/ffmpeg
The up-to-date version of FFmpeg generally compiles cleanly, and that is the version you usually will want:
svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg cd ffmpeg
Next, configure and make
./configure --enable-libmp3lame --enable-shared \ --disable-mmx --arch=x86_64 make sudo make install
The --disable-mmx flag is not required on a PowerPC. If you leave it out on an Intel Mac, you will probably get a compile error, but it's worth trying since it will provide a speed boost. If you installed the AAC codecs, add the flags --enable-libfaac and --enable-libfaad.
(According to a discussion on ffmpeg-user The "--arch" flag is required under Snow Leopard. Experiment.)
When I tested for this article originally, the latest source in the Subversion repository did not compile cleanly. My workaround was to use a known stable revision. In general, FFmpeg is a moving target and you may encounter new issues that I did not. See the mailing lists for the latest information. Here's how to build FFmpeg if you have problems with the latest release
cd ~/ffmpeg svn checkout --revision 15624 \ svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg-15624 cd ffmpeg-15624 ./configure --enable-libmp3lame --enable-shared --disable-mmx make sudo make install
Once again, the --disable-mmx flag is not required on a PowerPC-based Mac. There is nothing special about revision 15624, it's just a version that happened to compile when this article was revised. If FFmpeg is not compiling on OS X because of a recent change, subtracting a small amount from the latest revision number will probably fix the issue. Work your way backwards until you find something that works.
Congratulations, you've installed FFmpeg. The next section describes a similar procedure for OS X 10.2, so skip ahead for additional information on running FFmpeg.
Building FFmpeg for Mac OS X 10.2
[Update: the OS X 10.2 procedure results in an ffmpeg binary that can decode only some of the video formats listed in the ffmpeg documentation. In particular, it can't decode Quicktime video. Take this into account before you go to the trouble of downloading and compiling it. On the other hand, this is one of the few free alternatives to Macromedia Flash for converting mpeg into Flash video, and you may be able to convert Quicktime to mpeg by other means.]
Start by creating a build directory:
mkdir ~/ffmpeg cd ~/ffmpeg
Compiling on OS X 10.2 requires a patch, and it makes sense to patch against a known release. So we will download a recent release, which can be found by clicking here, and unpack it:
tar xvzf ffmpeg-0.4.9-pre1.tar.gz
gzip -d ffmpeg-0.4.9-pre1-macosx-10-2.patch.gz
Change to the ffmpeg source directory and apply the patch:
cd ffmpeg-0.4.9-pre1 patch -p1 < ../ffmpeg-0.4.9-pre1-macosx-10-2.patch
(For more information on using patch, see my article on diff and patch.)
Now build the project:
./configure --enable-mp3lame --enable-shared --enable-pthreads \ --disable-vhook make sudo make install
Some flv examples
FFmpeg is now installed. There are instructions in the doc/ directory, but basic commands are quite simple, and you will find that they are similar to ImageMagick, if you have used it. To convert an mpeg video to Flash, use:
ffmpeg -i video.mpg -ar 22050 video.flv
(The "-ar 22050" flag sets an audio sample rate of 22050 Hz. It is usually necessary to set a sample rate when encoding flv files because the MP3 encoder only supports rates of 11025, 22050, and 44100 Hz.) That's the basic idea, but in practical uses you will probably want to take control over more of the quality settings. A more realistic command would look like this:
ffmpeg -i video.mov -b 600k -r 24 -ar 22050 -ab 96k video.flv
"-b 600k" selects a video bitrate of 600 kilobits per second. This is a compromise between quality and bandwidth (with older versions of FFmpeg you would use "-b 600". Type "ffmpeg -h" to check which units are expected in your version);
"-r 24" selects 24 video frames per second;
"-ar 22050" selects an audio sample rate of 22050 Hz, which is sufficient for voice;
"-ab 96k" selects an audio bit rate of 96 kilobits per second; you could go a little lower for voice-only audio (with older versions of FFmpeg you would use "-ab 96". Type "ffmpeg -h" to check.)
These are the parameters you will adjust most often. Finding the perfect values for your material is a matter of experiment.
flv 1.1 metadata
FFmpeg is a moving target, and this issue is resolved in the latest version of FFmpeg from the Subversion repository. In older versions, however, FFmpeg didn't write the FLV metadata which is required for the scrubber bar to work in some Flash video players.
If you experience this problem, there is a fix:
First, try upgrading to the latest version of FFmpeg.
make build errors
According to the mailing list, FFmpeg is sensitive to the version of "make" you are running and the build will fail in many cases. Recent testing shows that the current stable version of GNU make (3.81) will work, but 3.79 and 3.80 will both fail, for different reasons. BSD make (also distributed with OS X as "bsdmake") will fail with multiple errors. If you are having a problem with make, the simple solution would be to upgrade Developer Tools.
Alternate download methods
If your version of Xcode doesn't include a Subversion client, refer to the FFmpeg download page and pick another method to get the source, for example:
curl -O http://ffmpeg.org/ffmpeg-export-snapshot.tar.bz2 tar xvjf ffmpeg-export-snapshot.tar.bz2
Some FFmpeg error messages are a little cryptic. Here are a few I have encountered:
If you try to decode a video format that FFmpeg does not understand, you get the message
No audio or video streams available
Just try again with another format, or recompile FFmpeg to add the codec you need.
If you build FFmpeg without the --enable-libmp3lame flag and try to encode to Flash video, the audio stream will be silently discarded. Only by encoding to another format that does not require MP3 will you discover that this is not the expected behavior. In this case just follow the instructions in this article to install LAME, if necessary, and recompile FFmpeg with LAME support.
When encoding to MP3, you may receive the message
Could not write header for output file #0 (incorrect codec parameters ?)
In practice, this means that you should use the -ar flag to set an audio sample rate of 11025, 22050, or 44100 Hz.
Now that you have video in Flash video format, you may be interested in publishing it on the web. See my Flash Video Howto for complete instructions.
Howard Pritchett publishes an FFmpeg user's guide which includes lots of useful information if you're just starting out with FFmpeg.
Comment on this article and its topic
Copyright © 2006-2008 Stephen Jungels. Written permission is required to repost or reprint this article
Last modified: Tue Feb 22 10:41:16 CST 2011