获取WAV文件的最小、最大和总长度
我有一个文件夹,里面有几百个 wav
文件。我想知道最短的 wav 文件的最小长度(以毫秒为单位)和最长的长度。我还想知道所有文件的总长度。
我知道可以用 sox
和 sed
来获取单个 wav 文件的长度,像这样:
sox some_file.wav -n stat 2>&1 | sed -n 's#^Length (seconds):[^0-9]*\([0-9.]*\)$#\1#p'
我想到的最简单的方法是用一个 Python
脚本来遍历我所有的文件,因为它们的文件名都是通用的、连续的({001-800}.wav),然后调用上面的代码。不过,我不太确定该怎么做。我知道 subprocess
应该是要用的模块,但我搞不清楚怎么使用管道。
现在我卡在了类似这样的代码上:
import subprocess
import shlex
min = 1000
max = 0
total = 0
for i in range(1,801):
cmd = "sox %03d.wav -n stat 2>&1 | sed -n 's#^Length (seconds):[^0-9]*\([0-9.]*\)$#\1#p" % i
subprocess.call(shlex.split(cmd))
# here is where I would catch the output and do the calculations with min, max, and total
1 个回答
2
你提到的cmd
其实是一个命令行管道。默认情况下,subprocess.call()
不会调用命令行,也就是说,如果你不加shell=True
,你的命令会失败(在这种情况下要用字符串作为参数)。如果你想获取输出,可以这样调用:
output = subprocess.check_output(cmd, shell=True)
你也可以不使用命令行,而是用纯Python的解析器,具体可以参考这个如何获取.avi文件长度的问题:
#!/usr/bin/env python
from glob import glob
from hachoir_metadata import extractMetadata
from hachoir_parser import createParser
entries = [(path, extractMetadata(createParser(path)).get('duration'))
for path in glob(u"*.wav")]
print "Min: path(%s), duration(%s)" % min(entries, key=lambda (_,d): d)
print "Max: path(%s), duration(%s)" % max(entries, key=lambda (_,d): d)
print "Total: duration(%s seconds)" % sum(d.total_seconds() for _, d in entries)
要安装hachoir库,可以运行:
$ pip install hachoir-{core,parser,metadata}