我有一个包含数百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
答案 0 :(得分:1)
cmd
是一个shell管道。 subprocess.call()
默认情况下不调用shell,即除非指定shell=True
(在这种情况下使用字符串参数),否则命令应该失败。要获得输出,您可以致电:
output = subprocess.check_output(cmd, shell=True)
您可以避免调用shell命令并使用How to get .avi files length问题中演示的纯Python解析器:
#!/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)
要安装the hachoir library,请运行:
$ pip install hachoir-{core,parser,metadata}