学习目标:

音频之WAV格式编码解析

学习内容:

  • 介绍
    WAV是最常见的声音文件格式之一,wav文件分为两个部分,第一个部分是wav头文件,第二个部分是PCM编码的音频数据部分。是微软公司专门为Windows开发的一种标准数字音频文件,该文件能记录各种单声道或立体声的声音信息,并能保证声音不失真。但WAV文件有一个致命的缺点,就是它所占用的磁盘空间太大(每分钟的音乐大约需要12兆磁盘空间)。它符合资源互换文件格式(RIFF)规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持。
  • WAV格式
名称 占用字节数 计算公式 对应16进制 解释
ChunkId 4 固定 0x 52 49 46 46 RIFF标准头部标识
ChunkSize 4 4+(8+subchunk1Size)+(8+subchunk2Size) 0x 00 64 0D 00 标识后面整个编码的大小
Format 4 固定 0x 57 41 56 45 WAVE标准头部标识
Subchunk1 ID 4 固定为 fmt或者chunk 0x 66 6D 74 20 可以为fmt或者chunk
Subchunk1 Size 4 / 0x 10 00 00 00 /
AudioFormat 2 / 0x 01 00 pcm=1(线性量化)
NumChannels 2 / 0x 02 00 声道数
SampleRate 4 / 0x 44 AC 00 00 采样率(8000,44100等)
ByteRate 4 sampleRate * NumChannels * BitsPerSample/8 0x 10 B1 02 00 /
BolckAlign 2 numChannels * BitsPerSample/8 0x 04 00 /
BitsPerSample 2 / 0x 10 00 每个采样点的对应位数
Subchunk2 ID 4 固定 0x 64 61 74 61 “data”标志位
Subchunk2 Size 4 numSamples * numChannels * BitsPerSample(音频文件的长度) / 8 0x DC 63 0D 00 pcm音频数据的长度字节数
data / / 其他数据的部分 pcm音频数据

注意:
上面表格中的除了固定的和data部分以外的,我们在使用的时候都需要转换, 举个例子,比如我们想知道采样率

0x 44 AC 00 00
转换
0x 00 00 AC 44
= 44100

为什么会出现上面我们需要转化的情况,因为编码在存储的时候就需要进行一些操作,下面用伪代码进行演示:

//这样就是会实现按字节倒叙存储
header[24] = (byte) (SampleRate & 0xff);
header[25] = (byte) ((SampleRate >> 8) & 0xff);
header[26] = (byte) ((SampleRate >> 16) & 0xff);
header[27] = (byte) ((SampleRate >> 24) & 0xff);

理解了之后,我们就可以分析一段音频数据了,大概你会在心中有以下这么一张图。
图和表格结合看


