我正在尝试用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,但也因为窗口重叠。
我可以从上述常见问题解答或任何之前的StackOverflow帖子中确定如何计算人工添加的样本数量。如果我可以确定这些样本中的所有1516都是零,并且我可以确定它们在字节流中的位置,我希望能够自信地将它们丢弃。因为有1516"额外"对于V2LIII编码,每帧有576个样本,这里必须有两个以上(但少于三个)错误的MPEG帧。
有没有人在这里精通MPEG编码/解码,知道添加了多少样本,这些样本将在哪些帧中?换句话说,第一帧和最后一帧是否总是包含空白数据,还是有更多帧?
答案 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标题时才会出现此信息。