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

标签 ffmpeg tags mp3 lame

我有一组裸 MP3 文件。我从这些文件中删除了所有标签(没有 ID3、没有 Xing、没有 Info)。

就在将这些文件之一发送到客户端之前,我想添加一个 Info 标记。我所有的文件都是 CBR,所以我们将使用 Info 标签(没有 Xing)。

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

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

FF FB 78 04

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

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

注:因为我通过网络读取了这 4 个字节,所以不必在 HEAD 上加载这 4 个字节肯定会节省大量时间和一些带宽。要求。我可以用于 GET 的资源而是请求...

最佳答案

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

因此,例如,如果您有一个 44.1kHz 数据、32kbps 的单 channel ,则 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 标签具有不同的比特率来复制这一壮举。

关于ffmpeg - 在 MP3 中创建 Xing 或 Info 标签时,我可以使用任何 MP3 header 还是必须匹配其他帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58460071/

相关文章:

php - FFMPEG 命令在 PHP 中不起作用。 (与 MAMP 不兼容)

ffmpeg - 视频与旧的一起使用新的宽度 + 高度进行编码。我可以使用 ffmpeg 仅使用旧尺寸重新编码吗?

git - 在git中标记多个分支?

javascript - 如何将 Blob 转换为 Int16Array

android - 需要有关声音处理的帮助

FFmpeg 将 TS-AAC 音频传输流文件重新包装到 M4A-AAC : what happens by default (no "-codec copy" etc. )?

python - 在 Windows 10 上从 python 运行时,ffmpeg.probe 不工作

python - 解析和存储 HTML 标签以及文本

php - Laravel - 查询生成器 - 按标签数量对结果进行排序

javascript - 使用 jplayer 在 mouseclick 上播放 Mp3 声音剪辑?