WAVE 文件格式分析

本文深入探讨了WAVE文件格式,详细分析了其PCM数据表示、文件头结构,包括'fmt'和'data'子块的内容,并提供了一个Wave文件头的实例分析,帮助理解声音文件的存储方式。
摘要由CSDN通过智能技术生成

         WAVE 文件作为多媒体中使用的声音波形文件格式之一,它是以RIFF(Resource Interchange File Format)格式为标准的。每个WAVE文件的头四个字节便是“RIFF”。WAVE 文件由文件头和数据体两大部分组成。其中文件头又分为 RIFF/WAV 文件标识段和声音数据格式说明段两部分。WAVE文件各部分内容及格式见后文。

         常见的声音文件主要有两种,分别对应于单声道(11.025KHz 采样率、8Bit 的采样值)和双声道(44.1KHz 采样率、16Bit 的采样值)。采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期 
内声音模拟信号的积分值。

         对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。

        WAVE 文件数据块包含以脉冲编码调制(PCM)格式表示的样本。WAVE 文件是由样本组织而成的。在单声道 WAVE 文件中,声道0代表左声道,声道1代表右声道。在多声道WAVE文件中,样本是交替出现的。

        WAVE 文件除了前面一小段文件头对数据组织进行说明之外,Data 块就是声音的原始采样数据,WAVE 文件虽然可以压缩,但一般都使用不压缩的格式。44.1KHz 采样率、16Bit的分辨率、双声道,所以WAVE可以保存音质要求非常高的声音文件,CD 采用的也是这种格式,声音方面的专家或是音乐发烧友们应该非常熟悉。但这种文件的体积也非常大,以 44.1KHz 16bit 双声道的数据为例,一分钟的声音数据量为:4100*2byte*2channel*60s/1024/1024=10.09M 。所以不合适在网上传送。

下面我们具体地分析 WAVE 文件的格式:

以下是对各个字段的详细解说:

对于Data块,根据声道数和采样率的不同情况:

下面我们看一个具体的例子,声音文件如下:

对应的分析如下图所示:

1.PCM Wave格式详解

WAVE文件格式是微软RIFF(Resource Interchange File Format,资源交换文件标准)的一种,是针对于多媒体文件存储的一种文件格式和标准。 一般而言,RIFF文件由文件头和数据两部分组成,一个WAVE文件由一个“WAVE”数据块组成,这个“WAVE”块又由一个”fmt”子数据块和一个“data”子 数据块组成,也称这种格式为“Canonical form”(权威/牧师格式),如下图所示:

“WAVE”格式由两个子数据块构成:“fmt”块和“data”块,其中“fmt”块的详细解释如下: Subchunk1ID: 占4个字节,内容为“fmt ”的ASCII码(0x666d7420),以大端存储。
Subchunk1Size: 占4个字节,存储该子块的字节数(不含前面的Subchunk1ID和Subchunk1Size这8个字节),以小端方式存储。
AudioFormat:占2个字节,以小端方式存储,存储音频文件的编码格式,例如若为PCM则其存储值为1,若为其他非PCM格式的则有一定的压缩。
NumChannels: 占2个字节,以小端方式存储,通道数,单通道(Mono)值为1,双通道(Stereo)值为2,等等。
SampleRate: 占4个字节,以小端方式存储,采样率,如8k,44.1k等。
ByteRate: 占4个字节,以小端方式存储,每秒存储的bit数,其值=SampleRate * NumChannels * BitsPerSample/8
BlockAlign: 占2个字节,以小端方式存储,块对齐大小,其值=NumChannels * BitsPerSample/8
BitsPerSample: 占2个字节,以小端方式存储,每个采样点的bit数,一般为8,16,32等。
接下来是两个可选的扩展参数:
ExtraParamSize: 占2个字节,表示扩展段的大小。
ExtraParams: 扩展段其他自定义的一些参数的具体内容,大小由前一个字段给定。

其中,对于每个采样点的bit数,不同的bit数读取数据的方式不同:

“WAVE”格式文件的第二个子数据块是“data”,其个字段的详细解释如下:
Subchunk2ID: 占4个字节,内容为“data”的ASCII码(0x64617461),以大端存储。
Subchunk2Size: 占4个字节,内容为接下来的正式的数据部分的字节数,其值=NumSamples * NumChannels * BitsPerSample/8
Data: 真正的语音数据部分。

