如何计算 LAME 或 FFMPEG 添加的额外样本数

How to compute the number of extra samples added by LAME or FFMPEG

我正在尝试在 Python 中构建一个 MP3 解码器/解析器,它支持由 LAME 或 FFMPEG 编码的文件。

我的编码 shell 脚本如下所示:

#!/bin/bash
for i in wav/*.wav; do
    i=${i##*/};
    lame --nores --strictly-enforce-ISO -t --cbr -b 64 -h "wav/${i}" "mpeg/lame/${i%.wav}.mp3";
    ffmpeg -i "wav/${i}" -codec:a libmp3lame -qscale:a 2 "mpeg/ffmpeg/${i%.wav}.mp3";
done

此脚本读取位于 ./wav/ 中的 WAVE 文件,并在我的 ./mp3/lame/ 目录中生成 64kbps 的受控比特率 MP3,并在我的 ./mp3/ffmpeg/ 中生成质量为 2 的可变比特率 MP3 ].

我已经编写了一个 Python 脚本来遍历生成的 MP3,计算帧数和样本数。 LAME 和 FFMPEG 结果是等价的(在帧和样本方面),但它们的二进制文件不同。

LAME/FFMPEG 样本计数是通过遍历二进制 MP3 文件、定位和解析帧头,然后使用 MP3 规范确定每帧样本数来完成的。

这是单个 4 秒输入文件的样本计数比较:

我了解 according to the LAME FAQ file,生成的 MP3 文件在前后填充零以确保逆 MDCT 正确执行,但也因为 windows 重叠。

我无法从上述常见问题解答或任何以前的 Whosebug post 确定的是如何计算人为添加的样本数。如果我能确定所有 1516 个样本都是零,并且我能确定它们在字节流中的位置,我希望能够自信地将它们扔掉。由于有 1516 "extra" 个样本并且对于 V2LIII 编码每帧有 576 个样本,因此这里必须有两个以上(但少于三个)错误的 MPEG 帧。

这里有没有人精通 MPEG encoding/decoding 知道添加了多少样本,以及这些样本将在哪些帧中?换句话说,第一帧和最后一帧总是包含空白数据,还是有更多的帧?

最简单的方法是在日志级别调试模式下使用 ffmpeg 解码生成的 MP3。

ffmpeg -i file.mp3 -f null - -v 48

在控制台输出中,您将看到这一行

[mp3 @ 0000000002be28c0] pad 576 1105

这不包括固定编码器延迟。

因此这两行显示了实际跳过的样本数

在第一帧开始填充:

[mp3 @ 0000000002e6bb80] skip 1105/1152 samples

在最后一帧结束填充:

[mp3 @ 0000000002e6bb80] discard 576/1152 samples

此信息仅在写入 Xing header 时存在。