SoX and FFmpeg are fast, powerful command-line tools for manipulating audio and video data, respectively. In this short tutorial, I’ll show how to use these tools for two very common tasks: 1) resampling and 2) (de)multiplexing. Both tools are available from your favorite package manager (like Homebrew or
SoX and friends
SoX is a suite of programs for manipulating audio files. Commands are of the form:
sox [flag ...] infile1 [...] outfile [effect effect-options] ...
That is, the command
sox, zero or more global flags, one or more input files, one output file, and then a list of “effects” to apply. Unlike most UNIX command-line programs, though, SoX actually cares about file extensions. If the input file is
in.wav it better be a WAV file; if the output file is
out.flac it will be encoded in the FLAC (“free lossless audio codec”) format.
The simplest invocation of
sox converts audio files to new formats. For instance, the following would use audio.wav to create a new FLAC file audio.flac with the same same bit depth and sample rate.
sox audio.wav audio.flac
Concatenating audio files is only slightly more complicated. The following would concatenate
02_Untitled.wav together into a new file
sox 01_Intro.wav 02_Untitled.wav concatenated.wav
Resampling with SoX
But SoX really shines for resampling audio. For this, use the rate effect. The following would downsample the CD-quality (44.1 kHz) audio in
CD.wav to the standard sample rate used on telephones (8 kHz) and store the result in
sox CD.wav telephone.wav rate 8k
There are two additional effects you may want to invoke when resampling. First, you may want to “dither” the audio. As
man sox explains:
Dithering is a technique used to maximize the dynamic range of audio stored at a particular bit-depth. Any distortion introduced by quantization is decorrelated by adding a small amount of white noise to the signal. In most cases, SoX can determine whether the selected processing requires dither and will add it during output formatting if appropriate.
The following would resample to the telephone rate with dithering (if necessary).
sox CD.wav telephone.wav rate 8k dither -s
Finally, when resampling audio, you may want to invoke the gain effect to avoid clipping. This can be done using the
-G (“Gain”) global option.
sox -G CD.wav telephone.wav rate 8k dither -s
(De)multiplexing with SoX
remix effect is useful for manipulating multichannel audio. The following would remix a multi-channel audio file
stereo.wav down to mono.
sox stereo.wav mono.wav remix -
We also can split a stereo file into two mono files.
sox stereo.wav left.wav remix 1 sox stereo.wav right.wav remix 2
Finally, we can merge two mono files together to create one stereo file using the
-M (“merge”) global option; this file should be identical to
sox -M left.wav right.wav stereo2.wav
Other SoX goodies
There are three other useful utilities in SoX:
soxi prints information extracted from audio file headers,
play uses the SoX libraries to play audio files, and
rec records new audio files using a microphone.
The FFmpeg suite is to video files what SoX is to audio. Commands are of the form:
ffmpeg [flag ...] [-i infile1 ...] [-effect ...] [outfile]
-vcodec effects can be used to extract the audio and video streams from a video file, respectively; this process sometimes known as demuxing (short for “de-multiplexing”).
ffmpeg -i both.mp4 -acodec copy -vn audio.ac3 ... ffmpeg -i both.mp4 -vcodec copy -an video.h264 ...
We can also mux (“multiplex”) them back together.
ffmpeg -i video.h264 -i audio.ac3 -vcodec copy -acodec copy both2.mp4
Hopefully that’ll get you started. Both programs have excellent manual pages; read them!