Opened 5 years ago

Closed 3 years ago

#3576 closed defect (fixed)

decoding MP3 (LAME) results in wrong length

Reported by: tobwen Owned by:
Priority: normal Component: avformat
Version: git-master Keywords: mp3
Cc: Blocked By:
Blocking: Reproduced by developer: yes
Analyzed by developer: no

Description

What I was trying to accomplish

I was trying to transcode from MP3 to 44.1 kHz, 16-bit stereo WAV file. Since it uses libmp3lame, the output should be equal to the CLI version.

The problem I encountered

The output is too long by 1263 samples.

I've used LAME v3.99.5 aka v3.99r (same es libmp3lame) to transcode a testfile with 441000 samples (10 seconds) to MP3 using this command line:
lame test_tobwen.wav -V 2 test_tobwen.mp3

When decoding it with the same lame version, it's exactly 441000 samples long.
lame --decode test_tobwen.mp3 output_lame.wav

LAME recognizes its own tag and skils encoder+decoder delay (1105 samples) and padding-decoder delay (263) samples.
You can read more about this here: http://mp3decoders.mp3-tech.org/decoders_lame.html

excact command line I was using

ffmpeg -i test_tobwen.mp3 -acodec pcm_s16le output_ffmpeg.wav

full, uncut console output

ffmpeg -v 9 -loglevel 99 -i test_tobwen.mp3 -acodec pcm_s16le output_ffmpeg.wav

ffmpeg version N-62569-gf57ac37 Copyright (c) 2000-2014 the FFmpeg developers
  built on Apr 19 2014 22:03:22 with gcc 4.8.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-decklink --enable-zlib
  libavutil      52. 77.100 / 52. 77.100
  libavcodec     55. 58.105 / 55. 58.105
  libavformat    55. 37.101 / 55. 37.101
  libavdevice    55. 13.100 / 55. 13.100
  libavfilter     4.  4.100 /  4.  4.100
  libswscale      2.  6.100 /  2.  6.100
  libswresample   0. 18.100 /  0. 18.100
  libpostproc    52.  3.100 / 52.  3.100
Splitting the commandline.
Reading option '-v' ... matched as option 'v' (set logging level) with argument '9'.
Reading option '-loglevel' ... matched as option 'loglevel' (set logging level) with argument '99'.
Reading option '-i' ... matched as input file with argument 'test_tobwen.mp3'.
Reading option '-acodec' ... matched as option 'acodec' (force audio codec ('copy' to copy stream)) with argument 'pcm_s16le'.
Reading option 'output_ffmpeg.wav' ... matched as output file.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option v (set logging level) with argument 9.
Successfully parsed a group of options.
Parsing a group of options: input file test_tobwen.mp3.
Successfully parsed a group of options.
Opening an input file: test_tobwen.mp3.
[mp3 @ 04395000] Format mp3 probed with size=2048 and score=51
[mp3 @ 04395000] pad 576 792
[mp3 @ 04395000] Before avformat_find_stream_info() pos: 417 bytes read:65664 seeks:2
[mp3 @ 04395000] demuxer injecting skip 1105
[mp3 @ 04395820] skip 1105 samples due to side data
[mp3 @ 04395820] skip 1105/1152 samples
[mp3 @ 04395000] max_analyze_duration 5000000 reached at 5015510 microseconds
[mp3 @ 04395000] After avformat_find_stream_info() pos: 57761 bytes read:98432 seeks:2 frames:194
Input #0, mp3, from 'test_tobwen.mp3':
  Duration: 00:00:10.03, start: 0.025057, bitrate: 104 kb/s
    Stream #0:0, 194, 1/14112000: Audio: mp3, 44100 Hz, stereo, s16p, 104 kb/s
    Metadata:
      encoder         : LAME3.99r
