为什么libmp3lame会在MP3的开头添加零?

时间:2016-03-29 13:52:13

标签: ffmpeg

我有一个未压缩的.wav文件,我将其变成一个96k的MP3文件:

ffmpeg.exe -i song.wav -vn -b:a 96000 -ac 2 -ar 48000 -acodec libmp3lame -y song.mp3

输入文件包含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%

wav中的样本数:637386

mp3中的样本数:639984

1 个答案:

答案 0 :(得分:5)

LAME在FFmpeg中添加的延迟量为

avctx->initial_padding = lame_get_encoder_delay(s->gfp) + 528 + 1;

来自LAME项目的FAQ

  

2。为什么LAME会在每首歌的开头添加沉默?

     

文件开头的解码器延迟:

     

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

     

文件开头的编码器延迟:

     

基于ISO的编码器(BladeEnc,8hz-mp3等)使用MDCT /滤波器组   例程类似于解码中使用的例程,因而也介绍   他们自己的528样本延迟。 .wav文件编码&解码后会有一个   1056个样本延迟(1056个样本将附加到开头)。

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