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

Ffmpeg 为什么libmp3lame会在MP3的开头加上零?,ffmpeg,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错误还是编解码器错误?为什么要添加这些?有没有办法阻止它们被添加 编辑:简化示例

我有一个未压缩的.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

FFmpeg中LAME添加的延迟量为

avctx->initial_padding = lame_get_encoder_delay(s->gfp) + 528 + 1;
来自LAME项目的以下信息:

2.为什么LAME会在每首歌的开头加上沉默

文件开始时的解码器延迟:

我测试过的所有解码器都引入了528个样本的延迟。那个 是的,在解码一个mp3文件后,输出将有528个 0附加到前面。这是因为标准 ISO使用的MDCT/过滤器库例程具有528采样延迟。信息技术 可以使用0样本编写MDCT/过滤器库例程 延迟(请参阅中使用的Takehiro MDCT/filterbank例程的说明 (下面是蹩脚的编码)但我不知道有人这样做过。 此外,由于MDCT帧的重叠性质,因此 第一个颗粒的前半部分(1个颗粒=576个样品)没有 要与上一帧重叠,导致第一帧的衰减 N个样本。N的值取决于窗口类型。对于 “停止型”和“短型”,N=96,而“启动型”和 “正常_型”,N=288。LAME 3.56及以上生产的第一个机架 将始终为停止类型或短类型

文件开始时的编码器延迟:

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


FAQ中的差异与您的输出中的差异不同,可能是因为我不知道技术上的细微差别,但这不是一个bug

请发布给定命令的整个控制台输出。我很惊讶我的谷歌搜索没有显示这一点。我想是搜索词不好吧。非常感谢你的帮助,谢谢!这个答案非常罕见,而且非常有用!