Mix First-Order Ambisonics to Stereo in FFmpeg
First-order Ambisonics (FOA) uses four channels to capture a complete
three-dimensional soundfield, but standard playback systems require a
two-channel stereo downmix. By synthesizing virtual cardioid microphones
pointed at left and right angles, FFmpeg's pan filter can
decode four-channel Ambisonics into standard stereo without needing
external plugins. This guide explains how to calculate the matrix
coefficients and execute the FFmpeg commands for both modern AmbiX and
legacy FuMa Ambisonic formats.
Understanding Ambisonic Channel Orders
Before applying the pan filter, you must identify
whether your source audio is in AmbiX (standard for
YouTube and modern spatial audio) or FuMa (traditional
Ambisonics). Each uses a different channel assignment:
- AmbiX (ACN / SN3D):
- Channel 0 (
c0): \(W\) (Omnidirectional) - Channel 1 (
c1): \(Y\) (Left / Right) - Channel 2 (
c2): \(Z\) (Up / Down) - Channel 3 (
c3): \(X\) (Front / Back)
- Channel 0 (
- FuMa (Traditional):
- Channel 0 (
c0): \(W\) (Omnidirectional) - Channel 1 (
c1): \(X\) (Front / Back) - Channel 2 (
c2): \(Y\) (Left / Right) - Channel 3 (
c3): \(Z\) (Up / Down)
- Channel 0 (
Decoding via Virtual Microphones
A standard stereo downmix synthesizes two virtual cardioid microphones angled at \(\pm 45^\circ\) from the center front (\(\pm 90^\circ\) stereo aperture). The mathematical formula for a virtual cardioid combines the omnidirectional component (\(W\)), the forward component (\(X\)), and the lateral component (\(Y\)). The vertical component (\(Z\)) is discarded for horizontal stereo.
For normalized AmbiX:
- Left (\(c0\) output): \(0.5 \times W + 0.3535 \times X + 0.3535 \times Y\)
- Right (\(c1\) output): \(0.5 \times W + 0.3535 \times X - 0.3535 \times Y\)
FFmpeg Command for AmbiX (ACN/SN3D)
In AmbiX, \(W\) is c0,
\(Y\) is c1, and \(X\) is c3. Run the following
command to downmix to stereo:
ffmpeg -i input_ambix.wav -af "pan=stereo|c0=0.5*c0 + 0.3535*c3 + 0.3535*c1|c1=0.5*c0 + 0.3535*c3 - 0.3535*c1" output_stereo.wavExplanation of the Filter:
pan=stereo: Defines the target output layout as a 2-channel stereo file.c0=...: Sums 50% omni (c0), ~35.4% front (c3), and ~35.4% left (c1) to create the left stereo output.c1=...: Sums 50% omni (c0), ~35.4% front (c3), and subtracts ~35.4% left (yielding right) to create the right stereo output.
FFmpeg Command for FuMa
In FuMa, \(W\) is attenuated by
\(3\text{ dB}\) (\(\approx 0.707\)), \(X\) is c1, and \(Y\) is c2. Adjust the
coefficients accordingly:
ffmpeg -i input_fuma.wav -af "pan=stereo|c0=0.7071*c0 + 0.5*c1 + 0.5*c2|c1=0.7071*c0 + 0.5*c1 - 0.5*c2" output_stereo.wavPreventing Clipping
Summing multiple audio channels together can increase the overall
amplitude and cause digital clipping if the source is mastered close to
\(0\text{ dBFS}\). To avoid distortion,
append the volume filter or the loudnorm
filter after the pan filter:
ffmpeg -i input_ambix.wav -af "pan=stereo|c0=0.5*c0 + 0.3535*c3 + 0.3535*c1|c1=0.5*c0 + 0.3535*c3 - 0.3535*c1,loudnorm" output_stereo.wav