所以我想显示 MP3 文件及其持续时间的列表。
ffprobe
确实显示了文件的持续时间。但它的输出却很糟糕。它把所有的东西都放进去stderr
,我发现没有办法删除它关于它是如何编译的“非常有用”的信息。
因此,如果我循环它*.mp3
,每次都会显示该信息。
我可以编写一个过滤器脚本,但可能有更简单的解决方案吗?
答案1
要获得这样的输出:
00:07:22 first.mp3
00:02:33 second.mp3
00:04:04 third.mp3
使用:
for file in *.mp3
do
echo -n $(ffprobe "$file" 2>&1 | grep 'Duration' | cut -d',' -f1 | cut -d' ' -f4 | cut -d'.' -f1)
echo " $file"
done
在哪里
2>&1
将 stderr 重定向到 stdoutgrep ...
仅过滤具有持续时间的行- 第一次
cut ...
摘录Duration: 00:07:22.33
- 第二次
cut ...
摘录00:07:22.33
- 第三次
cut ...
摘录00:07:22
答案2
您可以轻松地删除使用stderr
该-loglevel -quiet
选项输入的信息。在这种情况下,您必须查询要显示的字段。
[user@host ~]$ ffprobe -loglevel quiet -show_entries format=duration test/test.mp3
[FORMAT]
duration=172.434286
[/FORMAT]
现在,这仍然提供了一些可以精简的额外信息以及以秒为单位的持续时间。
[user@host test]$ ffprobe -loglevel quiet -show_entries format=duration \-print_format default=noprint_wrappers=1:nokey=1 -pretty test.mp3
0:02:52.434286
在这里,-print_format
可以使用 来消除额外的信息:
default=noprint_wrappers=1
会删除这些[FORMAT]
东西nokey=1
将删除键名duration=
最后但并非最不重要的一点是,您可以使用-pretty
或 只是-sexagesimal
将持续时间(以秒为单位)转换为某种HH:MM:SS.MICROSECONDS
格式。
要查找文件夹中的所有 MP3 文件,您可以结合上面的命令find
。ffprobe
[user@host ~]$ find test/ -name '*mp3' -printf "%f:\t" -exec ffprobe -loglevel error -print_format default=noprint_wrappers=1:nokey=1 -pretty -show_entries stream=duration "{}" \;
test.mp3: 0:02:52.434286