wave文件(*.wav)格式、PCM数据格式介绍
音频简介
经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等.
44100HZ 16bit stereo: 每秒钟有 44100 次采样, 采样数据用 16 位(2字节)记录, 双声道(立体声);
22050HZ 8bit mono: 每秒钟有 22050 次采样, 采样数据用 8 位(1字节)记录, 单声道;
当然也可以有 16bit 的单声道或 8bit 的立体声, 等等。
采样率
采样率 是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。
对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);
而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位(左声道)和低八位(右声道)分别代表两个声道。
储存空间
1 字节(也就是8bit) 只能记录 256 个数, 也就是只能将振幅划分成 256 个等级;2 字节(也就是16bit) 可以细到 65536 个数, 这已是 CD 标准了;4 字节(也就是32bit) 能把振幅细分到 4294967296 个等级, 实在是没必要了.如果是双声道(stereo), 采样就是双份的, 文件也差不多要大一倍.
这样我们就可以根据一个 wav 文件的大小、采样频率和采样大小估算出一个 wav 文件的播放长度。
譬如 “Windows XP 启动.wav” 的文件长度是 424,644 字节, 它是 “22050HZ / 16bit / 立体声” 格式(这可以从其 “属性->摘要” 里看到),
关于声音文件还有一个概念: “位速”, 也有叫做比特率、取样率, 譬如上面文件的位速是 705.6kbps 或 705600bps, 其中的 b 是 bit, ps 是每秒的意思;
压缩的音频文件常常用位速来表示, 譬如达到 CD 音质的 MP3 是: 128kbps / 44100HZ.
注意:
文章最后扫码可免费领取音视频学习资料包,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)
wave文件格式
概述
WAVE文件是计算机领域最常用的数字化声音文件格式之一,它是微软专门为Windows系统定义的波形文件格式(Waveform Audio),由于其扩展名为"*.wav"。
WAVE是录音时用的标准的WINDOWS文件格式,文件的扩展名为“WAV”,数据本身的格式为PCM或压缩型。
WAV对音频流的编码没有硬性规定,除了PCM之外,还有几乎所有支持ACM规范的编码都可以为WAV的音频流进行编码。
wave文件有很多不同的压缩格式,所以,正确而详细地了解各种WAVE文件的内部结构是成功完成压缩和解压缩的基础,也是生成特有音频压缩格式文件的前提。
注:由于WAV格式源自Windows/Intel环境,因而采用Little-Endian字节顺序进行存储。
WAVE文件是以RIFF(Resource Interchange File Format, “资源交互文件格式”)格式来组织内部结构的。
上面说到的“类型块标识”只在部分chunk中用到,如 “WAVE” chunk中,这时表示下面嵌套有别的chunk。
当使用了 “类型块标识” 时,该chunk就没有别的项(如块标志符,数据大小等),它只作为文件读取时的一个标识。先找到这个“类型块标识”,再以它为起点读取它下面嵌套的其它chunk。
每个文件最前端写入的是RIFF块,每个文件只有一个RIFF块。从 Wave文件格式详细说明 中可以看到这一点。
非PCM格式的文件会至少多加入一个 “fact” 块,它用来记录数据(注意是数据而不是文件)解压缩后的大小。这个 “fact” 块一般加在 “data” 块的前面。
WAVE文件是由若干个Chunk组成的。按照在文件中的出现位置包括:RIFF WAVE Chunk, Format Chunk, Fact Chunk(可选), Data Chunk。
-------------------------------------------| RIFF WAVE Chunk || ID = "RIFF" || RiffType = "WAVE" |-------------------------------------------| Format Chunk || ID = "fmt " |-------------------------------------------| Fact Chunk(optional) || ID = "fact" |-------------------------------------------| Data Chunk || ID = "data" |-------------------------------------------图 Wav格式包含Chunk示例
Fact Chunk=======================================| |所占字节数| 具体内容 |=======================================| ID | 4Bytes | "fact" |---------------------------------------| Size | 4Bytes | 4 |---------------------------------------| data | 4Bytes |解压后的音频数据的大小(B)|---------------------------------------图 Fact Chunk
Wave文件格式详细说明
Windows平台上WAVEFORMAT结构的认识
PCM和非PCM的主要区别是声音数据的组织不同,这些区别可以通过两者的WAVEFORMAT结构来区分。
WAVE的基本结构 WAVEFORMATEX 结构定义如下:
1 typedef struct2 {3 WORD wFormatag; //编码格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等4 WORD nChannls; //声道数,单声道为1,双声道为2;5 6 DWORD nSamplesPerSec; //采样频率;7 8 DWORD nAvgBytesperSec; //每秒的数据量;9
10 WORD nBlockAlign; //块对齐;
11
12 WORD wBitsPerSample; //WAVE文件的采样大小;
13
14 WORD cbSize; // The count in bytes of the size of extra
15 // information(after cbSize). PCM中忽略此值
16 } WAVEFORMATEX;
1 Typedef struct
2 {
3 WAVEFORMATEX wfmt;
4
5 WORD nSamplesPerBlock;
6
7 } IMAADPCMWAVEFORMAT;
IMA-ADPCM中的的wfmt->cbsize不能忽略,一般取值为2,表示此类型的WAVEFORMAT比一般的WAVEFORMAT多出2个字节。这两个字符也就是nSamplesPerBlock。
在非PCM格式的文件中,一般会在WAVEFORMAT结构后面加入一个 “fact” chunk, 结构如下:
datafactsize是这个chunk中最重要的数据,如果这是某种压缩格式的声音文件,那么从这里就可以知道他解压缩后的大小。对于解压时的计算会有很大的好处!
“data” chunk的内部组织
typedef struct{ char[4]; //“fact”字符串 DWORD chunksize; DWORD datafactsize; // 音频数据转换为PCM格式后的大小。 } factchunk;
从 “data” chunk的第9个字节开始,存储的就是声音信息的数据了,(前八个字节存储的是标志符 “data” 和后接数据大小size(DWORD)。这些数据可以是压缩的,也可以是没有压缩的。
PCM数据格式
如果是双声道的文件,采样数据按时间先后顺序交叉地存入。如图所示:
PCM的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。
首先存储低有效字节,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据格式如下所示。
样本大小 数据格式 最小值 最大值8位PCM unsigned int 0 22516位PCM int -32767 32767
wave文件(*.wav)格式、PCM数据格式介绍相关推荐
- 嵌入式 wave文件(*.wav)格式、PCM数据格式收藏
1.音频简介 经常见到这样的描述: 44100HZ16bit stereo 或者 22050HZ 8bit mono 等等. 44100HZ16bit stereo: 每秒钟有 44100 次采样, ...
- pcm 采样率转换_PCM编码与Waveform音频文件(.wav)格式详解
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...
- 痞子衡嵌入式:PCM编码与Waveform音频文件(.wav)格式详解
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...
- Wave 文件(5): 获取 Wave 文件的格式信息
装载格式信息的结构有: TWaveFormat = wFormatTag: Word;nChannels: Word;nSamplesPerSec: DWORD;nAvgBytesPerSec: DW ...
- .wav文件详解,PCM数据格式,.wav生成C语言数组
.WAV文件,PCM数据 1. 音频简介 经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等.44100HZ 16bit stereo: 每 ...
- 【音频】Wav格式文件详解
一,Windows支持两种RIFF(Resource Interchange File Format,"资源交互文件格式")格式的音频文件 MIDI的RMID文件和波形音频文件格式 ...
- 【音视频数据数据处理 10】【PCM篇】将PCM转为WAV格式音频
[音视频数据数据处理 10][PCM篇]将PCM转为WAV格式音频 一.WAV头信息 1.1 RIFF区块 1.2 FORMAT区块 1.3 DATA区块 二.PCM 转 WAV 代码实现 PCM转为 ...
- 【C语言】Wave文件处理
WAVE 文件作为多媒体中使用的声音波形文件格式之一,它是以RIFF(Resource Interchange File Format)格式为标准的. 1. 大小端对齐问题 大小端是不同的对于数据在内 ...
- 各种视频格式的详细介绍
●AVI格式:它的英文全称为Audio Video Interleaved,即音频视频交错格式.它于1992年被Microsoft公司 推出 ,随Windows3.1一起被人们所认识和熟知.所谓&qu ...
最新文章
- Eclipse中dropins干什么用的文件夹啊?
- Navicat 远程连接docker容器中的mysql 报错1251 - Client does not support authentication protocol 解决办法
- makefile 常用命令
- php取出多维数组的所有元素,php - 获取多维数组PHP中两个元素之间的所有数组 - SO中文参考 - www.soinside.com...
- 逻辑回归详解及Python实现
- sqlserver 游标写法
- 期货反跟单-镜像零滑点软件真有那么靠谱吗?
- chrome 浏览器地址栏快速搜索设置
- java面向对象孙卫琴_[转]归去来兮,回归本源 ——评孙卫琴新作《Java面向对象编程》...
- Android vitamo 实现横竖屏的切换和页面内部的网络视频
- 特殊符号♪♫♩♬♭♪♫♩♬♭
- 如何变更Win10系统电脑的锁屏壁纸?分享经验!怎样选择Win10电脑的锁屏壁纸?
- 设计模式的艺术——软件开发人员内功修炼之道 重磅来袭
- 安装北洋雷达驱动以及可能遇到的问题
- 如何写一个vscode插件
- PPa-HA/NH2/NHS/MAL焦脱镁叶绿酸-a修饰叶酸/氨基/活性酯/马来酰亚胺的反应
- 『网易实习』周记(三)
- STM32开源代码——ENC28J60程序
- 别吃泡面啦,我们来泡个4D打印的机器人出来玩
- 猫眼电影MySQL数据库怎么写_猫眼电影面试经验
热门文章
- Mendix基于腾讯云部署最佳实践
- LeetCode 557 反转字符串中的单词 III
- c语言源码什么意思,请问C语言源代码什么意思?
- win10专业版虚拟机配置服务器,windows10专业版使用虚拟机Hpyer-V的办法
- XMPP 客户端 Smack Android开发基础
- 搭建自已的turn服务器
- linux 内核调试 booting the kernel.,Uncompressing Linux....... done, booting the kernel就不动了的一个可能原因...
- Git、GitLab这辈子的错都报完了 You have not concludedUnlink of file、 Pulling is not possible、Your local changes
- 网传刘强东遭失实指控 性侵女大学生被捕是假的已保释
- oracle数据库硬恢复,oracle数据库恢复