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