bash - 如何使用 sox 获取音频文件总和的长度?
问题描述
我有一个脚本如下
DIR=$1
ls $1 |sort -R |tail -$5 |while read file; do
soxi -d $1$file
done
它给了我一个像
00:40:35.18
00:43:41.23
01:04:19.64
00:59:41.92
00:51:16.32
如您所见,程序从文件夹中随机选择一个文件(音频)并检查每个文件的时间。但是,我需要所有音频长度的总和。
如何获取音频文件的总数?
解决方案
- 使用
soxi
's-D
选项以(小数)秒为单位获取持续时间 - 用于
bc
将秒数加到总数中 - 不要
ls
用于列出文件 - 不要通过管道进入 while 循环,因为您需要设置变量,并且它们会在循环后丢失。
所以这里是一个例子,在某个目录下选择3个随机的“*.wav”文件
#!/bin/bash
total=0
dir=/some/dir
while read -r f; do
d=$(soxi -D "$f")
echo "$d s. in $f"
total=$(echo "$total + $d" | bc)
done < <(find "$dir" -iname "*.wav" | sort -R | head -3)
echo "Total : $total seconds"
如果您可以使用Mediainfo而不是 sox,您可以获得以毫秒为单位的持续时间,并使用标准 shell 算法进行加法运算。它还支持更多的音频格式。
#!/bin/bash
total=0
dir=/some/dir
while read -r f; do
d=$(mediainfo --Output='General;%Duration%' "$f")
((total += d))
done < <(find "$dir" -iname "*.wav")
echo "Total : $total ms. or $((total/1000)) seconds"
(为简单起见,第二个示例没有随机选择)
推荐阅读
- android - 如何使用 Android Studio 3.4 和 gradle 5.5 恢复密钥密码
- javascript - Firebase firestore - 数据必须是一个对象,但它是:一个自定义对象对象
- amazon-web-services - AWS RDS MySQL 只读副本选项灰显 - 只有极光只读副本可用
- javascript - 带有会话存储的 NGINX JavaScript 模块(如 Redis)
- sql - 使用 Case When 创建多个计数列
- mysql - SQL 连接表并在右表中显示不匹配记录的默认值
- c# - 如何删除同一字符串中两个单词之间的空格
- pandas - 使用正则表达式匹配数据框中的列
- ios - 如何仅通过邀请将 iOS 应用分发给 50k 用户?
- here-api - Here Maps javascript api 3.1 and Internet Explorer support