如何使用Matlab获得目录中音频文件的长度(以秒为单位)?

如何使用Matlab获得目录中音频文件的长度(以秒为单位)?,matlab,file,audio,wav,duration,Matlab,File,Audio,Wav,Duration,我需要遍历一个包含大量音频文件(.wav)的目录,并计算每个文件的长度(以秒为单位)(然后我希望将它们放在一个.xls或.txt文件中,按列排序) 我发现了一段用于计算音频文件长度的代码: [y,fs] = audioread(filename); TotalTime = length(y)./fs; % time in seconds 我有一个目录: files = dir('directory'); for file = files' % get the length of t

我需要遍历一个包含大量音频文件(.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
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
但是向量不包含精确顺序的持续时间。第二个文件的持续时间与向量的第二个值不对应,第三个也不对应。所以我猜出了问题

编辑3 当我单独计算时,结果是一致的——即,如果我从第二个文件中提取y和fs,然后计算长度(y)。/fs,结果是正确的(我手动在Audacity中检查该文件的长度,看看是否与Matlab所说的一致),第三个和第四个文件也是如此(我尝试了四个,我有256个要计算,这就是为什么我想要一个快速的方法来自动计算)。是的,我获得的值单独出现在向量中,但不是我期望的位置,所以我认为循环中有问题

编辑4 我按照@EdR的建议做了,我看到循环遍历了如下文件:文件1.wav,然后是10.wav,然后是100.wav,101.wav等等(我的文件编号从1到256)。为了避免这种情况,使用以下代码:

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
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新手,慢慢了解解决遇到的特定问题所需的知识)


根据编辑4中的代码,我已经用编写Excel文件的能力得出了答案

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
xlswrite('duration.xls', duration.');

我想你正在路上

files = dir('directory');
result = {'filename','duration(s)'}
for ct = 1:length(files)
    [y,fs] = audioread(fullfile(files(ct).folder,files(ct).name));
    result(ct+1,:) = {files(ct).name,length(y)./fs}; % time in seconds
end
xlswrite('result.xlsx',result);

请编辑这个问题,以便更清楚地描述你在循环中所做的事情。在循环中,我只需要遍历目录并获取每个音频文件的长度。我需要的基本上是:进入目录,遍历每个音频文件,以秒为单位获取长度/持续时间,将值保存在向量中,转到下一个音频文件。如果在循环中有一个语句
a=somecalculations;
,并且没有索引到正确长度的
a
,那么您将得到的只是循环中最后一次的值。如果不向我们显示详细信息,我们就无法知道这是否是问题所在。长度是否看起来有问题,但与其中一个文件相对应?Do它们与您的预期时间相关,即较长的文件具有较大的数字等?这正是我接下来所做的,但我检查了第二个值,第二个值与第二个文件的长度不对应,第三个文件也是如此。因此,我猜某个地方出了问题。@s.gastaldon这些长度似乎有问题,但与一个fi对应吗les?它们是否与您的预期时间相关,即较长的文件具有较大的数字等?如上所述,如果我单独计算,结果是一致的(即,如果我从第二个文件中提取y和fs,然后计算长度(y)/fs,结果是正确的,第三个和第四个文件也是一样——我尝试了四个,我有256个文件要计算,所以我不容易检查相关性和对应关系,但我认为可以肯定的是,循环不能正常工作,因为每个操作都会产生正确的结果)。它仍然按以下顺序遍历目录:1.wav、10.wav、100.wav、101.wav、102.wav等等,而不是1.wav、2.wav、3.wav…(我有256个名为[progressive number].wav的wav文件)。但是,感谢您提供了有关如何将值存储在向量中以使其成为单个列的提示!我在“编辑4”中的代码中使用了该技巧,现在我完全获得了所需的内容。谢谢!它将其与文件名一起保存在第一列中。我想,以后使用excel很容易对其进行排序,但如果您希望按照当前方法的顺序对其进行排序的话可以。您还可以让matlab自动将文件从
1.wav
重命名为
001.wav
;-)我喜欢上面生成文件名的原因是,如果添加文件(例如257.wav),您需要更改代码。或者如果有人删除102.wav,您的代码就会崩溃。使用
dir
并在以后进行排序通常更安全。这很公平!在这种情况下,我肯定不会删除或添加任何文件(它们是EEG实验的刺激物),但感谢您的提示,我会在将来记住这一点!