• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

音频-WAV数据格式

武飞扬头像
wenluderen
帮助1

(转:https://www.jianshu.com/p/947528f3dff8)

(转多媒体文件格式(五):PCM / WAV 格式 - 灰色飘零 - 博客园

读取wave文件配置信息 - stdtrekman - 博客园

1.概述

Waveform Audio File FormatWAVE,又或者是因为WAV后缀而被大众所知的),它采用RIFF(Resource Interchange File Format)文件格式结构。通常用来保存PCM格式的原始音频数据,所以通常被称为无损音频。但是严格意义上来讲,WAV也可以存储其它压缩格式的音频数据。

2.格式解析

WAV文件遵循RIFF规则,其内容以区块(chunk)为最小单位进行存储。WAV文件一般由3个区块组成:RIFF chunkFormat chunkData chunk。另外,文件中还可能包含一些可选的区块,如:Fact chunkCue points chunkPlaylist chunkAssociated data list chunk等。
本文将只介绍RIFF chunkFormat chunkData 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是整个文件的长度减去IDSize的长度
  • TypeWAVE表示后面需要两个子块: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表示该区块数据的长度(不包含IDSize的长度)
  • AudioFormat表示Data区块存储的音频数据的格式,PCM音频数据的值为1
  • (展开讨论:)
  • NumChannels表示音频数据的声道数,1:单声道,2:双声道
  • SampleRate表示音频数据的采样率
  • ByteRate每秒数据字节数 = SampleRate * NumChannels * BitsPerSample / 8
  • BlockAlign每个采样所需的字节数 = NumChannels * BitsPerSample / 8
  • BitsPerSample每个采样存储的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 * seconds
  • Data音频数据
  • (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 文件的前面加了一个文件头,每个字段的的含义如下:

  1.  
    typedef struct
  2.  
    {
  3.  
    char ChunkID[4]; //内容为"RIFF"
  4.  
    unsigned long ChunkSize; //存储文件的字节数(不包含ChunkID和ChunkSize这8个字节)
  5.  
    char Format[4]; //内容为"WAVE“
  6.  
    } WAVE_HEADER;
  1.  
    typedef struct
  2.  
    {
  3.  
    char Subchunk1ID[4]; //内容为"fmt"
  4.  
    unsigned long Subchunk1Size; //存储该子块的字节数(不含前面的Subchunk1ID和Subchunk1Size这8个字节)
  5.  
    unsigned short AudioFormat; //存储音频文件的编码格式,例如若为PCM则其存储值为1。
  6.  
    unsigned short NumChannels; //声道数,单声道(Mono)值为1,双声道(Stereo)值为2,等等
  7.  
    unsigned long SampleRate; //采样率,如8k,44.1k等
  8.  
    unsigned long ByteRate; //每秒存储的bit数,其值 = SampleRate * NumChannels * BitsPerSample / 8
  9.  
    unsigned short BlockAlign; //块对齐大小,其值 = NumChannels * BitsPerSample / 8
  10.  
    unsigned short BitsPerSample; //每个采样点的bit数,一般为8,16,32等。
  11.  
    } WAVE_FMT;
  1.  
    typedef struct
  2.  
    {
  3.  
    char Subchunk2ID[4]; //内容为“data”
  4.  
    unsigned long Subchunk2Size; //接下来的正式的数据部分的字节数,其值 = NumSamples *
  5.  
    NumChannels * BitsPerSample / 8
  6.  
    } WAVE_DATA;

*******************

WAV 文件头解析

这里是一个 WAVE 文件的开头 72 字节,字节显示为十六进制数字:

  1.  
    52 49 46 46 | 24 08 00 00 | 57 41 56 45
  2.  
    66 6d 74 20 | 10 00 00 00 | 01 00 02 00
  3.  
    22 56 00 00 | 88 58 01 00 | 04 00 10 00
  4.  
    64 61 74 61 | 00 08 00 00 | 00 00 00 00
  5.  
    24 17 1E F3 | 3C 13 3C 14 | 16 F9 18 F9
  6.  
    34 E7 23 A6 | 3C F2 24 F2 | 11 CE 1A 0D

 字段解析如下图:***

学新通

*********** 

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfkgfc
系列文章
更多 icon
同类精品
更多 icon
继续加载