FFMPEG audio channel manipulation

ffmpeg, manipulating and downmixing audio.

FFMPEG audio channel manipulation

Audio is hell...
-me (circa every time)

Hopefully this will give you a few tools to use when you need to modify or downmix audio in your files :)

If you've ever tried to downmix 5.1 audio into a stereo mix, typically using this:

ffmpeg -i 6channels.wav -ac 2 stereo.wav

Then you know that there are certainly some pitfalls there.

By default it just straight up drops the LFE (low frequency ) channel. The center channel also dosent seem right by just pushing it thru -ac 2

The overall volume is also dropped significantly.

After going back and forth a bit, doing some reading and some testing, I ended up arriving at a certain way of negating these pitfalls. This can be modified for downmixing 7.1, 5,1 and I'm sure a bunch of other different scenarios.

In the following example, I want to downmix 5.1 to stereo, and I also want to keep the LFE, so this is the most reasonable way to go about it (that I've found so far). We get to adjust the volume back up to a reasonable level, and we keep our LFE, while balancing the center channels to our stereo mix.

ffmpeg -i input.mp4 -af "pan=stereo|FL=0.5*FC+0.707*FL+0.707*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+0.5*LFE, volume=1.50" -ac 2 out.mp4

-af is an audio filter, and we want it to do a couple of different things.
pan=stereo ref docs, is used to mix channels, which in this case we want to downmix to stereo.

FL, FC, FR etc. is just Front left, center and right. The rest is pretty self-explanatory. B(x) is back. LFE is low frequency (think subwoofer channel).
If you're ever wondering which one was which again, run this: ffmpeg -layouts

volume is well, volume, and it is just used to adjust the overall volume of the output. I want this increased, since the downmixing process produces a bit lower volume. This was a good value for me. Do your testing and tweak yours accordingly.

-ac 2 is audio channel 2, we're doing stereo, remember? ;)

Sometimes you run into audio tracks that are a bit strange. For instance some are 5.1 and some are 5.1(side). You can use ffprobe if you ever need to know the layout, like so:

ffprobe -v error -show_entries stream=channel_layout -of csv=p=0 input.mp4

It should return something like this: 5.1(side)

Audio Channel manipulation examples and info
Too advanced reading for me (ATSC Standard)

For sake of ease, here is the full output of ffmpeg -layouts

Individual channels:
FL             front left
FR             front right
FC             front center
LFE            low frequency
BL             back left
BR             back right
FLC            front left-of-center
FRC            front right-of-center
BC             back center
SL             side left
SR             side right
TC             top center
TFL            top front left
TFC            top front center
TFR            top front right
TBL            top back left
TBC            top back center
TBR            top back right
DL             downmix left
DR             downmix right
WL             wide left
WR             wide right
SDL            surround direct left
SDR            surround direct right
LFE2           low frequency 2

Standard channel layouts:
mono           FC
stereo         FL+FR
2.1            FL+FR+LFE
3.0            FL+FR+FC
3.0(back)      FL+FR+BC
4.0            FL+FR+FC+BC
quad           FL+FR+BL+BR
quad(side)     FL+FR+SL+SR
3.1            FL+FR+FC+LFE
5.0            FL+FR+FC+BL+BR
5.0(side)      FL+FR+FC+SL+SR
4.1            FL+FR+FC+LFE+BC
5.1            FL+FR+FC+LFE+BL+BR
5.1(side)      FL+FR+FC+LFE+SL+SR
6.0            FL+FR+FC+BC+SL+SR
6.0(front)     FL+FR+FLC+FRC+SL+SR
hexagonal      FL+FR+FC+BL+BR+BC
6.1            FL+FR+FC+LFE+BC+SL+SR
6.1(back)      FL+FR+FC+LFE+BL+BR+BC
6.1(front)     FL+FR+LFE+FLC+FRC+SL+SR
7.0            FL+FR+FC+BL+BR+SL+SR
7.0(front)     FL+FR+FC+FLC+FRC+SL+SR
7.1            FL+FR+FC+LFE+BL+BR+SL+SR
7.1(wide)      FL+FR+FC+LFE+BL+BR+FLC+FRC
7.1(wide-side) FL+FR+FC+LFE+FLC+FRC+SL+SR
octagonal      FL+FR+FC+BL+BR+BC+SL+SR
downmix        DL+DR