在 MP3 中创建 Xing 或 Info 标签时,我可以使用任何 MP3 header 还是必须与其他帧匹配?

When creating a Xing or Info tag in an MP3, may I use any MP3 header or does it have to match other frames?

我有一组 MP3 文件。就像我从这些文件中删除所有标签(没有 ID3、没有 Xing、没有信息)一样。

就在将其中一个文件发送给客户端之前,我想添加一个信息标签。我的所有文件都是 CBR,因此我们将使用信息标签(无 Xing)。

现在我获取现有MP3的前4个字节来获取版本(MPEG-1,第三层)、比特率、频率、立体声模式等,从而确定一帧的大小。我以这种方式创建标签,将这 4 个字节重新用于信息标签并确定框架的大小。

对于那些想知道的人,这 4 个字节可能如下所示:

FF FB 78 04

对我来说,感觉你应该在 Info 标签中使用与在 MP3 的其他音频帧中完全相同的前 4 个字节,但是当使用 ffmpeg 时,他们会在 Info 标签中添加 硬编码 header(错误的比特率、错误的频率等)

我的问题是:ffmpeg 真的做对了吗? (LAME 不这样做)我可以做同样的事情,跳过前 4 个字节的加载,并且仍然有大多数播放器按预期播放我的文件吗?

注意:因为我是通过网络读取这4个字节,所以不用加载这4个字节肯定会节省很多时间和一些带宽HEAD 请求的字节数。我可以用于 GET 请求的资源...

不同的原因是在某些配置下,帧的大小小于 192 字节。在那种情况下,完整的 Info/Xing 标签将不适合(据我所知,四个可选字段始终包含在内,因此 Info/Xing 标签始终是完整的,即使不需要)。

因此,例如,如果您有一个 44.1kHz 数据和 32kbps 的单通道,则 MP3 帧为 117 或 118 字节。这比保存 Info/Xing 标签所需的少。

LAME 在这种情况下所做的就是放弃 Info/Xing 标签。它不会出现在文件的任何地方。

另一方面,FFMPEG 所做的是创建具有更高比特率的帧。因此,它将尝试使用 48kbps 和 64kbps 而不是 32kbps。一旦它找到一个提供足够大的框架以支持 Info/Xing 标签的配置,它就会停止。 (我没有看过代码,所以 FFMPEG 是如何真正找到足够大的帧的,我不知道,但在我这边,我只是将比特率索引字段递增 1,直到 frame size >= 192 并且它起作用了)。

您可以通过首先使用 32kbps 比特率创建(或转换)44.1kHz 的 WAVE 文件来复制这一壮举,然后尝试使用 ffmpeg 将其转换为 MP3 并查看 Info/Xing 标签具有不同的比特率.