一个Wave文件头的实例

设一个wave文件的前72个字节的十六进制内容如下(可以使用Ultra Edit等工具查看wave文件头):

则其个字段的解析如下图:

使用C语言文件操作库函数实现的Wave文件读取的实例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// define Wave format structure
typedef struct tWAVEFORMATEX
{
    short wFormatTag;         /* format type */
    short nChannels;          /* number of channels (i.e. mono, stereo...) */
    unsigned int nSamplesPerSec;     /* sample rate */
    unsigned int nAvgBytesPerSec;    /* for buffer estimation */
    short nBlockAlign;        /* block size of data */
    short wBitsPerSample;     /* number of bits per sample of mono data */
    short cbSize;             /* the count in bytes of the size of */
                                    /* extra information (after cbSize) */
} WAVEFORMATEX, *PWAVEFORMATEX;

char* wavread(char *fname, WAVEFORMATEX *wf);

int main(){
  char fname[] = "test.wav";
  char *speech;
  WAVEFORMATEX wf;
  
  speech = wavread(fname, &wf);
  // afterward processing...
  
  return 0;
}

// read wave file
char* wavread(char *fname, WAVEFORMATEX *wf){
  FILE* fp;
  char str[32];
  char *speech;
  unsigned int subchunk1size; // head size
  unsigned int subchunk2size; // speech data size

  // check format type
  fp = fopen(fname,"r");
  if(!fp){
      fprintf(stderr,"Can not open the wave file: %s.\n",fname);
      return NULL;
  }
  fseek(fp, 8, SEEK_SET);
  fread(str, sizeof(char), 7, fp);
  str[7] = '\0';
  if(strcmp(str,"WAVEfmt")){
      fprintf(stderr,"The file is not in WAVE format!\n");
      return NULL;
  }
  
  // read format header
  fseek(fp, 16, SEEK_SET);
  fread((unsigned int*)(&subchunk1size),4,1,fp);
  fseek(fp, 20, SEEK_SET);
  fread(wf, subchunk1size, 1, fp);
  
  // read wave data
  fseek(fp, 20+subchunk1size, SEEK_SET);
  fread(str, 1, 4, fp);
  str[4] = '\0';
  if(strcmp(str,"data")){
      fprintf(stderr,"Locating data start point failed!\n");
      return NULL;
  }
  fseek(fp, 20+subchunk1size+4, SEEK_SET);
  fread((unsigned int*)(&subchunk2size), 4, 1, fp);
  speech = (char*)malloc(sizeof(char)*subchunk2size);
  if(!speech){
      fprintf(stderr, "Memory alloc failed!\n");
      return NULL;
  }
  fseek(fp, 20+subchunk1size+8, SEEK_SET);
  fread(speech, 1, subchunk2size, fp);

  fclose(fp);
  return speech;
}

 

嵌入式 wave文件(*.wav)格式、PCM数据格式收藏
skdkjxy的专栏
12-02 1608
1. 音频简介   经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等. 44100HZ 16bit stereo: 每秒钟有 44100 次采样, 采样数据用 16 位(2字节)记录, 双声道(立体声); 22050HZ 8bit  mono: 每秒钟有 22050 次采样, 采样数据用 8 位(1字节)记录, 单声道;
wave文件解析
py16411的博客
08-15 420
WAV文件格式解析背景RIFF格式WAVE文件 背景 工作需要转换WAV和PCM格式的音频。直接用audition软件另存为就可以把WAV文件头去掉,但强烈的好奇心驱使下还是想弄清楚都有哪些信息,手动转换格式该怎么做。 RIFF格式 资源交换档案标准(Resource Interchange File Format) (RIFF) 是一种把资料储存在被标记的区块(tagged chunks)中的档案格式(meta-format): WAVE文件 一个WAV文件通常有三个chunk以及一个可选chunk,其
WORD wFormatTag; /* format type */ //设置波形声音的格式
weixin_30915951的博客
05-24 203
0x0000MicrosoftUnknownWaveFormat0x0001MicrosoftPCMFormat0x0002MicrosoftADPCMFormat0x0003IEEEFloat0x0004CompaqComputerVSELP...
WAVE文件格式解析代码
03-30
WAVE文件格式解析代码,代码简单易读,短小精悍。
转载---WAVE文件格式剖析
rageliu的专栏
03-14 1405
 转载---WAVE文件格式剖析WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是“RIFF”。WAVE文件文件头和数据体两大部分组成。其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分。WAVE文件各部分内容及格式见附表。  常见
