为什么libmp3lame将零添加到MP3的开头?

Phl*_*das 3 ffmpeg

我有一个未压缩的.wav文件,可以将其转换为96k MP3文件:

ffmpeg.exe -i song.wav -vn -b:a 96000 -ac 2 -ar 48000 -acodec libmp3lame -y song.mp3
Run Code Online (Sandbox Code Playgroud)

输入文件有637386个样本。输出有639360个样本。MP3中的多余样本在文件开头均为零。这种情况发生在我翻译的每个文件中,而不仅仅是libmp3lame,使用更多的编解码器。这是FFMPEG错误还是编解码器错误?为什么要添加这些?有没有办法阻止它们被添加?

编辑:简化的示例和控制台输出:

ffmpeg.exe -i song.wav -y song.mp3

ffmpeg version N-55796-gb74213d Copyright (c) 2000-2013 the FFmpeg developers
  built on Aug 26 2013 19:43:51 with gcc 4.7.3 (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-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 42.100 / 52. 42.100
  libavcodec     55. 29.100 / 55. 29.100
  libavformat    55. 14.102 / 55. 14.102
  libavdevice    55.  3.100 / 55.  3.100
  libavfilter     3. 82.102 /  3. 82.102
  libswscale      2.  5.100 /  2.  5.100
  libswresample   0. 17.103 /  0. 17.103
  libpostproc    52.  3.100 / 52.  3.100
Guessed Channel Layout for  Input Stream #0.0 : stereo
Input #0, wav, from 'song.wav':
  Duration: 00:00:13.28, bitrate: 1538 kb/s
    Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, stereo, s16, 1536 kb/s
Output #0, mp3, to 'song.mp3':
  Metadata:
    TSSE            : Lavf55.14.102
    Stream #0:0: Audio: mp3 (libmp3lame), 48000 Hz, stereo, s16p
Stream mapping:
  Stream #0:0 -> #0:0 (pcm_s16le -> libmp3lame)
Press [q] to stop, [?] for help
size=     208kB time=00:00:13.29 bitrate= 128.4kbits/s
video:0kB audio:208kB subtitle:0 global headers:0kB muxing overhead 0.111205%
Run Code Online (Sandbox Code Playgroud)

WAV中的样本数量:637386

mp3中的样本数:639984

Gya*_*yan 5

LAME在FFmpeg中增加的延迟量为

avctx->initial_padding = lame_get_encoder_delay(s->gfp) + 528 + 1;
Run Code Online (Sandbox Code Playgroud)

从LAME项目的常见问题解答中:

2.为什么LAME会在每首歌的开头添加静音?

文件开头的解码器延迟:

所有解码器我测试过引入528个样本的延迟。也就是说,在解码mp3文件后,输出将在前面附加528个0的样本。这是因为ISO使用的标准MDCT /过滤器例程的采样延迟为528。可以编写一个采样延迟为0的MDCT / filterbank例程(请参阅下面的LAME编码中对Takehiro的MDCT / filterbank例程的描述),但我不知道有人这样做。此外,由于MDCT帧的重叠性质,第一颗粒的前半部分(1个颗粒= 576个样本)不具有与之重叠的先前帧,从而导致前N个样本的衰减。N的值取决于窗口类型。对于“ STOP_TYPE”和“ SHORT_TYPE”,N = 96,而对于“ START_TYPE”和“

文件开头的编码器延迟:

基于ISO的编码器(BladeEnc,8hz-mp3等)使用的MDCT /滤波器组例程类似于解码所用的例程,因此也引入了它们自己的528采样延迟。编码和解码的.wav文件将具有1056个采样延迟(1056个采样将附加到开头)。

常见问题解答中的差异与您的输出中的差异不同,可能是由于我不知道的技术细微差别,但这不是错误。