【发布时间】:2018-05-21 10:12:40
【问题描述】:
我需要浏览一个包含一堆音频文件 (.wav) 的目录并计算每个文件的长度(以秒为单位)(然后我想将它们放在一个 .xls 或 .txt 文件中排序列)。
我找到了这段用于计算音频文件长度的代码:
[y,fs] = audioread(filename);
TotalTime = length(y)./fs; % time in seconds
我有这个要通过一个目录:
files = dir('directory');
for file = files'
% get the length of the audio file, possibly by adapting the code above?
end
但我不知道如何将两者放在一起。在循环中插入第一段代码时(当然用strcat('directory', file.name) 指定文件名),我得到一个具有单个值的矩阵,我猜这是所有文件长度的总和。
任何提示/帮助?谢谢!
编辑: 我需要的基本上是这样的:进入一个目录,遍历每个音频文件,获取每个文件的长度/持续时间(以秒为单位),将值保存在向量中,转到下一个音频文件;如上所述将最终向量导出到文件中。
编辑 2: 我试过这段代码:
files = dir('directory/*.wav');
i = 1
for file = files'
[y,fs] = audioread((strcat('directory', file.name)));
duration(i) = length(y)./fs; % time in seconds
i = i+1;
end
但向量不包含确切顺序的持续时间。第二个文件的持续时间与向量的第二个值不对应,第三个也不对应。所以我猜出了点问题。
编辑 3 当我单独计算时,结果是一致的——即。如果我从第二个文件中提取 y 和 fs,然后计算长度(y)./fs,结果是正确的(我在 Audacity 中手动检查该文件的长度,看看是否对应于 Matlab 所说的),第三个相同和第四个文件(我尝试了四个,我有 256 个要计算,这就是为什么我想要一种快速自动完成的方法)。是的,我单独获得的值出现在向量中,但不是我期望的值,所以我认为循环中有问题。
编辑 4 我按照@EdR 的建议做了,我看到循环像这样遍历文件:文件 1.wav,然后是 10.wav,然后是 100.wav,101.wav 等等(我的文件编号从 1 到 256) .为避免这种情况,使用以下代码:
for file=1:256
audioname=sprintf('%d',file);
audioname=strcat('directory', audioname, '.wav');
[y,fs] = audioread(audioname);
duration(file) = length(y)./fs; % time in seconds
end
现在它可以工作并给出正确的长度。下一步是将此向量导出到 xls 文件中:每行中包含单个值的单列(直到现在我还没有找到这样做的方法)。
编辑 5
我用下面的代码解决了这个问题,谢谢大家!我将duration(file) 更改为duration(file,:),以便将值存储在单个列中(抱歉,我是Matlab 新手,慢慢了解解决遇到的具体问题需要什么)。
for file=1:256
audioname=sprintf('%d',file);
audioname=strcat('directory', audioname, '.wav');
[y,fs] = audioread(audioname);
duration(file,:) = length(y)./fs; % time in seconds
end
excelname = 'filename';
xlswrite(excelname, duration);
【问题讨论】:
-
请编辑问题以更清楚地描述您在循环中所做的事情
-
在循环中我只需要遍历目录并获取每个音频文件的长度。
-
我需要的基本上是:进入一个目录,遍历每个音频文件,以秒为单位获取长度/持续时间,将值保存在向量中,转到下一个音频文件。
-
如果您在循环中有一条语句
A = somecalculations;,并且没有索引到正确长度的A,那么您将得到的只是循环中最终时间的值。如果不向我们展示详细信息,我们无法知道这是否是问题所在。 -
长度是否看起来乱序,但与其中一个文件相对应?它们是否与您的预期时间相关,即更长的文件有更大的数字等?
标签: matlab file audio wav duration