Successfully opened the file.
Parsing a group of options: output file output_ffmpeg.wav.
Applying option acodec (force audio codec ('copy' to copy stream)) with argument pcm_s16le.
Successfully parsed a group of options.
Opening an output file: output_ffmpeg.wav.
Successfully opened the file.
detected 4 logical cores
[graph 0 input from stream 0:0 @ 029dd2c0] Setting 'time_base' to value '1/44100'
[graph 0 input from stream 0:0 @ 029dd2c0] Setting 'sample_rate' to value '44100'
[graph 0 input from stream 0:0 @ 029dd2c0] Setting 'sample_fmt' to value 's16p'
[graph 0 input from stream 0:0 @ 029dd2c0] Setting 'channel_layout' to value '0x3'
[graph 0 input from stream 0:0 @ 029dd2c0] tb:1/44100 samplefmt:s16p samplerate:44100 chlayout:0x3
[audio format for output stream 0:0 @ 029d7920] Setting 'sample_fmts' to value 's16'
[audio format for output stream 0:0 @ 029d7920] auto-inserting filter 'auto-inserted resampler 0' between the filter 'Parsed_anull_0' and the filter 'audio format for output stream 0:0'
[AVFilterGraph @ 043bd100] query_formats: 4 queried, 6 merged, 3 already done, 0 delayed
[auto-inserted resampler 0 @ 029d7f00] ch:2 chl:stereo fmt:s16p r:44100Hz -> ch:2 chl:stereo fmt:s16 r:44100Hz
Output #0, wav, to 'output_ffmpeg.wav':
  Metadata:
    ISFT            : Lavf55.37.101
    Stream #0:0, 0, 1/44100: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
    Metadata:
      encoder         : LAME3.99r
Stream mapping:
  Stream #0:0 -> #0:0 (mp3 -> pcm_s16le)
Press [q] to stop, [?] for help
[mp3 @ 04395820] skip 1105 samples due to side data
[mp3 @ 04395820] skip 1105/1152 samples
[output stream 0:0 @ 029d78a0] EOF on sink link output stream 0:0:default.
No more output streams to write to, finishing.
size=    1724kB time=00:00:10.00 bitrate=1411.3kbits/s    

video:0kB audio:1724kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.004532%
Input file #0 (test_tobwen.mp3):
  Input stream #0:0 (audio): 384 packets read (130730 bytes); 384 frames decoded (441263 samples); 
  Total: 384 packets (130730 bytes) demuxed
Output file #0 (output_ffmpeg.wav):
  Output stream #0:0 (audio): 384 frames encoded (441263 samples); 384 packets muxed (1765052 bytes); 
  Total: 384 packets (1765052 bytes) muxed
384 frames successfully decoded, 0 decoding errors
[AVIOContext @ 043c4a60] Statistics: 4 seeks, 387 writeouts
[AVIOContext @ 043949e0] Statistics: 164020 bytes read, 2 seeks

Files attached to this ticket

I've uploaded test_tobwen.wav and test_tobwen.mp3 to the FTP.

Attachments (1)

test_tobwen.zip (387.2 KB) - added by tobwen 5 years ago.

Download all attachments as: .zip

Change History (7)

Changed 5 years ago by tobwen

comment:1 Changed 5 years ago by tobwen

Narf, I'm too dumb to calculate. The file is 263 samples too long, that's the exact length of the padding-decoder delay. I think, you missed to strip this?

comment:2 follow-up: Changed 5 years ago by cehoyos

  • Component changed from ffmpeg to undetermined
  • Keywords mp3 added; MP3 LAME audio delay padding removed

Do you believe this is a regression?

comment:3 in reply to: ↑ 2 Changed 5 years ago by tobwen

Replying to cehoyos:

Do you believe this is a regression?

I have tested versions 0.8, 1.0.1, 1.2, 2.0.2, 2.1, 2.1.3 and this does not seem to be a regression.

Remark: v0.8 didn't remove delays at all, v1.0.1 is missing some data.

comment:4 Changed 5 years ago by cehoyos

  • Priority changed from important to normal

comment:5 Changed 5 years ago by cehoyos

  • Reproduced by developer set
  • Status changed from new to open

comment:6 Changed 3 years ago by cehoyos

  • Component changed from undetermined to avformat
  • Resolution set to fixed
  • Status changed from open to closed
Note: See TracTickets for help on using tickets.