首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获取MP3文件(VBR或CBR)服务器端的实际持续时间

如何获取MP3文件(VBR或CBR)服务器端的实际持续时间
EN

Stack Overflow用户
提问于 2012-05-04 03:02:26
回答 7查看 32.3K关注 0票数 27

我过去常常在服务器端使用ffmpeg来计算MP3文件的持续时间--它似乎运行得很好。今天我发现有些计算是错的。不知何故,由于某些原因,FMPEG会错误地计算持续时间,似乎只有可变比特率的mp3文件才会发生这种情况。

在本地测试时,我注意到ffmpeg额外打印了两行绿色代码。

使用的命令:

代码语言:javascript
运行
复制
ffmpeg -i song_9747c077aef8.mp3

ffmpeg说:

代码语言:javascript
运行
复制
[mp3 @ 0x102052600] max_analyze_duration 5000000 reached at 5015510
[mp3 @ 0x102052600] Estimating duration from bitrate, this may be inaccurate

在一个很好的,温暖的谷歌会议之后,我发现了一些关于这个问题的帖子,但没有找到解决方案。

然后我尝试增加最大持续时间:

代码语言:javascript
运行
复制
ffmpeg -analyzeduration 999999999 -i song_9747c077aef8.mp3

之后,ffmpeg只返回第二行:

代码语言:javascript
运行
复制
[mp3 @ 0x102052600] Estimating duration from bitrate, this may be inaccurate

但在任何一种情况下,计算的持续时间都是完全错误的。将其与VLC进行比较,我注意到持续时间是正确的。

经过更多的研究,我偶然发现了mp3info --我安装并使用了它。

代码语言:javascript
运行
复制
mp3info -p "%S" song_9747c077aef8.mp3

然后mp3info返回了正确的持续时间,但只是一个整数,我不能使用它,因为我需要一个更准确的数字。用户blahdiblah在下面的评论中解释了原因- mp3info只是从文件中提取ID3信息,而不是实际执行任何计算。

我还尝试使用mplayer来检索持续时间,但就像ffmpeg一样,mplayer返回了错误的值。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-05-13 20:20:44

我最终使用sox找到了这个问题的正确解决方案--它返回正确的信息。

代码语言:javascript
运行
复制
sox file.mp3 -n stat
Samples read:          19321344
Length (seconds):    219.062857
Scaled by:         2147483647.0
Maximum amplitude:     1.000000
Minimum amplitude:    -1.000000
Midline amplitude:    -0.000000
Mean    norm:          0.141787
Mean    amplitude:     0.000060
RMS     amplitude:     0.191376
Maximum delta:         0.947598
Minimum delta:         0.000000
Mean    delta:         0.086211
RMS     delta:         0.115971
Rough   frequency:         4253
Volume adjustment:        1.000

长度(秒):219.062857

票数 23
EN

Stack Overflow用户

发布于 2015-10-14 09:50:12

您可以对文件进行完全解码,得到实际的持续时间:

代码语言:javascript
运行
复制
ffmpeg -i input.mp3 -f null -

控制台输出的倒数第二行将显示如下内容:

代码语言:javascript
运行
复制
size=N/A time=00:03:49.12 bitrate=N/A

其中time是实际持续时间。在本例中,整个过程大约需要0.5秒。

票数 17
EN

Stack Overflow用户

发布于 2019-03-10 12:18:55

更简单的方法是使用ffmpeg从ID3标记中有错误持续时间的文件中复制文件。这会导致它写入正确的信息。

代码语言:javascript
运行
复制
ffmpeg -i "audio.mp3" -acodec copy "audio_fixed.mp3"

因为它使用复制,所以它只需要原始编码所需时间的一小部分。这在一首歌中是很难被注意到的,但是如果你有一本7小时的有声读物,你会很欣赏它的。重新编码后,ID3 "Duration“标签现在有了正确的信息。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10437750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档