gpt4 book ai didi

audio - C++ 读取 wav 文件,subchunk1size = 65536?

转载 作者:行者123 更新时间:2023-12-02 23:51:54 25 4
gpt4 key购买 nike

我编写了一个从 .wav 文件中读取信息的程序。我收到了以下结果。

chunkId            :RIFF
chunkSize :7828798
format :WAVE
Junk chunk :JUNK
Junk size :92
Format chunk :fmt
format chunk size :65536
Audioformat :1
numberofchanels :48000
samplerate :1996488704
Byterate :131073
BlockAlign :16
bitspersample :0
subchunk2Id :
subchunk2Size :0

我不知道为什么这样的 wav 标题。我使用 sox 程序来查看这个 wav 文件的标题。
这是结果
Input File     : 'AUDIO00001.wav'
Channels : 1
Sample Rate : 48000
Precision : 16-bit
Duration : 00:01:17.28 = 3709621 samples ~ 5796.28 CDDA sectors
File Size : 7.83M
Bit Rate : 810k
Sample Encoding: 16-bit Signed Integer PCM

为什么我的程序错了??

我更新了我的问题:
我的 wav header 结构:
struct WAVHEADER
{
char chunkID[4];
unsigned int chunkSize;
char format[4];

char junkChunk[4];
int junkSize;
char junkData[92];
char bext[4];
unsigned int bextSize;
char bextData[602];
char subchunk1ID[4];
unsigned int subchunk1Size;
unsigned short audioFormat;
unsigned short numberOfChanels;
unsigned int sampleRate;
unsigned int byteRate;
unsigned short blockAlign;
unsigned short bitsPerSample;
char subchunk2ID[4];
unsigned int subchunk2Size;
};

wav类:
wav::wav(const char* filepath)
{
std::ifstream wavFile(filepath);
if(wavFile.is_open())
{
wavFile.read((char*)&wavHeader,sizeof(WAVHEADER));

}
}

我的困惑是,当 subChunk1ID 是正确的 ("fmt") 时,为什么 subchunk1Size 似乎是错误的?

最佳答案

编译器似乎在 subchunk1ID 之间插入了 2 个字节的填充。和 subchunk1Size .这是我的假设,因为

  • 你看到的是结构被“向左”移动了 2 个字节
  • 当我对此进行测试时,我注意到 sizeof(WAVHEADER)比应有的大 2 个字节。

  • 我不是 C++ 编译器专家,所以我不能告诉你它为什么这样做,除非它肯定是允许这样做的。

    为了直观地显示,该结构此时应该是这样的:

    ...
    子 block 1ID:
    01100110
    01101101
    01110100
    00100000
    子 block 1大小:
    00101000
    00000000
    00000000
    00000000
    音频格式:
    00000001
    00000000
    numberOfChanels:
    00000001
    00000000
    ...

    但相反,你得到的是:

    ...
    子 block 1ID:
    01100110
    01101101
    01110100
    00100000
    2字节填充:
    00101000
    00000000
    子 block 1大小:
    00000000
    00000000
    00000001
    00000000
    音频格式:
    00000001
    00000000
    ...
    00000000 00000000 00000001 00000000是小端字节序中的数字 65536。

    所以你真正发现的是这种结构转换不是读取文件的可靠方法。您应该改为“艰难地”阅读它(一次一个数字)。还有其他类似的陷阱,例如:
  • 字节序。
  • Existence, size and ordering of particular subchunks is not consistent in a WAV file.没有理由JUNKbext需要出现在文件中,也不需要在程序编译时知道它们的大小。
  • 关于audio - C++ 读取 wav 文件,subchunk1size = 65536?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23099921/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com