2014-05-06 167 views
1

我有一个包含数百个wav文件的文件夹。我想分别获取最短的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 
+0

相关:[检索subprocess.call()]的输出(http://stackoverflow.com/q/1996518/4279) – jfs

+0

如果你在linux下(如果你使用sox命令,我认为是这种情况),你可以简单地使用一个shell脚本。 – Holt

回答

1

cmd在你的例子是一个管道。 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} 
相关问题