如何使用命令行查找多个mp3的累积持续时间?

如何使用命令行查找多个mp3的累积持续时间?

我有一个包含大量 mp3 文件的目录,我需要一种简单的方法来查找它们的累积持续时间。我知道我可以找到一个文件的持续时间

ffmpeg -i <file> 2>&1 | grep Duration

我还知道我可以使用以下命令对目录中的所有 mp3 文件运行此命令

for file in *.mp3; do ffmpeg -i "$file" 2>&1 | grep Duration; done

这可以稍微过滤一下

for file in *.mp3; do ffmpeg -i "$file" 2>&1 | grep Duration | cut -f4 -d ' '; done

但我该如何总结这一切呢?使用ffmpeg是没有必要的。输出格式也不是那么重要。秒或 mm:ss 或类似的东西都可以。我希望它看起来像这样:

$ <command>
84:33

答案1

您可以准确获得以秒为单位的持续时间,然后将它们与 bc 相加:

for file in *.mp3;do ffprobe -v error -select_streams a:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 "$file";done|paste -sd+|bc -l

请自行将此数字转换为 HH:MM:SS 格式。例如https://stackoverflow.com/a/12199816/6481121

答案2

Ipors Sicer的回答工作完美。为了补充他的答案,我删除了点后的所有内容并使用这个答案稍作修改即可得到:

secs=$(for file in *.mp3;
    do ffprobe -v error -select_streams a:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 "$file";
done | paste -sd+|bc -l|cut -f1 -d '.'); 
printf '%d:%d\n' $(($secs/60)) $(($secs%60))

我得到了这个输出:

87:2

相关内容