如何使用FFMPEG将MP3转换为恒定比特率

5
我发现使用可变比特率编码的MP3会导致currentTime属性在拖动时报告不正确,这对我的应用程序造成了严重影响,并且调试起来非常困难。我认为我需要将所有的MP3转换为恒定比特率。FFMPEG(或其他工具)能否帮助我高效地完成这项任务?感谢Terrill Thompson尝试解决这个问题*。

可能是一个XY问题。我不认为这是一个好的解决方案。该链接提到它仅使用使用FFmpeg的编码器,而FFmpeg又使用libmp3lame。没有测试其他编码器。您尝试过直接从LAME输出吗?您尝试过非基于LAME的MP3编码器吗? - llogan
我没有。虽然覆盖我原问题的帖子在这里(没有真正的解决方案):https://dev59.com/PILba4cB1Zd3GeqPi8Ol?noredirect=1#comment62766676_25468063 ...那些人认为使用.ogg格式就可以解决问题,但他们是错误的(我个人认为)。此外,在我的应用程序中,我从世界各地获取mp3文件,所以手动对它们进行编码是不可行的。我需要快速批量编码它们,并确保它们具有固定比特率,以便html5音频currentTime属性可以准确报告。 - Brian FitzGerald
就算是LordNeckbeard,如果这样的话我很高兴错了。现在任何事情都要认真解决这个问题。如果有人能帮我找到问题的根源,他一定会有一个巨大的脖子胡子,所以我想我们正在找到答案......回答你的问题,我不确定如何知道使用什么其他编码器和/或是否使用LAME。你知道有没有一个我应该测试并试图确定这个问题的编码器吗? - Brian FitzGerald
你有一个样本输入文件可以编码成MP3吗?我有一些想法要尝试,但只是猜测而已。 - llogan
将MP3混流到MP4容器中有帮助吗? - Gyan
@BrianFitzGerald 你知道原始的MP3文件没有时间戳,对吧?实际上,可靠地切换到MP3文件是不可能的。你需要一个容器来实现这个功能。而且,我真的建议你不要重新编码你的文件……每次这样做都会损失质量。 - Brad
2个回答

1
我也遇到了HTML5在大型mp3文件中不准确的问题。由于音频质量对我来说不是很重要,所以我转换为恒定比特率为8kbps,采样率为8k,单声道,这解决了我的问题。
你可以使用Audacity将几个文件转换为恒定比特率(导出>保存为mp3>恒定比特率)。
或者,使用FFMPEG
ffmpeg -i input.wav -codec:a libmp3lame -b:a 8k output.mp3

如果您想将音频转换为单声道和8k采样率:
ffmpeg -i input.wav -codec:a libmp3lame -b:a 8k -ac 1 -ar 8000 output.mp3

使用第二种压缩方法将一个小时的音频压缩至不到5MB。

-1

还有其他问题。 currentTime 不应受到使用可变比特率 MP3 的影响。

也许上下文的 sampleRate 与 MP3 的采样率不同?这会破坏音频样本的定时,因为 WebAudio 将重新采样 MP3 到上下文采样率。


感谢回复,雷蒙德。我们正在讨论一个仅发生在长MP3文件中的问题,并且我已经能够使用来自不同来源的多个文件进行复制。这个人去年写了一些关于它的东西:http://terrillthompson.com/blog/624 - Brian FitzGerald
1
哦,我刚想起来。如果你在使用 Chrome 浏览器,那么在使用 WebAudio 解码 MP3 文件时可能会出现问题。Chrome 浏览器使用一个持续时间的估计值,如果估计值过短,文件将被截断。这是非常不幸的事情。 - Raymond Toy
如果你必须在音频播放中获得准确的时间,例如将文本字幕与音频文件中的单词精确同步,你会怎么做呢,Raymond?感谢您能分享的任何见解。 - Brian FitzGerald
我已经尝试使用Web音频,但仍存在同步问题。例如,howlerjs(https://github.com/goldfire/howler.js/tree/2.0)在幕后使用Web音频,并且有一个标志(html5:true)可以打开HTML5音频,这是用于长文件的。我尝试使用标志打开和关闭(HTML5 vs Web音频)加载长文件,在两种情况下都发现同步问题。我将进行更多测试,但这个人似乎认为WAV文件报告更准确。https://forestmist.org/blog/web-audio-api-loops-and-formats...我想我会尝试下一个。 - Brian FitzGerald
1
这个答案实际上是不正确的。无法完全准确地获取时间。浏览器使用响应头中返回的长度和比特率,并猜测在流中何时进行针头落下,通常会对服务器上资源的该段进行范围请求。对于可变比特率(VBR),这种猜测将比通常更加错误。 - Brad
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接