[FFmpeg-trac] #9248(ffplay:new): FFplay does not try to guess channel layout for stereo wav-files with WAVE_FORMAT_PCM header

FFmpeg trac at avcodec.org
Sun May 16 16:54:05 EEST 2021

#9248: FFplay does not try to guess channel layout for stereo wav-files with
             Reporter:  CoRoNe  |                     Type:  defect
               Status:  new     |                 Priority:  normal
            Component:  ffplay  |                  Version:  git-master
             Keywords:  ffplay  |               Blocked By:
             Blocking:          |  Reproduced by developer:  0
Analyzed by developer:  0       |
 Creating the test file:
 ffmpeg -f lavfi -i aevalsrc='sin(864*2*PI*t):c=stereo:d=3' aevalsrc.wav
 Opening '`aevalsrc.wav`' with `ffmpeg` you'll see:
 ffmpeg -i aevalsrc.wav
 Guessed Channel Layout for Input Stream #0.0 : stereo
 This wav-file doesn't have a channel-layout-tag, so `ffmpeg` tries to
 guess it and sets the channel layout to stereo in this case. In order for
 `ffmpeg` not having to guess, you can manually specify `-channel_layout
 stereo`, which has the same outcome.
 The channel layout is now set, which `ffmpeg` reports (with a more verbose
 loglevel) as:
 [graph_0_in_0_0 @ xxx] [...] chlayout:0x3

 With `ffplay` however this is not the case. It does play '`aevalsrc.wav`',
 but also reports:
 ffplay -v 40 aevalsrc.wav
 [ffplay_abuffer @ xxx] [...] chlayout:(null)
 According to the docs `ffplay` ''should'' have a `-channel_layout`
 ffplay --help | grep "\-channel_layout"
   -channel_layout    <uint64>     ED..A...... (from 0 to 1.84467e+19)
 (default 0)
 ...but that somehow doesn't work:
 ffplay -channel_layout stereo aevalsrc.wav
 [pcm_s16le @ xxx] [Eval @ 05a6f2cc] Undefined constant or missing '(' in
 [pcm_s16le @ xxx] Unable to parse option value "stereo"
 [pcm_s16le @ xxx] Error setting option channel_layout to value stereo.
 ''"The wav-file plays, so what's the problem?"'', you might say. Problems
 start to occur however when audio-filters are applied, like changing the
 tempo and pitch for instance:
 ffplay -af "asetrate=22050" aevalsrc.wav
 [auto_resampler_0 @ xxx] Cannot select channel layout for the link between
 filters auto_resampler_0 and Parsed_asetrate_0.
 [auto_resampler_0 @ xxx] Unknown channel layouts not supported, try
 specifying a channel layout using 'aformat=channel_layouts=something'.
 Using the "`aformat`"-filter, `-af "aformat=cl=stereo,asetrate=22050"`,
 obviously works, though the channel layout is still unknown:
 [ffplay_abuffer @ xxx] [...] chlayout:(null)

 I don't understand however why `-af "aformat=cl=stereo"` is necessary for
 `ffplay`, why `-channel_layout stereo` doesn't work and why in the first
 place it doesn't try to guess the channel layout like `ffmpeg` does.

 The only way I've found to play the wav-file with `ffplay` without the
 need for `-af "aformat=cl=stereo"` is to open '`aevalsrc.wav`' with
 Audacity and save it as a wav-file with a WAVEX (WAVE_FORMAT_EXTENSIBLE)
 header. That way `ffplay` does recognize the channel layout:
 [ffplay_abuffer @ xxx] [...] chlayout:0x3
 Why with Audacity? Because of '`libavformat/riffenc.c`'...
 {{{#!c lineno=79 marks=81
     waveformatextensible = (par->channels > 2 && par->channel_layout) ||
                            par->channels == 1 && par->channel_layout &&
 par->channel_layout != AV_CH_LAYOUT_MONO ||
                            par->channels == 2 && par->channel_layout &&
 par->channel_layout != AV_CH_LAYOUT_STEREO ||
                            par->sample_rate > 48000 ||
                            par->codec_id == AV_CODEC_ID_EAC3 ||
                            av_get_bits_per_sample(par->codec_id) > 16;
 ...I believe `ffmpeg` never saves stereo audio streams as wav-files with a
 WAVEX header. And as far as I know there's no way to force that.
Ticket URL: <https://trac.ffmpeg.org/ticket/9248>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker

More information about the FFmpeg-trac mailing list