繁体   English   中英

如何在C ++中正确读取Wave文件采样率?

[英]How to properly read in wave file sample rate in C++?

出于好奇,在学习wave文件格式和C ++时,我偶然发现了此页面 ,其中详细介绍了wave格式的规范布局

现在,我尝试编写一个C ++程序以读取采样率

char buffer[4];
// already read other values before reading sample rate
inFile.read(buffer, 4);
// conversion using little endian
sampleRate = (long) buffer[0] + ((long) buffer[1] << 8) + ((long) buffer[2] << 16) + ((long) buffer[3] << 24);

在十六进制编辑器中,我可以看到我的采样波文件的采样率为44 ac 00 00 ,转换为44100率。 但是,使用上面的代码,我总是以-21436结尾

经过一些调试后,原来的十六进制值“ ac”应在dec中转换为172,但是C ++假定十六进制值为“ ffffffac”,在dec中转换为-84。 如果C ++仅假定它是纯“ ac”,那么我将获得正确的采样率值。

所以问题是,如何从波形文件中读取数据并实际获得正确的采样率? 我是否需要做一些魔术才能去除开头的“ f”?

提前谢谢一堆!

最简单的方法如下:

// simply store bytes directly into sampleRate
long sampleRate = 0;
inFile.read(&sampleRate, 4);

您可能会怀疑,这假设您的系统是小的Endian。 要修正您的示例,必须避免强制转换为long时发生符号扩展。 声明类型为unsigned char buffer 请参阅以下内容。

unsigned char buffer[4];
inFile.read(buffer, 4);
long sampleRate = (long)buffer[0] + ((long)buffer[1] << 8) + ((long)buffer[2] << 16) + ((long)buffer[3] << 24);

有两种方法可以修复您的代码。 首先是通过使所有内容均为无符号来确保整个过程都使用无符号算术。 第二种是使用位掩码删除符号扩展名。

sampleRate = ((long) buffer[0] & 0xff) + (((long) buffer[1] << 8) & 0xff00) + (((long) buffer[2] << 16) & 0xff0000) + ((long) buffer[3] << 24);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM