1、wav音频文件的格式

wav文件由文件头和采样数据2部分组成。

文件头又分为RIFF(Resource Interchange File Format)、WAVE文件标识段 和 声音数据格式说明段组成。

各段的起始地址分别由RIFF标识符、WAVE标识符、以及波形格式标识符(FMT)标定。

(1)文件头格式

注意:下面的地址是连续的

(2)数据格式

虽然上图给出的数据标识符起始地址刚好是文件头的末地址+1,但并不代表总是这样。

因此,我们在读取数据时最好是找到数据标识符,该标识符的4个字节刚好是'd'、‘a’、‘t’、‘a’。

2、C语言读取wav文件

首先对一些类型使用了重定义

typedef unsigned char uchar;

typedef unsigned char uint8;

typedef unsigned short uint16;

typedef unsigned long uint32;

typedef char sint8;

typedef short sint16;

typedef long sint32;

typedef float fp32;

typedef double fp64;

typedef enum BOOLEAN

{

TRUE = 1,

FALSE = 0

} boolean;

(1)wav结构体定义

//wave文件头

typedef struct WaveHeader

{

uint8 riff[4]; //资源交换文件标志

uint32 size; //从下个地址开始到文件结尾的字节数

uint8 wave_flag[4]; //wave文件标识

uint8 fmt[4]; //波形格式标识

uint32 fmt_len; //过滤字节(一般为00000010H)

uint16 tag; //格式种类,值为1时,表示PCM线性编码

uint16 channels; //通道数,单声道为1,双声道为2

uint32 samp_freq; //采样频率

uint32 byte_rate; //数据传输率 (每秒字节=采样频率×每个样本字节数)

uint16 block_align; //块对齐字节数 = channles * bit_samp / 8

uint16 bit_samp; //bits per sample (又称量化位数)

} wave_header_t;

typedef struct WaveStruct

{

FILE *fp; //file pointer

wave_header_t header; //header

uint8 data_flag[4]; //数据标识符

uint32 length; //采样数据总数

uint32 *pData; //data

} wave_t;

wave_t wave;

(2)读取文件头信息

/*

* open *.wav file

*/

void WaveOpen(char *file, int raw, int mono_stereo)

{

uchar temp = 0;

uint8 read_bytes = 0;

char *channel_mappings[] = {NULL,"mono","stereo"};

uint32 total_time = 0;

struct PlayTime //播放时间

{

uint8 hour;

uint8 minute;

uint8 second;

} play_time;

if(NULL == (wave.fp=fopen(file, "rb"))) /* open file */

{

printf("file %s open failure!\n", file);

}

/* read heade information */

if(4 != fread(wave.header.riff, sizeof(uint8), 4, wave.fp)) /* RIFF chunk */

{

printf("read riff error!\n");

return;

}

if(1 != fread(&wave.header.size, sizeof(uint32), 1, wave.fp)) /* SIZE : from here to file end */

{

printf("read size error!\n");

return;

}

if(4 != fread(wave.header.wave_flag, sizeof(uint8), 4, wave.fp)) /* wave file flag */

{

printf("read wave_flag error!\n");

return;

}

if(4 != fread(wave.header.fmt, sizeof(uint8), 4, wave.fp)) /* fmt chunk */

{

printf("read fmt error!\n");

return;

}

if(1 != fread(&wave.header.fmt_len, sizeof(uint32), 1, wave.fp)) /* fmt length */

{

printf("read fmt_len error!\n");

return;

}

if(1 != fread(&wave.header.tag, sizeof(uint16), 1, wave.fp)) /* tag : PCM or not */

{

printf("read tag error!\n");

return;

}

if(1 != fread(&wave.header.channels, sizeof(uint16), 1, wave.fp)) /* channels */

{

printf("read channels error!\n");

return;

}

if(1 != fread(&wave.header.samp_freq, sizeof(uint32), 1, wave.fp)) /* samp_freq */

{

printf("read samp_freq error!\n");

return;

}

if(1 != fread(&wave.header.byte_rate, sizeof(uint32), 1, wave.fp)) /* byte_rate : decode how many bytes per second */

{ /* byte_rate = samp_freq * bit_samp */

printf("read byte_rate error!\n");

return;

}

if(1 != fread(&wave.header.block_align, sizeof(uint16), 1, wave.fp)) /* quantize bytes for per samp point */

{

printf("read byte_samp error!\n");

return;

}

if(1 != fread(&wave.header.bit_samp, sizeof(uint16), 1, wave.fp)) /* quantize bits for per samp point */

{ /* bit_samp = byte_samp * 8 */

printf("read bit_samp error!\n");

return;

}

/* jump to "data" for reading data */

do

{

fread(&temp, sizeof(uchar), 1, wave.fp);

}

while('d' != temp);

wave.data_flag[0] = temp;

if(3 != fread(&wave.data_flag[1], sizeof(uint8), 3, wave.fp)) /* data chunk */

{

printf("read header data error!\n");

return;

}if(1 != fread(&wave.length, sizeof(uint32), 1, wave.fp)) /* data length */

{

printf("read length error!\n");

}

/* jduge data chunk flag */

if(!StrCmp(wave.data_flag, "data", 4))

{

printf("error : cannot read data!\n");

return;

}

total_time = wave.length / wave.header.byte_rate;

play_time.hour = (uint8)(total_time / 3600);

play_time.minute = (uint8)((total_time / 60) % 60);

play_time.second = (uint8)(total_time % 60);

/* printf file header information */

printf("%s %ldHz %dbit, DataLen: %ld, Rate: %ld, Length: %2ld:%2ld:%2ld\n",

channel_mappings[wave.header.channels], //声道

wave.header.samp_freq, //采样频率

wave.header.bit_samp, //每个采样点的量化位数

wave.length,

wave.header.byte_rate,

play_time.hour,play_time.minute,play_time.second);

//fclose(wave.fp); /* close wave file */

}

