代码之家  ›  专栏  ›  技术社区  ›  s.gastaldon

如何使用matlab获取目录中音频文件的长度(以秒为单位)?[关闭]

  •  -2
  • s.gastaldon  · 技术社区  · 6 年前

    我需要浏览一个包含大量音频文件(.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,结果是正确的(我手动检查该文件的长度,看是否与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);
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   EdR    6 年前

    根据您在编辑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.');
    
        2
  •  0
  •   Gelliant    6 年前

    我想你在路上很好。

    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);