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 apt-get
).
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 01_Intro.wav
and 02_Untitled.wav
together into a new file concatenated.wav
.
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 telephone.wav
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
The 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 stereo.wav
.
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.
FFmpeg
The FFmpeg suite is to video files what SoX is to audio. Commands are of the form:
ffmpeg [flag ...] [-i infile1 ...] [-effect ...] [outfile]
The -acodec
and -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!