Convert Planar Audio to Packed Audio in FFmpeg
This guide provides a straightforward tutorial on how to convert planar audio formats to packed audio formats using FFmpeg. You will learn the difference between these two audio layouts, the specific command-line options required for conversion, and how to verify the output format of your audio files.
Understanding Planar vs. Packed Audio
In digital audio, channel layout determines how multi-channel data
(like stereo) is stored: * Packed (Interleaved)
Formats: Channel samples are stored consecutively. For a stereo
file, the data is structured as L-R-L-R-L-R. In FFmpeg,
these formats do not have a suffix (e.g., s16,
flt, s32). * Planar Formats:
Each channel’s data is stored in its own separate plane or block. The
data is structured as L-L-L... followed by
R-R-R.... In FFmpeg, these formats always end with a
p suffix (e.g., s16p, fltp,
s32p).
Method 1: Using the
-sample_fmt Option
The simplest way to convert planar audio to packed audio is by using
the -sample_fmt (or -pix_fmt equivalent for
audio) flag. This tells the audio encoder to output a specific sample
format.
For example, to convert an audio file with planar float samples
(fltp) to packed signed 16-bit PCM (s16), use
the following command:
ffmpeg -i input.wav -c:a pcm_s16le -sample_fmt s16 output.wavIn this command: * -c:a pcm_s16le selects the 16-bit PCM
encoder. * -sample_fmt s16 forces FFmpeg to use the packed
16-bit sample format instead of the planar s16p.
Method 2: Using the
aformat Filter
If you are performing complex filtering or if the encoder requires a
specific input format, you can use the aformat filter to
explicitly define the sample format before the audio reaches the
encoder.
ffmpeg -i input.mp4 -af "aformat=sample_fmts=s16" -c:a pcm_s16le output.wavThe -af "aformat=sample_fmts=s16" filter forces the
audio stream to be converted to the packed s16 format
during the filtering stage.
Important Codec Considerations
Not all audio encoders support packed formats. For example, the
default AAC encoder in FFmpeg (aac) natively operates on
planar float (fltp) samples. If you force a packed format
like flt on the AAC encoder, FFmpeg will automatically
convert it back to fltp to encode the file.
To keep your audio in a packed format, you must output to a codec
that supports packed data, such as PCM (pcm_s16le for
s16, pcm_f32le for flt) or
MP3.
How to Verify the Audio Format
To check whether your output file is using a packed or planar format,
use ffprobe:
ffprobe -v error -show_entries stream=sample_fmt -of default=noprint_wrappers=1 input.wavIf the output is s16 or flt, your audio is
successfully packed. If the output is s16p or
fltp, it is still planar.