[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
WAVE_FORMAT_PCM header
--------------------------------+--------------------------------------
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`
option...
{{{
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
'stereo'
[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