我曾经使用ffmpeg计算服务器端MP3文件的持续时间 - 这似乎工作正常。今天我发现有些计算错了。不知何故,由于某种原因,ffmpeg会错误计算持续时间,而且似乎只会发生可变比特率mp3文件。
在本地测试时,我注意到ffmpeg以绿色打印了两条额外的行。
使用的命令:
ffmpeg -i song_9747c077aef8.mp3
ffmpeg说:
[mp3 @ 0x102052600] max_analyze_duration 5000000 reached at 5015510
[mp3 @ 0x102052600] Estimating duration from bitrate, this may be inaccurate
在一个不错的,温暖的谷歌会议之后,我发现了一些帖子,但没有找到解决方案。
然后我尝试增加最长持续时间:
ffmpeg -analyzeduration 999999999 -i song_9747c077aef8.mp3
在此之后,ffmpeg仅返回第二行:
[mp3 @ 0x102052600] Estimating duration from bitrate, this may be inaccurate
但在任何一种情况下,计算的持续时间都是完全错误的。将其与VLC进行比较我注意到持续时间是正确的。
经过更多的研究,我偶然发现了mp3info - 我安装和使用了它。
mp3info -p "%S" song_9747c077aef8.mp3
mp3info然后返回 CORRECT 持续时间,但仅作为整数,我无法使用,因为我需要更准确的数字。用户 blahdiblah 在下面的评论中解释了这个原因 - mp3info只是从文件中提取ID3信息而不是实际执行任何计算。
我也尝试使用mplayer来检索持续时间,但就像ffmpeg一样,mplayer返回了错误的值。
答案 0 :(得分:20)
我终于使用sox找到了解决这个问题的正确方法 - 它会返回正确的信息。
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
答案 1 :(得分:10)
您可以完全解码文件以获得实际持续时间:
ffmpeg -i input.mp3 -f null -
控制台输出的第二行到最后一行将显示如下内容:
size=N/A time=00:03:49.12 bitrate=N/A
time
是实际持续时间。在这个例子中,整个过程大约需要0.5秒。
答案 2 :(得分:1)
LordNeckbeard的扩展解决方案。要仅获取统计信息,可以添加标志-v quiet -stats
ffmpeg -v quiet -stats -i input.mp3 -f null -
答案 3 :(得分:1)
更简单的方法是使用ffmpeg从ID3标签中存在错误持续时间的文件中复制文件。这会导致它写入正确的信息。
ffmpeg -i "audio.mp3" -acodec copy "audio_fixed.mp3"
由于它使用复制,因此只花费原始编码时间的一小部分。这首歌很难被察觉,但是您可以通过7小时的有声读物来欣赏它。重新编码后,ID3“ Duration”标签现在具有正确的信息。
答案 4 :(得分:0)
AV_LOG_FORCE_NOCOLOR=y ffmpeg -nostdin -hide_banner -nostats -loglevel info -i audio.mp3 -f null -vn -c:a copy - 2>&1 | tail -n 2
if [[ "$(AV_LOG_FORCE_NOCOLOR=y ffmpeg -nostdin -hide_banner -nostats -loglevel info -i video.mp4 -f null -c copy - 2>&1 | tail -n 2 | head -n 1)" =~ \ time=([0-9]+):([0-9]{2}):([0-9]{2})\.([0-9]+) ]]; then
declare duration=0 us="${BASH_REMATCH[4]}" t
for t in "${BASH_REMATCH[@]:1:3}"; do
((duration *= 60))
((duration += ${t#0} ))
done
while [ ${#us} -lt 6 ]; do us+=0; done
((us >= 500000)) && ((duration++))
((duration)) || ((duration++))
fi
echo -E Duration: "$duration"
答案 5 :(得分:0)
ffmpeg 将打印所有文件信息。
使用 grep 或 awk 仅返回“持续时间”:
ffmpeg -i file.mp3 2>&1 | grep Duration
ffmpeg -i file.mp3 2>&1 | awk '/Duration/ { print substr($2,0,length($2)-1) }'
答案 6 :(得分:-1)
sudo apt install sox
sudo apt-get install libsox-fmt-mp3
然后:
sox yourfile.mp3 -n stat