获取wav文件的最小,最大和总长度

时间:2014-05-06 11:44:11

标签: python subprocess pipe wav sox

我有一个包含数百wav个文件的文件夹。我想分别获得最短wav文件和最大长度的最小长度(以毫秒为单位)。我还想得到所有文件的总长度。

我知道我可以使用soxsed来获取单个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 个答案:

答案 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}