matlab - 如何使用 Matlab 获取目录中音频文件的长度(以秒为单位)?
问题描述
我需要浏览一个包含一堆音频文件(.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);
解决方案
根据您在编辑 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.');
推荐阅读
- react-native - 带有 React Native 的 Expo PDF 查看器
- vue.js - Vuetify list-item-group,列表项的价值属性中的数组?
- xcode - 在 Xcode 中启动项目后,如何正确添加源代码管理?
- json - 使用循环从Linux中的文本文件创建//附加JSON数组
- javascript - AJAX 表示 WEBMETHOD 成功,但它从未真正触发后面代码的 webmethod
- kubernetes - 连接FFServer多个实例
- ruby-on-rails - 在我的 Rails 应用程序中为用户创建汽车的问题
- javascript - 如何在不重新加载 Webpack-Dev-Server 的情况下重新加载 Service-Worker(工作箱)?
- android - Android Mockito - 模拟枚举?
- android - 如何连接片段和布局