wave格式分析,wave音频文件格式分析配程序

wav文件格式分析详解
程序如上一篇博文

一、综述
    WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。
RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个
字节便是“RIFF”。
    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'                      |
------------------------------------------------
            图1   Wav格式包含Chunk示例

    其中除了Fact Chunk外,其他三个Chunk是必须的。每个Chunk有各自的ID,位
于Chunk最开始位置,作为标示,而且均为4个字节。并且紧跟在ID后面的是Chunk大
小(去除ID和Size所占的字节数后剩下的其他字节数目),4个字节表示,低字节
表示数值低位,高字节表示数值高位。下面具体介绍各个Chunk内容。
PS:
    所有数值表示均为低字节表示低位,高字节表示高位。

二、具体介绍
RIFF WAVE Chunk
    ==================================
    |       |所占字节数| 具体内容   |
    ==================================
    | ID    | 4 Bytes |   'RIFF'    |
    ----------------------------------
    | Size | 4 Bytes |             |
    ----------------------------------
    | Type | 4 Bytes |   'WAVE'    |
    ----------------------------------
            图2 RIFF WAVE Chunk

    以'FIFF'作为标示,然后紧跟着为size字段,该size是整个wav文件大小减去ID
和Size所占用的字节数,即FileLen - 8 = Size。然后是Type字段,为'WAVE',表
示是wav文件。
    结构定义如下:
struct RIFF_HEADER
{
char szRiffID[4]; // 'R','I','F','F'
DWORD dwRiffSize;
char szRiffFormat[4]; // 'W','A','V','E'
};

 

Format Chunk
    ====================================================================
    |               |   字节数 |              具体内容                |
    ====================================================================
    | ID            | 4 Bytes |   'fmt '                             |
    --------------------------------------------------------------------
    | Size          | 4 Bytes | 数值为16或18,18则最后又附加信息     |
    -------------------------------------------------------------------- ----
    | FormatTag     | 2 Bytes | 编码方式,一般为0x0001               |     |
    --------------------------------------------------------------------     |
    | Channels      | 2 Bytes | 声道数目,1--单声道;2--双声道       |     |
    --------------------------------------------------------------------     |
    | SamplesPerSec | 4 Bytes | 采样频率                             |     |
    --------------------------------------------------------------------     |
    | AvgBytesPerSec| 4 Bytes | 每秒所需字节数                       |     |===> WAVE_FORMAT
    --------------------------------------------------------------------     |
    | BlockAlign    | 2 Bytes | 数据块对齐单位(每个采样需要的字节数) |     |
    --------------------------------------------------------------------     |
    | BitsPerSample | 2 Bytes | 每个采样需要的bit数                  |     |
    --------------------------------------------------------------------     |
    |               | 2 Bytes | 附加信息(可选,通过Size来判断有无) |     |
    -------------------------------------------------------------------- ----
                            图3 Format Chunk

    以'fmt '作为标示。一般情况下Size为16,此时最后附加信息没有;如果为18
则最后多了2个字节的附加信息。主要由一些软件制成的wav格式中含有该2个字节的
附加信息。
    结构定义如下:
struct WAVE_FORMAT
{
WORD wFormatTag;
WORD wChannels;
DWORD dwSamplesPerSec;
DWORD dwAvgBytesPerSec;
WORD wBlockAlign;
WORD wBitsPerSample;
};
struct FMT_BLOCK
{
char szFmtID[4]; // 'f','m','t',' '
DWORD dwFmtSize;
WAVE_FORMAT wavFormat;
};

补充头文件样例说明:

首先是一串“52 49 46 46”这个是Ascii字符“RIFF”,这部分是固定格式,表明这是一个WAVE文件头。
然后是“E4 3C 00 00”,这个是我这个WAV文件的数据大小,记住这个大小是包括头文件的一部分的,包括除了前面8个字节的所有字节,也就等于文件总字节数减去8。这是一个DWORD,我这个文件对应是15588。
然后是“57 41 56 45 66 6D 74 20”,也是Ascii字符“WAVEfmt”,这部分是固定格式。
然后是PCMWAVEFORMAT部分,可以对照一下上面的struct定义,首先就是一个WAVEFORMAT的struct。
随后是“10 00 00 00”,这是一个DWORD,对应数字16,这个对应定义中的Sizeof(PCMWAVEFORMAT),后面我们可以看到这个段内容正好是16个字节。
随后的字节是“01 00”,这是一个WORD,对应定义为编码格式“WAVE_FORMAT_PCM”,我们一般用的是这个。
随后的是“01 00”,这是一个WORD,对应数字1,表示声道数为1,这是个单声道Wav。
随后的是“22 56 00 00”,这是一个DWORD,对应数字22050,代表的是采样频率22050。
随后的是“44 AC 00 00”,这是一个DWORD,对应数字44100,代表的是每秒的数据量。
然后是“02 00”,这是一个WORD,对应数字是2,表示块对齐的内容,含义不太清楚。
然后是“10 00”,这是一个WORD,对应WAVE文件的采样大小,数值为16,采样大小为16Bits。
然后是一串“64 61 74 61”,这个是Ascii字符“data”,标示头结束,开始数据区域。
而后是数据区的开头,有一个DWORD,我这里的字符是“C0 3C 00 00”,对应的十进制数为15552,看一下前面正好可以看到,文件大小是15596,其中到“data”标志出现为止的头是40个字节,再减去这个标志的4个字节正好是15552,再往后面就是真正的Wave文件的数据体了,头文件的解析就到这里。


