wav文件详解

  1. WAV头分析

WAV是微软公司(Microsoft)开发的一种声音文件格式,在多媒体中使用的声波文件格式之一,它是以RIFF(Resource Interchange File Format 资源交互文件格式) 格式为标准的。每个WAV文件的头四个字节就是“RIFF”。WAV文件由文件头和数据体两大部分组成。其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分,文件头中还包含了音频流的编码参数。

如下图所示

//wav头

typedef __packed struct

{

ChunkRIFF riff;   //riff块

ChunkFMT fmt;     //fmt块

ChunkFACT fact;   //fact块 线性PCM,没有这个结构体

ChunkDATA data;   //data块

}__WaveHeader;

WAV文件头包含三部分,RIFF,fmt,fact,数据存储大小端定义按上图中的定义,规律大概是这样的,如果是字符串常量,则按阅读习惯,采用大端存储模式,如果是十六进制数据的纯数据,则按一般处理器处理规律小端模式存储。

WAV文件是非常简单的一种RIFF文件,它的格式类型为“WAVE ”。RIFF块包含两个子块,这两个子块的ID分别是“fmt ”和“data ” 。其中“fmt ”子块由结构PCMWAVEFORMAT所组成,其子块的大小就是sizeof(PCMWAVEFORMAT),数据组成就是PCMWAVEFORMAT结构中的数据。

  1. RIFF结构如下,定义,

typedef __packed struct

{

u32 ChunkID;        //chunk id;这里固定为"RIFF",即0X46464952

u32 ChunkSize ;         //集合大小;文件总大小-8

u32 Format;            //格式;WAVE,即0X45564157

}ChunkRIFF ;

  1. fmt结构

//fmt块

typedef __packed struct

{

u32 ChunkID;          //chunk id;这里固定为"fmt ",即0X20746D66

u32 ChunkSize ;       //子集合大小(不包括ID和Size);这里为:20.

u16 AudioFormat;   //音频格式;0X01,表示线性PCM;0X11表示IMA ADPCM

u16 NumOfChannels;      //通道数量;1,表示单声道;2,表示双声道;

u32 SampleRate;         //采样率;0X1F40,表示8Khz

u32 ByteRate;        //字节速率;

u16 BlockAlign;         //块对齐(字节);

u16 BitsPerSample;      //单个采样数据大小;4位ADPCM,设置为4

u16 ByteExtraData;   //附加的数据字节;2个; 线性PCM,没有这个参数

u16 sampleperblock;      //一般是一个数据块中的采样数量 如:0x01F9

}ChunkFMT;

ByteExtraData这个数据重点说一下,在原始线性PCM编码格式,不需要这个参数,只有压缩的PCM编码格式,一般都是按块存储的,需要知道一个块内的采样数量。

  1. fact结构

//fact块

typedef __packed struct

{

u32 ChunkID;        //chunk id;这里固定为"fact",即0X74636166;

u32 ChunkSize ;         //子集合大小(不包括ID和Size);这里为:4.

u32 NumOfSamples;       //采样的数量;

}ChunkFACT;

“All (compressed) non-PCM formats must have a Fact chunk (Rev. 3documentation). The chunk contains at least one value, the number of samples in the file.”

虽然标准协议要求”所有非PCM编码的WAV文件要求有fact块”,但实际分析了两个wav文件的文件头,一种PCM编码,一种IMA-ADPCM编码,这两个文件都没有fact块,但是window可以正常播放;说明fact块对这两种类型的wav文件也不是必须的。

  1. 音频数据

    1. data结构

//data块

typedef __packed struct

{

u32 ChunkID;        //chunk id;这里固定为"data",即0X5453494C

u32 ChunkSize ;      // 音频数据块大小。(除去WAV头的所有数据)

}ChunkDATA;

  1. 数据块BLOCK结构

IMA-ADPCM压缩的音频数据是以数据块存储的,存储格式如下:

//ADPCM压缩的数据块结构

typedef __packed struct

{

u16 presample;      //第一个采样值16bit

u8 index ;          //上一个数据块的最后一个 index

u8 rsv;             //保留

u8 dat[sampleperblock-1];

}DATA_BLOCK;

为了数据存储对齐,方便处理,一般一个音频BLOCK的大小是16的整数倍;如果设置BLOCK大小为256Byte,减去数据块头长度4字节,还剩252字节,4bit表示一个采样的话,可存储共252x2+1=505个采样点(加上数据头里的一个采样值)。

对于PCM编码的WAV文件,只需要按照顺序存储原始采样值即可,不需要分块。

PCM编码的WAV文件实际例子:

IMA-ADPCM编码的WAV文件实际例子:

  1. ADPCM编解码

Windows自带的一个小工具

这个小工具我试过了,转换成不是ima-adpcm格式, 而是转换成microsoft adpcm格式,这2种格式之间有什么区别 我不知道 ,但是市面上大多数是ima-adpcm格式,所以我就不研究这个microsoft adpcm格式了。

