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

Ffmpeg 在MP3中创建Xing或Info标记时,我可以使用任何MP3标题,还是必须与其他帧匹配?,ffmpeg,tags,mp3,lame,Ffmpeg,Tags,Mp3,Lame,我有一套简单的MP3文件。我从这些文件中删除了所有标签(没有ID3,没有Xing,没有信息) 在将其中一个文件发送到客户端之前,我想添加一个Info标记。我的所有文件都是CBR,因此我们将使用信息标签(no Xing) 现在我获取现有MP3的前4个字节,以获取版本(MPEG-1,第三层)、比特率、频率、立体声模式等,从而确定一帧的大小。我以这种方式创建标记,将这4个字节用于Info标记并确定帧的大小 对于那些想知道的人,这4个字节可能如下所示: FF FB 78 04 对我来说,你似乎希望在信

我有一套简单的MP3文件。我从这些文件中删除了所有标签(没有ID3,没有Xing,没有信息)

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

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

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

FF FB 78 04
对我来说,你似乎希望在信息标签中使用与MP3的其他音频帧中完全相同的前4个字节,但在使用ffmpeg时,他们会粘贴一个带有硬编码头的信息标签(错误的比特率、错误的频率等)

我的问题是:ffmpeg真的做对了吗?(LAME没有这样做)我能做同样的事情吗,跳过前4个字节的加载,仍然让大部分玩家按预期播放我的文件


注意:由于我通过网络读取这4个字节,因此不必在
头上加载这4个字节肯定会节省大量时间和带宽。我可以使用资源来代替
GET
请求…

造成差异的原因是,在某些配置中,帧的大小小于192字节。在这种情况下,完整的Info/Xing标记将不合适(从我看到的情况来看,四个可选字段始终包含在内,因此Info/Xing标记始终是完整的,即使不需要)

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

在这种情况下,LAME所做的就是没收信息/信息标签。文件里的任何地方都看不到

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


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

使用ffmpeg时,他们粘贴了一个带有硬编码头-->的信息标签,但无法复制此信息。理想情况下,玩家应跳过这些字节作为损坏的帧,并继续播放剩余的文件。但总有一些玩家不能正确处理这些案件。@Gyan好的!我发现发生了什么,这是有道理的。我贴出了答案。事实上,某些配置的帧太小。在这种情况下,Xing/Info标记不合适。通过改变比特率,我们可以放大帧以便创建标记。