Fact Chunk
    ==================================
    |       |所占字节数| 具体内容   |
    ==================================
    | ID    | 4 Bytes |   'fact'    |
    ----------------------------------
    | Size | 4 Bytes |   数值为4   |
    ----------------------------------
    | data | 4 Bytes |             |
    ----------------------------------
            图4 Fact Chunk

    Fact Chunk是可选字段,一般当wav文件由某些软件转化而成,则包含该Chunk。
    结构定义如下:
struct FACT_BLOCK
{
char szFactID[4]; // 'f','a','c','t'
DWORD dwFactSize;
};

 

Data Chunk
    ==================================
    |       |所占字节数| 具体内容   |
    ==================================
    | ID    | 4 Bytes |   'data'    |
    ----------------------------------
    | Size | 4 Bytes |             |
    ----------------------------------
    | data |          |             |
    ----------------------------------
             图5 Data Chunk

    Data Chunk是真正保存wav数据的地方,以'data'作为该Chunk的标示。然后是
数据的大小。紧接着就是wav数据。根据Format Chunk中的声道数以及采样bit数,
wav数据的bit位置可以分成以下几种形式:
    ---------------------------------------------------------------------
    |   单声道    |    取样1    |    取样2    |    取样3    |    取样4    |
    |                   | --------------------------------------------------------
    | 8bit量化 |    声道0    |    声道0    |    声道0    |    声道0    |
    ---------------------------------------------------------------------
    |   双声道    |          取样1                      |           取样2                      |
    |                   |--------------------------------------------------------
    | 8bit量化 | 声道0(左) | 声道1(右) | 声道0(左) | 声道1(右) |
    ---------------------------------------------------------------------
    |                    |          取样1                        |           取样2                       |
    |   单声道     |--------------------------------------------------------
    | 16bit量化 |    声道0       | 声道0          |    声道0       | 声道0          |
    |                    | (低位字节) | (高位字节) | (低位字节) | (高位字节)   |
    ---------------------------------------------------------------------
    |                    |                         取样1                                                       |
    |   双声道     |--------------------------------------------------------
    | 16bit量化 | 声道0(左)    | 声道0(左) | 声道1(右)   | 声道1(右)   |
    |                     | (低位字节) | (高位字节) | (低位字节) | (高位字节) |
    ---------------------------------------------------------------------
                         图6 wav数据bit位置安排方式

    Data Chunk头结构定义如下:
    struct DATA_BLOCK
{
char szDataID[4]; // 'd','a','t','a'
DWORD dwDataSize;
};


三、小结
    因此,根据上述结构定义以及格式介绍,很容易编写相应的wav格式解析代码。
这里具体的代码就不给出了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

poi设置word表格单元格宽度_java poi如何设置word的页面的大小和水平方向?

展开全部你好,试试以下代码行不行。packagecom.sample;importjava.awt.color;importjava.io.fileoutputstream;importjava.io.ioexception;importcom.lowagie.text.cell;importcom.lowagie.text.document;importcom.lowagie.text.documentexception;importcom.lowag…

时间通用方法

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;import org.apache.commons.lang3.time.DateFormatUtils;/** * 日期工具类, 继承org.apache.commons.lang.time.DateUtils类 */ public class DateUtils extends org.apache.commo…

Python-MongoDB的驱动安装、升级

安装pip,并通过此来安装pymongo–Python mongodb驱动 1、下载pip安装包,下载地址:http://pypi.python.org/packages/source/p/pip/pip-1.0.2.tar.gz#md547ec6ff3f6d962696fe08d4c8264ad49 2、解压安装: tar -zxf pip.1.0.2.tar.gz…

python5_python5

