如何计算LAME或FFMPEG

时间:2018-01-23 21:23:41

标签: python audio ffmpeg wav lame

我正在尝试用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规范确定每帧的样本数来完成的。

  • MP3数据帧数:112(忽略Xing / Info第一帧)
  • 输出帧数:112 * 576 = 64512

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

  • 输入WAV样本数= 62996
  • 输出LAME / FFMPEG样本数= 64512
  • 差异= 1516

我理解according to the LAME FAQ file,结果MP3文件在正面和背面都是零填充,以确保正确执行逆MDCT,但也因为窗口重叠。

我可以从上述常见问题解答或任何之前的StackOverflow帖子中确定如何计算人工添加的样本数量。如果我可以确定这些样本中的所有1516都是零,并且我可以确定它们在字节流中的位置,我希望能够自信地将它们丢弃。因为有1516"额外"对于V2LIII编码,每帧有576个样本,这里必须有两个以上(但少于三个)错误的MPEG帧。

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

1 个答案:

答案 0 :(得分:0)

最简单的方法是使用ffmpeg使用loglevel调试模式解码生成的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标题时才会出现此信息。