zoukankan      html  css  js  c++  java
  • 多媒体文件解析(一):WAV文件解析

    在之前的《多媒体文件格式》系列中,我们对主流的多媒体的文件格式进行了整理和讲述。这里开始我们开始对如何分析和解释多媒体文件来进行整理,以便于以后我们自己排查一些问题的时候有一些帮助。本篇我们就讲一下WAV文件格式。

    首先我们知道WAV格式的实质就是在 PCM 文件的前面加了一个文件头。下面是使用二进制打开的一个WAV文件,此文件只写入了WAV头信息。整个文件的大小为44b。

    下面我们就针对WAV头进行一点点的解析和整理。WAV文件遵循RIFF规则,其内容以区块最小单位进行存储。WAV文件由3个区块组成:RIFF chunk, Format chunk 和 Data chunk。另外还有可能包含其他的可选区块,如:Fact chunk、Cue points chunk等。

    一、RIFF区块

    下面我们针对此区块的三个名称的内容进行分析:

    ID:在WAV格式中,ID固定以 RIFF 为标识。换成进制数据为:0x52494646,此值为大端序,按照正常的顺序进行读取即可。

    Size:Size的大小为整个文件的长度减去ID和Size的长度. 注意此为小端序,计算大小的时候,需从右边往左读。例如本WAV的Size为36(十六进制:24),再加上Size和ID的长度,整个文件的大小44b就是这么来的.

    Type:在WAV文件中,Type的内容固定为 "WAVE",表示后面会有两个区块,Format区块和Data区块。

    二、FORMAT区块

    ID:此区块的ID以'fmt '为标识

    Size:表示该区块数据的长度(不包含ID和Size的长度)

    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

    三、DATA区块

    ID:区块的ID以'data'为标识

    Size:表示音频数据的长度,N = ByteRate * seconds

    Data:存储的是音频数据

    四、WAV音频数据存储方式

    WAV文件的PCM音频数据以小端形式来进行数据存储。

    先简单的说明一下大端存储和小端存储的区别。

    • 大端存储:数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
    • 小端存储:数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中.
    在WAV文件中PCM的bit位排列方式如下表所示:

    这里解释一下WAV文件数据存储的最小单元是采样点,也就是说,如果WAV头中配置采样点的大小是16bit,那么两个字节代表一个采样点(Int16),如果为32bit则是4个字节代表一个采样点(Int32)。然而,它们都是无符号整型,只是采样的精度不同而已。另外,要为每个声道都存储采样点。如果是单声道的话,采样点就是简单的顺序排列。如果是双声道,采样点就是左右声道交错排列。采样频率也需要与数据的保持一致,否则可能会造成音频播放速度上出现异常。

    具体的格式可以参照下图进行理解:

  • 相关阅读:
    全选、全不选、反选
    IE Tester 怎样使用firebug 调试工具?
    策略模式
    模板方法模式
    迭代器模式——android中使用
    android 实现圆形波纹动画
    android 窗口的使用
    AlertDialog 基本使用
    国外android 网站
    ViewDragHelper 任意拖动
  • 原文地址:https://www.cnblogs.com/renhui/p/13590877.html
Copyright © 2011-2022 走看看