python2&python31.python2中print可加括号可不加括号,python3中print一定要加括号。2.python2中有range(),也有xrange(),python中只有range()。生成器。3.Python2中raw_input(),python3中input()。,,is赋值比较是否相等is 比较内存地址,id(内容)li1[…

单例设计模式1

单例 所谓单例设计模式,即时采取一定的方法保证在整个软件系统当中,对于某个类只能存在一个对象实例,并且该类只提供一个其对象实例的方法(静态方法) 恶汉式 优缺点说明: 优点:这种写法比较简单,就是在类装载的时候就完成实例化.避免了线程同步问题 缺点: 在类装载的时候就…

SJXXX串口扩展芯片 4串口芯片 UART串口芯片

SJXX串口扩展芯片1 概述SJ000是一款具备I2C总线/SPI总线/UART接口的四通道异步收发器件,通过模式选择使得该器件工作于以上任何一种主接口模式下。器件的四个通道UART可提供高达2Mbps的数据率,低功耗模式和睡眠电流。每个通道含有一个接收器和一个发送器…

MPLS服务合同到期了,是否该续签?

当考虑是否要更新现有MPLS服务合同以及续签多久时,你需要着眼于从价格到部署速度的方方面面。简而言之,如果你还没有获取一些与软件定义广域网有关技术的经验,即使用宽带或取代MPLS服务,那么你就没办法在未来几个月之内弃用MPLS。…

oracle rds 运维服务_从运维的角度分析使用阿里云数据库RDS的必要性–你不应该在阿里云上使用自建的MySQL/SQL Server/Oracle/PostgreSQL数据库...

开宗明义,你不应该在阿里云上使用自建的MySQL or SQL Server数据库,对了,还有Oracle or PostgreSQL数据库。云数据库 RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务。基于飞天分布式系统和全SSD盘高性能存储&…

单例设计模式2

恶汉式(静态代码块儿) 优缺点说明: 这种方式和上面的相似,只不过将类实例化的过程放在了静态代码块中,也是在类装载的时候,就执行静态代码块儿中的代码,初始化类的实例.优缺点和上面是一样的. 结论: 这种单例模式可用,可能 造成内存浪费 代码演示 package com.atguigu.pri…

FLV文件格式解析

FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站无一例外地使用了FLV格式。另外由于当前浏览器与Flash Player紧密的结合&am…

华院数据宣晓华:传统零售商转型电商需攻克大数据三关

现在电商发展起来的节奏,使得大众更相信马云所言“五年内将没有线下销售”的可信度。面对这样的转变最该紧张的似乎是传统零售商了,日前在中美创新链接——大数据专题研讨会上,华院数据创始人、董事长宣晓华谈了传统零售商在转型过程中遭遇的…

部署到gcp_GCP 网络系统Andromeda --- 概述篇

这个系列总共有三篇,分别在:肖宏辉:GCP 网络系统Andromeda --- 概述篇肖宏辉:GCP 网络系统Andromeda --- 控制面肖宏辉:GCP 网络系统Andromeda --- 数据面最近看了Google在2018年的一篇NSDI文章,介绍他们的…

单例设计模式-懒汉式(线程不安全)

懒汉式(线程不安全) 优缺点说明 起到了Lazy Loading的效果,但是只能在单线程下使用 如果在多线程下, 一个线程进入if(singleton null)判断 语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例. 所以在多线程的环境下,不可使用种方式 结论:在…

南海发展大数据产业 建设新型智慧城市

今天(9月5日)上午,佛山市南海区将迎来一大盛事——“南海大数据及工业互联网创新应用工作推进会”(以下简称“推进会”)召开,南海将与阿里巴巴、腾讯以及三大通信运营商等互联网、大数据巨头签订21个大数据建设亮点项目。同时,为吸引更多大数据产业集聚,南海将在推进会上同步发…

AMR音频编码器概述及文件格式分析

全称Adaptive Multi-Rate,自适应多速率编码,主要用于移动设备的音频,压缩比比较大,但相对其他的压缩格式质量比较差,由于多用于人声,通话,效果还是很不错的。 一、分类 1. AMR: 又称为AMR-NB&am…

查询自己OpenGL的版本信息

GLvoid PrintVersion() {const GLubyte* name glGetString(GL_VENDOR); //返回负责当前OpenGL实现厂商的名字const GLubyte* biaoshifu glGetString(GL_RENDERER); //返回一个渲染器标识符,通常是个硬件平台const GLubyte* OpenGLVersion glGetStr…

airpod蓝牙耳机音量大解决办法_关于AirPods的常见问题汇总 全面了解苹果AirPods无线耳机...

小编带来关于AirPods必知的24个问题,全面了解苹果AirPods无线耳机。苹果决定在iPhone7中抛弃3.5毫米耳机接口,这引发了许多争议和不解。苹果这样做的原因部分在于,希望人们转而使用无线耳机。因此苹果也推出了自主的无线耳机AirPods。对于无线…

单例设计模式-懒汉式(线程安全)

懒汉式(线程安全) 有缺点说明 解决了线程不安全问题 效率太低了,每个线程在想获得类的实例时候,执行getInstance()方法都要进行同步.而其实这个方法只执行了一次实例化代码就够了,后面的想获取该类实例,直接return就行了.方法进行同步效率太低 结论: 在实际开发中,不推荐使用…

剖析Docker Swarm和Mesos:是什么?如何结合?有什么优势?

本文讲的是剖析Docker Swarm和Mesos:是什么?如何结合?有什么优势?,【编者的话】本文来自Mesosphere,从生产环境的需求出发,简要介绍了Docker Swarm的诞生背景,以及其与Mesos、 Mesos…

濮阳第二届创客机器人比赛_咸阳市举行第二届机器人大赛暨第一届创客大赛

11月14日,由陕西省教育信息化管理中心指导,市教育局主办,咸阳师范学院、市少工委协办的咸阳市第二届机器人大赛暨第一届创客大赛在咸阳师范学院举办。各个学校的同学展示自己的发明创造。咸阳日报全媒体记者 马沅聪 摄据悉,来自各…