WAVE文件格式分析
lr__by的博客
04-16 1751
WAVE文件是计算机领域最常用的数字化声音文件格式之一,它是微软专门为Windows系统定义的波形文件格式Waveform Audio),其扩展名为"*.wav",数据本身的格式为PCM或压缩型。最基本的WAVE文件是PCM(脉冲编码调制)格式的,这种文件直接存储采样的声音数据没有经过任何的压缩,是声卡直接支持的数据格式,要让声卡正确播放其它被压缩的声音数据,就应该先把压缩的数据解压缩成
Wave(.wav)文件格式
杨建军的博客
05-09 5112
Wave文件格式主要是用来存储音频PCM数据的,其实也可以存储非PCM音频数据,这种情况我们就不考虑了。文件的扩展名为“.wav”,采用RIFF文件结构。 一、RIFF文件格式简介 1、RIFF文件是由一个一个的chunk组成的,并且chunk之间可以嵌套。使用小端存储。 2、chunk的基本结构如下: struct chunk { char chunkId[4]; // 4个字符组成的chunk标识,少于4字符右补空格 U32 chunkSize;
wave文件格式详解
热门推荐
程序的魅力
06-29 1万+
第一节 wav格式scheme介绍 wav格式,是微软开发的一种文件格式规范,整个文件分为两部分。第一部分是“总文件头”,就包括两个信息,chunkID,其值为“RIFF”,占四个字节;ChunkSize,其值是整个wav文件除去chunkID和ChunkSize,后面所有文件大小的字节数,占四个字节。 第二部分是Format,其值为“wave”,占四个字节。它包括两个子chunk,分别是“fmt ”和“data”。在fmt子chunk中定义了该文件格式的参数信息,对于音频而言,包括:采样率、通道数、位
wave文件格式解析
03-21
### Wave文件格式解析 #### 一、概述 Wave文件,简称WAV文件,是一种常见的音频文件格式,由Microsoft和IBM共同开发,旨在为数字音频文件提供标准格式WAV文件通常用于存储各种音频数据,包括音乐片段、语音记录...
wave数据格式.rar_wav_wave_wave file_wave文件_wave格式
09-22
**Wave文件格式详解** Wave(通常写作WAV文件是一种由微软和IBM共同开发的音频文件格式,全称为“Waveform Audio Format”。它是未压缩的音频文件格式,以PCM(脉冲编码调制)或其他编码方式存储声音数据,提供高...
详解WAVE文件格式
08-06
整理网上和读书时的资料,结合自己的实际经验,给出wav格式的解释和源代码,既是对 自己的总结,同时又服务大家。另外在给出几个实际例子,如果看了这篇文档还不能正确写出 wave文件,那就要吊起来打了
wave文件格式
05-04
wave文件格式描述 WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。 RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个 字节便是“RIFF”。
wave文件格式分析
qq_35473884的博客
04-13 2364
wave(waveform audio file format)文件格式是微软和IBM的音频标准文件格式,支持压缩和无压缩,但通常为无压缩格式,所以文件较大,音质较好。 它采用RIFF即chunk文件存储方式。
wave格式分析
u011279649的专栏
04-13 353
1. 怎样用VIM 16进制打开 :%!xxd :%!xxd -r 2. wav文件格式文件的前44字节放置标头(header),使播放器或编辑器能够简单掌握文件的基本信息,其内容以区块(chunk)为最小单位,每一区块长度为4字节 通过一个具体的文件对应看下 音讯格式:小端(低地址对应低位) 0100 -> 0001 (PCM) 通道数: 小端0100 -> 0001 (单通道) 采样率: 小端 803e 0000 -> 00003e80 (1600...
wave文件格式与解析
breeze505的专栏
01-26 857
常见的声音文件主要有两种,分别对应于单声道(11.025KHz 采样率、8Bit的采样值)和 双声道(44.1KHz采样率、16Bit的采样值)。 对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声 声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。 下面就是根据四个结构体写的代码,注意FACT
WAVE文件分析
zsy2415535899的博客
04-30 769
参考站点:音频编解码——格式篇(CSDN) 音频文件格式说明 维基百科—wav wav格式介绍:  一、结构 wave文件是用于多媒体文件存储的microsoft RIFF的子集,Microsoft RIFF是资源交换档案标准。RIFF文件的标准形式是文件头(file heder)、数据块(data chunk).WAVE文件是一个将RIFF文件的数据块分成了两部分,一个
写文章

热门文章

  • C++ string类型的字符串长度获取的三种方法 365953
  • 人工智能的常用十种算法 151728
  • C++vector的使用总结及常用vector操作 129020
  • C++list的使用总结及常用list操作 82350
  • C++友元函数和友元类用法详解 78982

分类专栏

  • C++入门及项目实战宝典 付费 404篇
  • C/C++开发实战365 付费 185篇
  • 数据结构和算法实战宝典 付费 106篇
  • Qt入门及实战宝典 付费 137篇
  • FFmpeg开发实战指南 付费 93篇
  • 软件架构设计指南 43篇
  • 多媒体开发实战指南 18篇
  • 图形图像处理 51篇
  • IT研发项目管理 21篇
  • Linux开发实战 43篇
  • 数据库应用开发 35篇
  • 大数据技术分享 31篇
  • 人工智能技术分享 2篇

最新评论

  • 基于RK3399的MPP库实现的视频编码

    情定伯纳乌: 请问一下,我用mpp编码出来的h264文件不到一分钟有200M左右是啥原因?

  • 十大经典算法总结

    从若: 原文地址不太行

  • Visual Studio 2019安装使用教程-详细

    ByeCsdnAndToGitHub: 分享一个之前用的VS2019 链接: https://pan.baidu.com/s/1F0ezwx8CJmC_7Cqe07Vrsg?pwd=6s72 提取码: 6s72

  • Visual Studio 2017安装使用教程-详细

    去往火星: 你好。博主,我的vs2017企业版无法下载,能分享下吗?857202539@qq.com

  • Visual Studio 2019安装使用教程-详细

    qq_48489154: 只有C++ Redistributable是可允许下载的

大家在看

  • Kafka 解决消息丢失、乱序与重复消费
  • 如何在verilog设计的磁盘阵列控制器中实现不同RAID级别(如RAID 0、RAID 1等)的切换?
  • IoT平台软件:Google Cloud IoT二次开发_JavaSDK使用指南 1181
  • Linux学习_1
  • 基于Multisim电子配料秤电路设计(含仿真和报告) 371

最新文章

  • PCDN技术详解
  • Metal图像处理总结
  • SIMD指令集技术要点
2024
09月 9篇
08月 10篇
07月 13篇
06月 10篇
05月 11篇
04月 20篇
03月 16篇
02月 10篇
01月 11篇
2023年90篇
2022年68篇
2021年103篇
2020年119篇
2019年122篇
2018年162篇
2017年162篇
2016年203篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家郑州市玻璃钢雕塑鹿济宁坚实玻璃钢座椅雕塑河南户外玻璃钢雕塑哪家便宜上虞玻璃钢雕塑西藏仿铜西式玻璃钢雕塑商场活动美陈的点子武汉古铜玻璃钢雕塑玻璃钢牛雕塑价格多少海南玻璃钢雕塑哪里有玻璃钢人物雕塑生成厂家人物玻璃钢动物雕塑报价表福建农耕系列玻璃钢雕塑定制玻璃钢雕塑仿金属刷什么油漆佛山玻璃钢几何人物雕塑沈阳多彩玻璃钢雕塑定制湖北玻璃钢金属雕塑图片现代风商场美陈右安门商场美陈双阳区玻璃钢雕塑工程价格潘多拉商场美陈驻马店玻璃钢雕塑定做厂家水果玻璃钢雕塑图片江苏玻璃钢小羊动物雕塑制作工厂济宁玻璃钢小熊雕塑抚州特色玻璃钢雕塑定制玻璃钢瓜果雕塑哪家强景观玻璃钢花盆组合甘肃仿铜玻璃钢雕塑圣诞玻璃钢雕塑施工方案深圳超市商场美陈销售企业香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化