音频-WAV数据格式
(转:https://www.jianshu.com/p/947528f3dff8)
(转多媒体文件格式(五):PCM / WAV 格式 - 灰色飘零 - 博客园)
(读取wave文件配置信息 - stdtrekman - 博客园)
1.概述
Waveform Audio File Format
(WAVE
,又或者是因为WAV
后缀而被大众所知的),它采用RIFF
(Resource Interchange File Format)文件格式结构。通常用来保存PCM
格式的原始音频数据,所以通常被称为无损音频。但是严格意义上来讲,WAV
也可以存储其它压缩格式的音频数据。
2.格式解析
WAV
文件遵循RIFF规则,其内容以区块(chunk
)为最小单位进行存储。WAV
文件一般由3个区块组成:RIFF chunk
、Format chunk
和Data chunk
。另外,文件中还可能包含一些可选的区块,如:Fact chunk
、Cue points chunk
、Playlist chunk
、Associated data list chunk
等。
本文将只介绍RIFF chunk
、Format chunk
和Data chunk
。
(1--若Format Chunk的size大小为18,则该模块的最后两个字节为附加信息)
(WAVE文件一般有四种块,它们依次是:RIFF块、格式块、附加块(可选),数据块)
2.1 RIFF区块
名称 | 偏移地址 | 字节数 | 端序 | 内容 |
ID | 0x00 | 4Byte | 大端 | 'RIFF' (0x52494646) |
Size | 0x04 | 4Byte | 小端 | fileSize - 8 |
Type | 0x08 | 4Byte | 大端 | 'WAVE'(0x57415645) |
****
- 以
'RIFF'
为标识 Size
是整个文件的长度减去ID
和Size
的长度Type
是WAVE
表示后面需要两个子块:Format
区块和Data
区块
***
2.2 FORMAT区块
名称 | 偏移地址 | 字节数 | 端序 | 内容 |
ID | 0x00 | 4Byte | 大端 | 'fmt ' (0x666D7420) |
Size | 0x04 | 4Byte | 小端 | 16 |
AudioFormat | 0x08 | 2Byte | 小端 | 音频格式 |
NumChannels |
0x0A |
2Byte | 小端 | 声道数 |
SampleRate | 0x0C | 4Byte | 小端 | 采样率 |
ByteRate | 0x10 | 4Byte | 小端 | 每秒数据字节数 |
BlockAlign | 0x14 | 2Byte | 小端 | 数据块对齐 |
BitsPerSample | 0x16 | 2Byte | 小端 | 采样位数 |
****
- 以
'fmt '
为标识 Size
表示该区块数据的长度(不包含ID
和Size
的长度)AudioFormat
表示Data
区块存储的音频数据的格式,PCM
音频数据的值为1- (展开讨论:)
NumChannels
表示音频数据的声道数,1:单声道,2:双声道SampleRate
表示音频数据的采样率ByteRate
每秒数据字节数 = SampleRate * NumChannels * BitsPerSample / 8BlockAlign
每个采样所需的字节数 = NumChannels * BitsPerSample / 8BitsPerSample
每个采样存储的bit数,8:8bit,16:16bit,32:32bit
***
2.3 DATA区块
名称 | 偏移地址 | 字节数 | 端序 | 内容 |
ID | 0x00 | 4Byte | 大端 | 'data' (0x64617461) |
Size | 0x04 | 4Byte | 小端 | N |
Data | 0x08 | N_Byte | 小端 | 音频数据 |
- 以
'data'
为标识 Size
表示音频数据的长度,N = ByteRate * secondsData
音频数据- (ByteRate ===每秒数据字节数 )
********************
所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
********************
PCM数据在WAV
文件中的bit位排列方式
PCM数据类型 | 采样 | 采样 |
8Bit 单声道 | 声道0 | 声道0 |
8Bit 双声道 | 声道0 | 声道1 |
16Bit 单声道 | 声道0低位,声道0高位 | 声道0低位,声道0高位 |
16Bit 双声道 | 声道0低位,声道0高位 | 声道1低位,声道1高位 |
(上表似乎有问题,不确定,看下图,应该更准确)
如果是单声道的文件,采样数据按时间的先后顺序依次存入。如果是单声道的音频文件,采样数据按时间的先后顺序依次存入(也可能采用 LRLRLR 方式存储,只是另一个声道的数据为 0)。
如果是双声道的话通常按照 LRLRLR 的方式存储,存储的时候还和机器的大小端有关。(关于字节序大小端的相关内容可参考《字节序问题之大小端模式讲解》进行了解)
PCM的存储方式为小端模式,存储Data数据排列如下图所示:
描述 PCM 音频数据的参数的时候有如下描述方式:
44100HZ 16bit stereo: 每秒钟有 44100 次采样, 采样数据用 16 位(2 字节)记录, 双声道(立体声)
22050HZ 8bit mono: 每秒钟有 22050 次采样, 采样数据用 8 位(1 字节)记录, 单声道
48000HZ 32bit 51ch: 每秒钟有 48000 次采样, 采样数据用 32 位(4 字节浮点型)记录, 5.1 声道
44100Hz 指的是采样率,它的意思是每秒取样 44100 次。采样率越大,存储数字音频所占的空间就越大。
16bit 指的是采样精度,意思是原始模拟信号被采样后,每一个采样点在计算机中用 16 位(两个字节)来表示。采样精度越高越能精细地表示模拟信号的差异。
Stereo 指的是声道数,也即采样时用到的麦克风的数量,麦克风越多就越能还原真实的采样环境(当然麦克风的放置位置也是有规定的)
***********************************************
WAV 是 Microsoft 和 IBM 为 PC 开发的一种声音文件格式,它符合 RIFF(Resource Interchange File Format)文件规范,用于保存 Windows 平台的音频信息资源,被 Windows 平台及其应用程序所广泛支持。WAVE 文件通常只是一个具有单个 “WAVE” 块的 RIFF 文件,该块由两个子块(”fmt” 子数据块和 ”data” 子数据块),它的格式如下图所示:
****
WAV 格式定义
该格式的实质就是在 PCM 文件的前面加了一个文件头,每个字段的的含义如下:
-
typedef struct
-
{
-
char ChunkID[4]; //内容为"RIFF"
-
unsigned long ChunkSize; //存储文件的字节数(不包含ChunkID和ChunkSize这8个字节)
-
char Format[4]; //内容为"WAVE“
-
} WAVE_HEADER;
-
typedef struct
-
{
-
char Subchunk1ID[4]; //内容为"fmt"
-
unsigned long Subchunk1Size; //存储该子块的字节数(不含前面的Subchunk1ID和Subchunk1Size这8个字节)
-
unsigned short AudioFormat; //存储音频文件的编码格式,例如若为PCM则其存储值为1。
-
unsigned short NumChannels; //声道数,单声道(Mono)值为1,双声道(Stereo)值为2,等等
-
unsigned long SampleRate; //采样率,如8k,44.1k等
-
unsigned long ByteRate; //每秒存储的bit数,其值 = SampleRate * NumChannels * BitsPerSample / 8
-
unsigned short BlockAlign; //块对齐大小,其值 = NumChannels * BitsPerSample / 8
-
unsigned short BitsPerSample; //每个采样点的bit数,一般为8,16,32等。
-
} WAVE_FMT;
-
typedef struct
-
{
-
char Subchunk2ID[4]; //内容为“data”
-
unsigned long Subchunk2Size; //接下来的正式的数据部分的字节数,其值 = NumSamples *
-
NumChannels * BitsPerSample / 8
-
} WAVE_DATA;
*******************
WAV 文件头解析
这里是一个 WAVE 文件的开头 72 字节,字节显示为十六进制数字:
-
52 49 46 46 | 24 08 00 00 | 57 41 56 45
-
66 6d 74 20 | 10 00 00 00 | 01 00 02 00
-
22 56 00 00 | 88 58 01 00 | 04 00 10 00
-
64 61 74 61 | 00 08 00 00 | 00 00 00 00
-
24 17 1E F3 | 3C 13 3C 14 | 16 F9 18 F9
-
34 E7 23 A6 | 3C F2 24 F2 | 11 CE 1A 0D
字段解析如下图:***
***********
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfkgfc
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01