gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:50:42 27 4
gpt4 key购买 nike

我正在尝试用 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 # of samples = 62996
  • 输出 LAME/FFMPEG 样本数 = 64512
  • 差异 = 1516

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

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

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

最佳答案

最简单的方法是在日志级别 Debug模式下使用 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 时存在。

关于python - 如何计算 LAME 或 FFMPEG 添加的额外样本数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48411053/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com