按结构体一点点的读出文件头的信息,请注意

/* jump to "data" for reading data */

的那一段,“先识别data标识符,再接着往下读取”。

(3)读数据

在读完数据长度之后就全是数据了,直接使用fread按uint32格式读取数据即可,我这里每次读取1152个数据(即一帧)。

/*

* get wave data

*/

uint32* GetWave(void)

{

static uint32 buffer[1152] = {0};

uint16 n = 0;

uint16 p = 0;

p = fread(buffer, sizeof(uint32), n, wave.fp);

if(!p)

{

return 0;

}

else

{

for(; p

{

buffer[p] = 0;

}

return buffer;

}

}

上面程序中注意几点,

(1)不要定义大容量的局部变量,因为局部变量存放在堆栈中。如果一定要定义,要定义成static类型。

(2)不要返回局部变量的的地址,因为在堆栈中的地址值是不确定的。

上面的程序返回局部数组的指针,前提是 已经将数据存放在静态数据存储区。

但不管怎样,返回局部变量的地址总是不好的。

c语言 文件 long double 读取,读取*.wav音频文件相关推荐

  1. python切割音频文件_python切割和合并wav音频文件

    切割wav音频文件 如果没有pydub需要使用pip install pydub来安装模块 from pydub import AudioSegment from pydub.utils import ...

  2. 如何用C语言编写wav读取函数,C++读取WAV音频文件的头部数据的实现方法

    C++读取WAV音频文件的头部数据的实现方法 前言: 在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正.写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有 ...

  3. 读取*.wav音频文件

    1.wav音频文件的格式 wav文件由文件头和采样数据2部分组成. 文件头又分为RIFF(Resource Interchange File Format).WAVE文件标识段 和 声音数据格式说明段 ...

  4. python音频频谱_Python 读取WAV音频文件 画频谱的实例

    Python 读取WAV文件 import wave import struct from scipy import * from pylab import * #读取wav文件,我这儿读了个自己用p ...

  5. python音频频谱_Python读取WAV音频文件 画频谱的方法

    Python 读取WAV文件 import wave import struct from scipy import * from pylab import * #读取wav文件,我这儿读了个自己用p ...

  6. C语言解析WAV音频文件

    转载:http://www.cnblogs.com/LexMoon/p/wave-c.html 1.C语言解析WAV音频文件 代码地址: Github : https://github.com/Cas ...

  7. java 双声道音频_java实现切割wav音频文件的方法详解【附外部jar包下载】

    本文实例讲述了java实现切割wav音频文件的方法.分享给大家供大家参考,具体如下: import it.sauronsoftware.jave.Encoder; import it.sauronso ...

  8. Java程序获取和修改.wav音频文件的内部结构

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/79498075冷血之心的博客) wav音频文件是一种无损的音频文件, ...

  9. 使用python绘制wav 音频文件频谱图

    1.wav 文件需要是Windows PCM 格式(未压缩),请参考 2.python 库的安装: pip install pyaudio(可能会用到) pip install matplotlib( ...

最新文章

  1. 告别2019:属于深度学习的十年,那些我们必须知道的经典
  2. oracle本地连接地址,关于Oracle本地连接出现与监听有关的问题的解决方法探讨,oracle本地连接...
  3. Python 学习之二: module, import 与 import as
  4. Oracle学习笔记之三,Oracle 11g数据库的启动与关闭
  5. Shell之系统函数和自定义函数
  6. Android 简单天气预报
  7. java abstractset 继_java集合框架-AbstractSet
  8. 字符与字符串操作——Windows via C/C++
  9. python 字典查询比列表快_Python 字典和列表的对比应用
  10. 领导再也不会因为模型刷新不出来批评我啦---论IE扩内存(转载)
  11. 【ElasticSearch】Es 源码之 AliasValidator 源码解读
  12. MongoDB 插入、更新、删除
  13. FeedingBottle——体积小巧的 Aircrack-ng GUI
  14. [原创]Ladon7.5大型内网渗透扫描器Cobalt Strike
  15. 音痴测试软件,写歌软件有哪些,推荐一款能拯救音痴的软件
  16. 易语言版{大智慧/分析家/飞狐交易师}DLL插件接口开发模块(beta5),自定义股票软件公式扩展函数
  17. 云服务器防 DDoS 攻击的几种方法策略分享
  18. 虚拟机之Jvm、dalvik、art联系和区别
  19. 关于压电式雨量传感器技术相关问答的回复
  20. 盐城工学院计算机考研,厉害!盐城工学院海生学院毕业生考研成功率近六成

热门文章

  1. TensorFlow 安装protoc
  2. 增大iphone音量技巧_就算我们把手机音量开到最大!外放声音还是小,那是这个设置没开...
  3. Matplotlib实例教程 | 配色表 colors
  4. Python入门100题 | 第040题
  5. Python入门100题 | 第029题
  6. gitHub使用记录
  7. 库存系统难破题?京东到家来分享
  8. make things simple
  9. 【大数据风控体系】理想大数据风控体系
  10. 康奈尔大学王飞博士:AI处理医疗数据面临的8大挑战