最快读取 WAV

Fastest read WAV

我正在尝试查找目录中所有文件(仅 wav)的长度(以秒为单位)。

require(tuneR)
fnam=file.path("dir")
filist=list.files(fnam, recursive=TRUE, pattern="wav" )
filist1=paste(fnam, "/", filist, sep="")
nfiles=length(filist1)

x=1:nfiles
file_len=function(n){
  inname=data_phone$filist1[n]
  if(file.info(inname)$size!=0){
    ywave=readWave(inname)
    lengthSec=length(ywave@left)/ywave@samp.rate
  } else {
    lengthSec=0 
  }
}
len_file=unlist(lapply(x,FUN=file_len))

但它处理 86k 文件的速度非常慢。也许还有另一种方法可以更快地做到这一点?

为此您只需要 header。所以我会这样做:

library("tuneR")
filist <- list.files("dir", recursive=TRUE, pattern="\.wav$", full.names = TRUE)

file_len <- function(fil) {
  if (file.info(fil)$size != 0) {
    wavHeader <- readWave(fil, header = TRUE)
    wavHeader$samples / wavHeader$sample.rate
  } else {
    0
  }
}
len_file <- sapply(filist, file_len)

我还简化并整理了您的代码,但关键的变化是使用 header = TRUE 参数给 readWave,然后使用列表的 $samples$sample.rate 成员返回。