繁体   English   中英

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

[英]Get min, max, and total length of wav files

我有一个包含数百个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

您的示例中的cmd是Shell管道。 subprocess.call()默认情况下不会调用外壳程序,即,除非指定shell=True (在这种情况下使用字符串参数),否则您的命令应该会失败。 要获取输出,可以调用:

output = subprocess.check_output(cmd, shell=True)

您可以避免调用Shell命令,而使用“ 如何获取.avi文件长度”问题中演示的纯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)

要安装hachoir库 ,请运行:

$ pip install hachoir-{core,parser,metadata}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM