【问题标题】:Get min, max, and total length of wav files获取 wav 文件的最小、最大和总长度
【发布时间】:2014-05-06 11:44:10
【问题描述】:

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

【问题讨论】:

标签: python subprocess pipe wav sox


【解决方案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}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-29
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多