Opened 10 years ago
Last modified 5 years ago
#3160 new defect
ac3 silently chooses 5.1(side) channel layout
Reported by: | llogan | Owned by: | |
---|---|---|---|
Priority: | minor | Component: | avcodec |
Version: | git-master | Keywords: | ac3 |
Cc: | Blocked By: | ||
Blocking: | Reproduced by developer: | no | |
Analyzed by developer: | no |
Description
According to the AC-3 standards[1], as far as I can tell, AC-3 supports 5.1(side) [FL+FR+FC+LFE+SL+SR] but not 5.1 [FL+FR+FC+LFE+BL+BR] channel layout. The standards show "L, C, R, SL, SR", but no reference to any back or rear channels such as BL and BR.
ffmpeg will silently choose 5.1(side) even if 5.1 is attempted:
$ ffmpeg -f lavfi -i aevalsrc=0:d=1 -filter_complex "[0:a]asplit=6[fl][fr][fc][lfe][bl][br];[fl][fr][fc][lfe][bl][br]amerge=inputs=6,channelmap=0|1|2|3|4|5:channel_layout=5.1" out.ac3 ffmpeg version N-58330-g6a7980e Copyright (c) 2000-2013 the FFmpeg developers built on Nov 21 2013 12:42:31 with gcc 4.8.2 (GCC) configuration: --enable-gpl libavutil 52. 53.100 / 52. 53.100 libavcodec 55. 44.100 / 55. 44.100 libavformat 55. 21.100 / 55. 21.100 libavdevice 55. 5.100 / 55. 5.100 libavfilter 3. 91.100 / 3. 91.100 libswscale 2. 5.101 / 2. 5.101 libswresample 0. 17.104 / 0. 17.104 libpostproc 52. 3.100 / 52. 3.100 Input #0, lavfi, from 'aevalsrc=0:d=1': Duration: N/A, start: 0.000000, bitrate: 2822 kb/s Stream #0:0: Audio: pcm_f64le, 44100 Hz, mono, dbl, 2822 kb/s [Parsed_amerge_1 @ 0x344fd00] No channel layout for input 1 [Parsed_amerge_1 @ 0x344fd00] Input channel layouts overlap: output layout will be determined by the number of distinct input channels Output #0, ac3, to 'out.ac3': Metadata: encoder : Lavf55.21.100 Stream #0:0: Audio: ac3, 44100 Hz, 5.1, fltp, 448 kb/s Stream mapping: Stream #0:0 (pcm_f64le) -> asplit channelmap -> Stream #0:0 (ac3) Press [q] to stop, [?] for help size= 57kB time=00:00:01.03 bitrate= 450.5kbits/s video:0kB audio:57kB subtitle:0 global headers:0kB muxing overhead 0.000000%
$ ffmpeg -i out.ac3 ffmpeg version N-58330-g6a7980e Copyright (c) 2000-2013 the FFmpeg developers built on Nov 21 2013 12:42:31 with gcc 4.8.2 (GCC) configuration: --enable-gpl libavutil 52. 53.100 / 52. 53.100 libavcodec 55. 44.100 / 55. 44.100 libavformat 55. 21.100 / 55. 21.100 libavdevice 55. 5.100 / 55. 5.100 libavfilter 3. 91.100 / 3. 91.100 libswscale 2. 5.101 / 2. 5.101 libswresample 0. 17.104 / 0. 17.104 libpostproc 52. 3.100 / 52. 3.100 [ac3 @ 0x1f33100] Estimating duration from bitrate, this may be inaccurate Input #0, ac3, from 'out.ac3': Duration: 00:00:01.04, start: 0.000000, bitrate: 448 kb/s Stream #0:0: Audio: ac3, 44100 Hz, 5.1(side), fltp, 448 kb/s At least one output file must be specified
The output file is correct, in my opinion, but an informative message indicating that 5.1(side) will be used instead is probably a good idea, and/or for the encoding command the console output should show 5.1(side) instead of 5.1.
[1] http://www.atsc.org/cms/standards/a_52-2010.pdf (page 40, table 5.8)
Change History (5)
comment:1 by , 10 years ago
comment:2 by , 10 years ago
Component: | undetermined → avcodec |
---|
follow-up: 4 comment:3 by , 9 years ago
When using:
ffmpeg -y -threads 8 -analyzeduration 100M -probesize 100M -i "h:\Outp ut\cut.m2ts" -map 0:1 -vn -filter_complex "aevalsrc=0:0:0:0:0:0::d=0.138:sample_ rate=48000[silence];[silence][0:a]concat=n=2:v=0:a=1[out]" -map [out] -c:a ac3 -ab 384000 -map_metadata -1 "H:\Output\iId_3_aid_4352_15_30_47_8910_01.ac3"
I get:
ffmpeg version N-58971-g945a440 Copyright (c) 2000-2013 the FFmpeg developers built on Dec 11 2013 15:17:28 with gcc 4.8.2 (rev0, Built by MinGW-W64 project) configuration: --arch=x86_64 --prefix=/local64 --extra-cflags='-DPTW32_STATIC_LIB -DLIBTWOLAME_STATIC' --extra-libs='-lxml2 -lz -liconv -lws2_32 -lstdc++ -lpng -lm -lpthread -lwsock32' --disable-debug --enable-gpl--enable-version3 --enable-postproc --enable-w32threads --enable-runtime-cpudetect --enable-memalign-hack --disable-shared --enable-static --enable-avfilter --enable-bzlib --enable-zlib --enable-librtmp --enable-gnutls --enable-avisynth --enable-frei0r --enable-filter=frei0r --enable-libbluray --enable-libcaca --enable-libopenjpeg --enable-fontconfig --enable-libfreetype --enable-libass --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-libschroedinger --enable-libsoxr --enable-libtwolame --enable-libutvideo --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libvo-aacenc --enable-libopus --enable-libvidstab --enable-libvpx --enable-libxavs --enable-libx264 --enable-libxvid --enable-libzvbi libavutil 52. 58.100 / 52. 58.100 libavcodec 55. 45.100 / 55. 45.100 libavformat 55. 22.100 / 55. 22.100 libavdevice 55. 5.102 / 55. 5.102 libavfilter 3. 92.100 / 3. 92.100 libswscale 2. 5.101 / 2. 5.101 libswresample 0. 17.104 / 0. 17.104 libpostproc 52. 3.100 / 52. 3.100 [h264 @ 000000000043f340] SEI type 1 size 56 truncated at 53 [h264 @ 000000000043f340] mmco: unref short failure Last message repeated 1 times [h264 @ 000000000043f340] number of reference frames (0+4) exceeds max (3; probably corrupt input), discarding one [h264 @ 000000000043f340] SEI type 1 size 56 truncated at 53 Last message repeated 38 times Input #0, mpegts, from 'h:\Output\cut.m2ts': Duration: 00:00:30.11, start: 4292.050000, bitrate: 7719 kb/s Program 1 Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 384 kb/s [Parsed_aevalsrc_0 @ 000000000043d7a0] This syntax is deprecated. Use '|' to separate the list items. [ac3 @ 00000000070e41e0] ac3 files have exactly one stream Output #0, ac3, to 'H:\Output\iId_3_aid_4352_15_30_47_8910_01.ac3': Metadata: encoder : Lavf55.22.100 Stream #0:0: Audio: ac3, 48000 Hz, 5.1(side), fltp, 384 kb/s Stream #0:1: Audio: ac3, 48000 Hz, 5.1, fltp, 384 kb/s Stream mapping: Stream #0:1 (ac3) -> concat:in1:a0 (graph 0) Stream #0:1 -> #0:0 (ac3 -> ac3) concat (graph 0) -> Stream #0:1 (ac3) Could not write header for output file #0 (incorrect codec parameters ?): Error number -22 occurred
The problem for me seem so be the difference between 5.1 and 5.1(side), which is why I posted this here.
-> is there a way to tell ffmpeg which to use "5.1" or "5.1(side)" ?
comment:4 by , 9 years ago
Replying to Selur:
Could not write header for output file #0 (incorrect codec parameters ?): Error number -22 occurred
This is certainly unrelated to your problem, but this line, the "error number -22", shows that something is seriously rotten in your ffmpeg build.
comment:5 by , 5 years ago
ac3 decoder does not support 5.1 it only supports 5.1(side) thus encoder is wrong.
I (think I) understand the ticket but please note that the ac3 encoder does not "choose"
5.1(side)
, it encodes both5.1
and5.1(side)
as AC3_CHMODE_3F2R (3 front channels, two rear channels) which is the only 3-2 configuration supported by ac3 (as you showed) - lfe is always encoded independently. This makes sense for performance reasons but also because I am not sure if all FFmpeg multichannel audio decoders distinguish correctly between5.1
and5.1(side)
.I suggest that if you really believe such a warning makes sense, switch "case AV_CH_LAYOUT_5POINT0_BACK:" and "case AV_CH_LAYOUT_5POINT0:" in libavcodec/ac3enc.c (line 2087), add a warning in between (and commit) and send your patch to ffmpeg-devel.