所以添加 WAV头部 Java代码如下:

  /*** 添加wav文件头*/private void writeWaveFileHeader(long totalAudioLen,long totalDataLen, long longSampleRate, int channels, long byteRate){byte[] header = new byte[44];//RIFF/WAVE headerheader[0] = 'R';header[1] = 'I';header[2] = 'F';header[3] = 'F';//header[4] = (byte) (totalDataLen & 0xff);header[5] = (byte) ((totalDataLen >> 8) & 0xff);header[6] = (byte) ((totalDataLen >> 16) & 0xff);header[7] = (byte) ((totalDataLen >> 24) & 0xff);//WAVEheader[8] = 'W';header[9] = 'A';header[10] = 'V';header[11] = 'E';// fmt 或 chunkheader[12] = 'f';header[13] = 'm';header[14] = 't';header[15] = ' ';// 4 bytes: size of 'fmt ' chunkheader[16] = 16;header[17] = 0;header[18] = 0;header[19] = 0;// format = 1header[20] = 1;header[21] = 0;header[22] = (byte) channels;header[23] = 0;//采样率header[24] = (byte) (longSampleRate & 0xff);header[25] = (byte) ((longSampleRate >> 8) & 0xff);header[26] = (byte) ((longSampleRate >> 16) & 0xff);header[27] = (byte) ((longSampleRate >> 24) & 0xff);//header[28] = (byte) (byteRate & 0xff);header[29] = (byte) ((byteRate >> 8) & 0xff);header[30] = (byte) ((byteRate >> 16) & 0xff);header[31] = (byte) ((byteRate >> 24) & 0xff);// block alignheader[32] = (byte) (2 * 16 / 8);header[33] = 0;// bits per sampleheader[34] = 16;header[35] = 0;//dataheader[36] = 'd';header[37] = 'a';header[38] = 't';header[39] = 'a';//音频文件长度header[40] = (byte) (totalAudioLen & 0xff);header[41] = (byte) ((totalAudioLen >> 8) & 0xff);header[42] = (byte) ((totalAudioLen >> 16) & 0xff);header[43] = (byte) ((totalAudioLen >> 24) & 0xff);}

另外,我们的data部分的音频数据(pcm裸流数据)摆放的时候也有规则的,规则如下图

  • pcm = 8位:总的来看是左声道先,右声道后 .....
  • pcm = 16位:左声道低8位 左声道 高8位 右声道低8位 右声道高8位 ......

以上是个人拙见,欢迎指正,补充!

音频之WAV格式编码解析相关推荐

  1. java 音频转为wav格式标准音频 | Java工具类

    目录 简述 环境依赖 maven依赖 ffmpeg依赖 工具类代码 总结 简述 该工具类主要是为了将各类音频转为wav标准格式,其中可以调节采样率.声道数等指标.主要是使用ffmpeg命令进行转换. ...

  2. pcm 采样率转换_PCM编码与Waveform音频文件(.wav)格式详解

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...

  3. 痞子衡嵌入式:PCM编码与Waveform音频文件(.wav)格式详解

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...

  4. 【音频】WAV 格式详解

    WAV 文件格式解析 概述 wav 文件支持多种不同的比特率.采样率.多声道音频. WAV 文件格式是 Microsoft 的 RIFF 规范的一个子集,用于存储多媒体文件.RIFF(resource ...

  5. 音频存储格式wav介绍与解析

    音频格式 音频格式中 规定了使用多少 bits 来对信号进行编码. 无压缩的格式 无损压缩 有损压缩 1. wav 音频格式介绍 微软 和 IBM 于 1991 年 提出的资源交换的文件格式 RIFF ...

  6. MP3格式音频转WAV格式开发

    一.简述 ALSA库仅支持播放WAV格式音频资源,需要播放MP3格式音频就需要用到另一个开源第三方库--lame. 本文档MP3转WAV音频方案使用lame库编译出来的可执行文件放到固件中,然后使用s ...

  7. 【音频】Wav格式文件详解

    一,Windows支持两种RIFF(Resource Interchange File Format,"资源交互文件格式")格式的音频文件 MIDI的RMID文件和波形音频文件格式 ...

  8. 【Android RTMP】音频数据采集编码 ( FAAC 头文件与静态库拷贝到 AS | CMakeList.txt 配置 FAAC | AudioRecord 音频采样 PCM 格式 )

    文章目录 安卓直播推流专栏博客总结 一. FAAC 头文件与静态库拷贝到 Android Studio 二. CMakeList.txt 构建脚本配置 三. Java 层 AudioRecord 音频 ...

  9. (原创)speex与wav格式音频文件的互相转换(二)

    之前写过了如何将speex与wav格式的音频互相转换,如果没有看过的请看一下连接 http://www.cnblogs.com/dongweiq/p/4515186.html 虽然自己实现了相关的压缩 ...

最新文章

  1. 首届清华智班30人名单公布:贵校第一批AI本科生,状元金牌云集,与姚班“抢人”...
  2. linux mv命令改名,linux中mv命令使用详解(移动文件或者将文件改名)
  3. 参加第六届ITAT C语言程序设计大赛复赛-----数学溃败
  4. 华为机试题1:计算字符串最后一个单词的长度,单词以空格隔开。
  5. 一些适用于前端开发的 Atom 插件
  6. 预备AI工程师升级必备:大厂常见图像分类面试题
  7. 【STM32】ST-LINK固件升级
  8. 逾期之后还能贷款吗?
  9. tf.reshape()
  10. iOS Swift 2 2 监听耳机的 插拔的事件
  11. java五大框架整理_五大Java常用框架整理!
  12. 手把手教你创建个人网站
  13. 《Learning Scheduling Algorithms for Data Processing Clusters》
  14. 优美库图片小程序 Version1.0
  15. springboot 与jsonp数据返回
  16. 职场必备:Excel2016,官方推荐使用技巧
  17. 【亿可控】第一天系统分析与设计
  18. Log日志(Linux C)
  19. 网电空间战 3-战斗空间
  20. 谷传民对战大衣哥,和合国际收购《火火的情怀》后孟文豪新曲上线

热门文章

  1. 海南企业成功研发我国第三代防伪技术
  2. 云计算厂商比较有含金的证书推荐
  3. 怎么剪辑视频,这几个技巧必须学会
  4. pandas数据处理基础——筛选指定行或者指定列的数据
  5. Postman(接口测试工具)
  6. 如何将PDF文件转换成Excel呢?
  7. python自己做电子词典_利用PyQt5制作电子词典
  8. hdu2097 Sky数
  9. excel在单元格中引用其他单元格里的内容
  10. 视频会议软件技术开发详解