兼容性问题:

1, cooledit生成的IMA ADPCM 编译的WAV文件, foobar.exe不能播放,

2. 录音笔录制的 ADPCM WAV就可以播放,

对比发现,  cooledit生成的wav文件好像更符合标准,有fact部分,而录音笔录音的wav没有fact部分,标准规定如果是压缩的wav格式的话,要求有fact部分,但实际是有这部分播放器就不识别,放不出来,而没有这部分,大多数播放器就可以很好的播放。 或许是cooledit兼容性不好。

ADPCM 编码 及WAV解析 及实例相关推荐

  1. ADPCM编码和解码

    ADPCM音频解码,其实放在这里有些不太合适. 在编写ZN-X开发板整板测试程序的后期,振南开始转向专注于ADPCM音频的解码算法.对于音视频的编解码,振南一直是很感兴趣的. VS1003录音向外输出 ...

  2. fwPlayer 支持最新浏览器在线播放adpcm pcm 编码的wav

    ​ fwPlayer 支持最新浏览器在线播放adpcm pcm 编码的wav 可以使用 fwPlayer 使用webassembly技术,在线转码avi flv为mp4 或者ogg等来播放 fwPla ...

  3. 关于ADPCM编码和PCM编码的wave文件通过Java进行相互转换

    关于ADPCM编码和PCM编码的.wav文件通过Java进行相互转换 最近在做一个呼叫器的项目,中间碰到了点问题,就是呼叫器那边传过来的数据是ADPCM编码格式的,经过程序转换成.wav文件后可以在播 ...

  4. OpenCL编程详细解析与实例

    OpenCL编程详细解析与实例 C语言与OpenCL的编程示例比较 参考链接: https://www.zhihu.com/people/wujianming_110117/posts 先以图像旋转的 ...

  5. CVPR2020论文解析:实例分割算法

    CVPR2020论文解析:实例分割算法 BlendMask: Top-Down Meets Bottom-Up for Instance Segmentation 论文链接:https://arxiv ...

  6. Java 调用Google Map Api解析地址,解析经纬度实例

    Java 调用Google Map Api解析地址,解析经纬度实例 使用google地图的反向地址解析功能,提供一个经纬度得到对应地址,或者给出模糊地址,得到经纬度,放在java后台代码中处理,这个使 ...

  7. java 录音并包装成wav格式的文件方法-与-WAV解析-大小端-寄存器!,提取wav数据音频,一篇讲完!

    简单了解什么是WAV? 它是微软公司为Windows系统开发的一种标准的数字音频可,直接存储声音波形,并且它的波形曲线还原的真实感很好,但是也有缺点:存储磁盘空间大,多用于存储简短的声音片段. 是PC ...

  8. 注册中心 Eureka 源码解析 —— 应用实例注册发现(五)之过期

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 http://www.iocoder.cn/Eureka/instance-registry-evict/ ...

  9. 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )

    文章目录 一.创建 Capstone 反汇编解析器实例对象 二.设置 Cs 汇编解析器显示细节 一.创建 Capstone 反汇编解析器实例对象 使用 Capstone 反汇编框架 , 首先创建 Ca ...

最新文章

  1. python正则表达式语法
  2. centos7通过yum升级内核到最新版本
  3. 利用JDK动态代理机制实现简单拦截器
  4. 微软面试题 单向链表找环
  5. 日期格式化为yyyymmdd_Excel小技巧——如何将多行日期快速转换为数字文本
  6. qt中QList使用removeAt()删除元素
  7. sublime设置自己的快捷键
  8. 埃及分数(codevs 1288)
  9. [linux驱动]linux块设备学习笔记(二)
  10. 从零开始使用Nadam进行梯度下降优化
  11. android 优秀控件以及开源项目
  12. maven+Tomcat热部署
  13. wpf DoEvents 用法原理存在的坑推荐方法
  14. 2018湘潭大学程序设计竞赛【E】
  15. 计算机硕士论文难写吗,写不出论文该放弃吗_硕士研究生论文速成法_硕士研究生论文 计算机...
  16. 第九十九章 SQL函数 NOW
  17. Pandas学习-练习题
  18. mysql数据库出现2003-Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法
  19. SXSSFWorkbook操作Excel表格
  20. 51单片机——外部中断

热门文章

  1. 三千年读史,不外乎功名利禄。九万里悟道,终归诗酒田园。
  2. Windows7系统优化,优化达到30多项,速度大幅提升,
  3. autocad2014 第二次打开闪退_cad2014闪退怎么解决win10_win10系统打开cad2014闪退的解决步骤...
  4. 第六章第十三题(数列求和)(Sum series)
  5. Chrome每次打開都要打開123.sogou.com
  6. 英语-新视野大学英语四课后翻译(全)
  7. html自定义video播放器
  8. trickle_ice 原理
  9. 查看python包中所有方法_获取Python包中的所有类名
  10. 路由器与交换机的工作原理(转)