#包括<iostream>
#包括<fstream
#包含<矢量>
#包括<cstdint>
//WAV文件头结构
结构 Twavheader公司
{
烧焦 块_ID[4]; //4 riff_mark[4];
单位32_t块_大小; //4文件大小;
烧焦 格式[4]; //4波str[4];
烧焦 sub_chunk1_ID[4]; //4 fmt_str[4];
单位32_tsub_chunk1_大小; //4个pcm_bit_num;
单位16_t音频格式(_F); //2 pcm编码;
单位16_tnum_channels(频道数); //2个声道;
单位32_t采样速率(_R); //4 pcm采样频率;
单位32_t字节速率; //4字节_请求;
单位16_t块对齐(_A); //2块对齐;
单位16_t每采样位数; //2个样本位;
烧焦 sub_chunk2_ID[4]; //4 data_str[4];
单位32_tsub_chunk2_大小; //4声音大小;
}; //总计44字节
//------------------------------------------------------------------------------
空隙 读取wav_file(标准::一串 文件名)
{
//打开WAV文件
标准::文件流 波形文件(文件名, 标准::网间网操作系统::二元的);
如果(波形文件.打开(_O)())
{
//读取WAV标题
Twavheader公司波浪;
波形文件.阅读(重新解释广播<烧焦*>(&波浪), 大小(Twavheader公司));
//如果文件是有效的WAV文件
如果 (标准::一串(波浪.格式, 4) != “WAVE”(波浪) || 标准::一串(波浪.块_ID, 4) != “里夫”)
{
波形文件.关闭();
标准::塞尔 << “不是波浪或裂口!” << 标准::端部;
返回;
}
//WAV文件的属性
标准::cout公司 << “文件名:” << 文件名 << 标准::端部;
标准::cout公司 << “文件大小:” << 波浪.块_大小+8 << 标准::端部;
标准::cout公司 << “资源交换文件标记:” << 标准::一串(波浪.块_ID, 4) << 标准::端部;
标准::cout公司 << “格式:” << 标准::一串(波浪.格式, 4) << 标准::端部;
标准::cout公司 << “频道:” << 波浪.num_channels(频道数) << 标准::端部;
标准::cout公司 << “采样率:” << 波浪.采样速率(_R) << “赫兹” << 标准::端部;
标准::cout公司 << “每个样本位数:” << 波浪.每采样位数 << “位” << 标准::端部;
//读取波形数据
标准::矢量<整数16_t> 音频数据( 波浪.sub_chunk2_大小 / 大小(整数16_t) );
波形文件.阅读(重新解释广播<烧焦*>( 音频数据.数据() ), 波浪.子块2_大小 );
波形文件.关闭(); //关闭音频文件
//显示一些音频样本
常数 尺寸_tnumof样本 = 20;
标准::cout公司 <<“先列出” << numof样本 << “示例:” << 标准::端部;
对于 (大小_t吨 我 = 0; 我 < numof样本 && 我 < 音频数据.大小(); ++我)
{
标准::cout公司 << 我 << ":" << 音频数据[我] << 标准::端部;
}
标准::cout公司 << 标准::端部;
}
}
//------------------------------------------------------------------------------
整数 主要的()
{
读取wav_file(“D:\\sample.wav”);
系统(“暂停”);
返回 0;
}