如何确定wav文件的持续时间

如何确定wav文件的持续时间,wav,Wav,我正在处理.wav文件,需要以秒为单位获取它们的持续时间。 到目前为止,我一直在用以下方法确定: 文件大小/字节率 字节率为(采样率*比特率*通道)/8。 对于较小的文件,当我试图解析较大的文件时,我得到的时间比实际持续时间多 例如: 大小(字节):45207622字节率:176400持续时间:256 (45207622/176400) 但实际持续时间是250 仅供参考:我已经仔细检查了大小和字节率,它们是正确的。如果没有RIFF头示例或您的代码,将很难回答您问题中的细节。(例如,为什么你的数学

我正在处理.wav文件,需要以秒为单位获取它们的持续时间。 到目前为止,我一直在用以下方法确定:

文件大小/字节率

字节率为(采样率*比特率*通道)/8。 对于较小的文件,当我试图解析较大的文件时,我得到的时间比实际持续时间多

例如:

大小(字节):45207622字节率:176400持续时间:256 (45207622/176400)

但实际持续时间是250


仅供参考:我已经仔细检查了大小和字节率,它们是正确的。

如果没有RIFF头示例或您的代码,将很难回答您问题中的细节。(例如,为什么你的数学没有达到你的预期结果。)

但是,既然您在注释中指定使用C语言,我是否可以建议使用
sox
库,而不是使用新编写的代码解析标题?除了捕获大量边缘情况外,这还允许您支持任何格式
sox
支持读取,而无需自己编写任何读取代码。(尽管任何愿意这样做的人可能都应该看一下和。至少在大多数情况下,过程应该与问题中描述的方法大致相同。[编辑:即区块数据长度除以标头的字节率。]

示例代码:

#include <sox.h>
#include <stdio.h>

int main(int argc, char **argv) {
  sox_format_t *fmt;
  if(argc < 2) {
    printf("Please provide audio file.\n");
    return 1;
  }
  fmt = sox_open_read(argv[1], NULL, NULL, NULL);
  __uint64_t ws = fmt->signal.length / fmt->signal.channels;
  if(fmt->signal.length) {
    printf("%0.2f seconds long\n", (double)ws / fmt->signal.rate);
  } else {
    printf("Cannot determine duration from header.\n");
  }
}
#包括
#包括
int main(int argc,字符**argv){
sox_格式*fmt;
如果(argc<2){
printf(“请提供音频文件。\n”);
返回1;
}
fmt=sox_open_read(argv[1],NULL,NULL,NULL);
__uint64_t ws=fmt->signal.length/fmt->signal.channels;
如果(fmt->信号长度){
printf(“%0.2f秒长\n”,(双精度)ws/fmt->signal.rate);
}否则{
printf(“无法从标题确定持续时间。\n”);
}
}

对于任何好奇的人来说,我主要是从sox命令行工具的源代码中派生出来的。

感谢EPR为我的程序提供了定时修复。我没有使用libsox,我已经设置了一个struct试图匹配原始文件,但这不是正确的方法,但它适用于简单文件。另一个有用的参考是

无论如何,我假设头是44字节,并将其读入结构位置的内存中。然后我可以访问pcm数据的结构、malloc空间的字段,并从文件指针所在的pcm空间中读取()。我只是在写一个听力图程序,所以它需要接近正确的WAV文件,我用arecord,sox,Audacity生成。始终为2个通道,采样率为44100。我的结构:

struct wavhdr { // defined by Microsoft, needs to match
  char riff[4];  // should be "RIFF"
  uint32_t len8; // file length - 8
  char wave[4];  // should be "WAVE"
  char fmt[4];   // should be "fmt "
  uint32_t fdatalen; // should be 16 (0x10)
  uint16_t ftag;     // format tag, 1 = pcm
  uint16_t channels; // 2 for stereo
  uint32_t sps;      // samples/sec
  uint32_t srate;    // sample rate in bytes/sec (block align)
  uint16_t chan8;    // channels * bits/sample / 8 
  uint16_t bps;      // bits/sample
  char data[4];      // should be "data"
  uint32_t datlen;   // length of data block
  // pcm data follows this  
} hdr;

我试图使用测量的文件大小-标题长度/samples/sec,这不起作用,我被关了6倍。

并且用什么编程语言你需要它:是python解决方案。谢谢你的回答,我使用C。在你的链接中,它说帧数/帧速率,但我不清楚什么是帧数和帧速率,或者我该如何得到它们。