WAV文件格式

WAV文件通常采用的音频编码方式是脉冲编码调制(PCM)。因为WAV格式源自Window/Intel环境,因而采用的Little Endian字节顺序存储。

WAV文件容量=(采样频率X采样位数X声道)X时间/81字节=8bit)。

WAV文件由若干个帧组成。按照在文件中的出现位置包括:RIF'FWAVE帧、Format帧、Fact帧(可选)、Data帧。

       RIFF WAVE Chunk

                              ID = ‘RIFF’

                             Size=

                           RiffType = ‘WAVE’

       Format Chunk

                              ID = ‘fmt’

                               ......

       Fact Chunk(optional)

                              ID = ‘fact’

                                ......

       Data Chunk

                              ID = ‘data’

                               Size=

                              data

除了Fact帧外,其他3个帧都是必须的。每个帧有各自的ID,位于该帧最开始位置,均为4个字节。紧跟在ID后面的是帧的大小,大小为4字节(小端方式)。

(1)RIFF WAVE

名称

长度

具体内容

ID

4 Bytes

‘RIFF’

Size

4 Bytes

FileLen-8, 整个文件大小-8

Type

4 Bytes

‘WAVE’

struct RIFF_HEADER
{
    U8	ID[4];	 //’R’,’I’,’F’,’F’
    U32	Size;	 //
    U8	Type[4];	 //’W’,’A’,’V’,’E’
}

(2)Format

此帧一般情况下为16字节,此时最后附加信息没有;如果为18字节,则最后,多了两个字节的附加信息。

名称

字节数

具体内容

ID

4

fmt

Size

4

1618(数值),

18则最后有附加信息

FormatTag

2

编码方式,一般为0x0001

Channels

2

声道数目,1-单声道,2-

SamplesPerSec

4

采样频率

AvgBytesPerSec

4

每秒所需字节数

BlockAlign

2

数据块对齐单位(每个采样需要的字节数)

BitsPerSample

2

每个采样需要的bit

附加信息

2

附加信息(可选,通过Size判断有无)

struct WAVE_FORMAT{
    U32	 ID;//ID, fmt
    U32	 Size;
    U16	 FormatTag;
    U16	 Channels;
    U32	 SamplesPerSec;
    U32	 AvgBytesPerSec;
    U16	 BlockAlign;
    U16	 BitsPerSample;
    U16	 pack;	//附加信息
}

(3)Fact

WAV文件是由某些软件转化而成时可能包含的帧。

名称

所占字节数

具体内容

ID

4

“fact”

Size

4

数值4

data

4

“WAVE”

struct FACT_BLOCK{
    U8	 szFactID[4];//’f’,’a’,’c’,’t’
    U32	 dwFactSize;//
    U32	 wavFormat;//’WAVE’
}

(4)Data

保存WAV音频数据的地方。

名称

所占字节数

具体内容

ID

4

“data”

Size

4

 

data

 

WAV音频数据

struct DATA_BLOCK{
    U8	 ID[4];//’d’,’a’,’t’,’a’
    U32	 DataSize;
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中校验WAV文件格式,你可以按照以下步骤进行操作: 1. 打开WAV文件:使用C++中的文件操作函数打开WAV文件,确保成功打开文件。 2. 读取WAV文件头:从文件中读取WAV文件头信息,WAV文件头通常有44个字节,可以通过结构体来表示。 ```cpp #pragma pack(push, 1) // 确保以字节对齐方式读取结构体 struct WAVHeader { char chunkID[4]; unsigned int chunkSize; char format[4]; char subchunk1ID[4]; unsigned int subchunk1Size; unsigned short audioFormat; unsigned short numChannels; unsigned int sampleRate; unsigned int byteRate; unsigned short blockAlign; unsigned short bitsPerSample; }; #pragma pack(pop) ``` 3. 校验WAV文件头信息:根据WAV文件头的字段进行校验,例如检查chunkID是否为"RIFF",format是否为"WAVE",subchunk1ID是否为"fmt "等。 4. 检查音频格式:根据需要,可以进一步检查音频格式是否符合要求,例如检查音频采样率、声道数、位深度等。 5. 关闭文件:在校验完毕后,记得关闭文件。 下面是一个简单的示例代码,演示了如何校验WAV文件格式: ```cpp #include <iostream> #include <fstream> using namespace std; bool validateWAVFile(const string& filename) { ifstream file(filename, ios::binary); if (!file) { cout << "Failed to open file: " << filename << endl; return false; } WAVHeader header; file.read(reinterpret_cast<char*>(&header), sizeof(WAVHeader)); if (strncmp(header.chunkID, "RIFF", 4) != 0 || strncmp(header.format, "WAVE", 4) != 0 || strncmp(header.subchunk1ID, "fmt ", 4) != 0) { cout << "Invalid WAV file format" << endl; return false; } // 可以根据需要进一步校验其他字段 file.close(); return true; } int main() { string filename = "example.wav"; bool isValid = validateWAVFile(filename); if (isValid) { cout << "WAV file format is valid" << endl; } else { cout << "WAV file format is invalid" << endl; } return 0; } ``` 请注意,此示例代码仅校验了WAV文件头信息,如果需要更详细的检查,你可以根据具体需求进一步扩展代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值