1.WAV文件的格式

wav是微软开发的一种音频文件格式,注意,wav文件格式是无损音频文件格式,相对于其他音频格式文件数据是没有经过压缩的,通常文件也相对比较大些。

支持多种音频数字,取样频率和声道,标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几! WAV打开工具是WINDOWS的媒体播放器。
通常使用三个参数来表示声音量化位数,取样频率和采样点振幅量化位数分为8位,16位,24位三种,声道单声道和立体声之分,单声道振幅数据为n*1矩阵点,立体声为n*2矩阵点,取样频率一般有11025Hz(11kHz) ,22050Hz(22kHz)和44100Hz(44kHz) 三种,不过尽管音质出色,但在压缩后的文件体积过大!相对其他音频格式而言是一个缺点,其 文件大小的计算方式为:WAV格式文件所占容量(B) = (取样频率 X量化位数X 声道) X 时间 / 8 (字节= 8bit) 每一分钟WAV格式的音频文件的大小为10MB,其大小不随音量大小及清晰度的变化而变化

  • WAV格式大小:采样率一般是44.1K,16bit采样精度,存储成WAV格式大小 = 44.1KHz(采样率) X 16bit(采样位数) X 2(双声道) X  播放时间

  • WAV格式是没有压缩无损的,MP3格式是按1:12压缩保存的,所以MP3格式大小等于上式的1/12。WAV本质上是无压缩的原始音频文件。

  • 参考文件格式分析:WAV文件格式分析_zhihu008的博客-CSDN博客

2.wav的组成

  • WAVE文件是非常简单的一种RIFF文件,它的格式类型为"WAVE"。RIFF块包含两个子块,这两个子块的ID分别是 "fmt" 和 "data",其中 "fmt" 子块由结构PcmWaveFormat所组成,其子块的大小就是sizeof(PcmWaveFormat),数据组成就是PcmWaveFormat结构中的数据。

#ifndef RESOLVE_WAV_WAVE_H
#define RESOLVE_WAV_WAVE_H#include <cstdint>typedef struct WAV_RIFF {/* chunk "riff" */char ChunkID[4];     /* "RIFF" *//* sub-chunk-size */uint32_t ChunkSize;  /* 36 + Subchunk2Size *//* sub-chunk-data */char Format[4];      /* "WAVE" */
} RIFF_t;typedef struct WAV_FMT {/* sub-chunk "fmt" */char Subchunk1ID[4];    /* "fmt " *//* sub-chunk-size */uint32_t Subchunk1Size; /* 16 for PCM *//* sub-chunk-data */uint16_t AudioFormat;   /* PCM = 1*/uint16_t NumChannels;   /* Mono = 1, Stereo = 2, etc. */uint32_t SampleRate;    /* 8000, 44100, etc. */uint32_t ByteRate;      /* = SampleRate * NumChannels * BitsPerSample/8 */uint16_t BlockAlign;    /* = NumChannels * BitsPerSample/8 */uint16_t BitsPerSample; /* 8bits, 16bits, etc. */
} FMT_t;typedef struct WAV_data {/* sub-chunk "data" */char Subchunk2ID[4];    /* "data" *//* sub-chunk-size */uint32_t Subchunk2Size; /* data size *//* sub-chunk-data */
//    Data_block_t block;
} Data_t;//typedef struct WAV_data_block {
//} Data_block_t;typedef struct WAV_fotmat {RIFF_t riff;FMT_t fmt;Data_t data;
} Wav;#endif //RESOLVE_WAV_WAVE_H
uint8_t:  unsigned char
uint16_t:unsigned short int
uint32_t:unsigned int
uint64_t: unsigned long int
wave.cpp
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include "wave.h"
int main()
{FILE *fp = NULL;Wav wav;RIFF_t riff;FMT_t fmt;Data_t data;fp = fopen("/home/douzi/Douzi_qdreamer/resolve_wav/mbfio_mic3.wav", "rb");if (!fp) {printf("can't open audio file\n");exit(1);}fread(&wav, 1, sizeof(wav), fp);riff = wav.riff;fmt = wav.fmt;data = wav.data;/***  RIFF*/printf("ChunkID \t\t%c%c%c%c\n", riff.ChunkID[0], riff.ChunkID[1], riff.ChunkID[2], riff.ChunkID[3]);printf("ChunkSize \t\t%d\n", riff.ChunkSize);printf("Format \t\t\t%c%c%c%c\n", riff.Format[0], riff.Format[1], riff.Format[2], riff.Format[3]);printf("\n");/***  fmt*/printf("Subchunk1ID \t%c%c%c%c\n", fmt.Subchunk1ID[0], fmt.Subchunk1ID[1], fmt.Subchunk1ID[2], fmt.Subchunk1ID[3]);printf("Subchunk1Size \t%d\n", fmt.Subchunk1Size);printf("AudioFormat \t%d\n", fmt.AudioFormat);printf("NumChannels \t%d\n", fmt.NumChannels);printf("SampleRate \t\t%d\n", fmt.SampleRate);printf("ByteRate \t\t%d\n", fmt.ByteRate);printf("BlockAlign \t\t%d\n", fmt.BlockAlign);printf("BitsPerSample \t%d\n", fmt.BitsPerSample);printf("\n");/***  data*/printf("blockID \t\t%c%c%c%c\n", data.Subchunk2ID[0], data.Subchunk2ID[1], data.Subchunk2ID[2], data.Subchunk2ID[3]);printf("blockSize \t\t%d\n", data.Subchunk2Size);printf("\n");//    duration = Subchunk2Size / ByteRateprintf("duration \t\t%d\n", data.Subchunk2Size / fmt.ByteRate);}

WAV文件的声音数据保存在数据块中。块标识符为“data”块长度值为声音数据的长度

从数据块的第9个字符开始是声音波形采样数据。每个样本按采样的时间先后顺序写入。样本的字节数取决于采样位数。对于多字节样本低位字节数据 放在低地址单元,相邻的高位字节数据放在高地址单元。多声道样本数据采用交替方式存储。例如: 立体声(双声道)采样值的存储顺序为:

  • 通道1第1采样值, 通道2第1采样值;通道1第2采样值, 通道2第2采样值;以此类推。基于PCM编码的样本数据排列方式。

(1)“52 49 46 46”这个是Ascii字符“RIFF”,这部分是固定格式,表明这是一个WAVE文件头。
(2)“22 60 28 00”,这个是我这个WAV文件的数据大小,这个大小包括除了前面4个字节的所有字节,也就等于文件总字节数减去8。16进制的“22 60 28 00”对应是十进制的“2646050”。
(3)“57 41 56 45 66 6D 74 20”,也是Ascii字符“WAVEfmt”,这部分是固定格式。
以后是PCMWAVEFORMAT部分

(4)“12 00 00 00”,这是一个DWORD,对应数字18,这个对应定义中的PCMWAVEFORMAT部分的大小,可以看到后面的这个段内容正好是18个字节。一般情况下大小为16,此时最后附加信息没有,上面这个文件多了两个字节的附加信息。
(5)“01 00”,这是一个WORD,对应定义为编码格式(WAVE_FORMAT_PCM格式一般用的是这个)。
(6)“01 00”,这是一个WORD,对应数字1,表示声道数为1,是个单声道Wav。
(7)“22 56 00 00”对应数字22050,代表的是采样频率22050,采样率(每秒样本数),表示每个通道的播放速度
(8)“44 AC 00 00”对应数字44100,代表的是每秒的数据量,波形音频数据传送速率,其值为通道数×每秒样本数×每样本的数据位数/8(1*22050*16/8)。播放软件利用此值可以估计缓冲区的大小。
(9)“02 00”对应数字是2,表示块对齐的内容。数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。
(10)“10 00”数值为16,采样大小为16Bits,每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。
(11)“00 00”此处为附加信息(可选),和(4)中的size对应。

(12)“66 61 73 74” Fact是可选字段,一般当wav文件由某些软件转化而成,则包含该项,“04 00 00 00”Fact字段的大小为4字节,“F8 2F 14 00”是fact数据。

(13)“64 61 74 61”,这个是Ascii字符“data”,标示头结束,开始数据区域。
(14)“F0 5F 28 00”十六进制数是“0x285ff0”,对应十进制2646000,是数据区的开头,以后数据总数,看一下前面正好可以看到,文件大小是2646050,从(2)到(13)包括(13)正好是2646050-2646000=50字节

WAV音频文件的分析相关推荐

  1. Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件

    第21部分:永久保存Wav音频文件 原文地址:http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Begi ...

  2. 将wav音频文件转化为16k Hz 单通道的文件

    一般做语音分析16k Hz 单通道的文件就够了,这里介绍如何查看和转化wav文件的采样频率和通道数. 1. 查看wav文件的采样频率和通道数 这里用python查看 from scipy.io imp ...

  3. android 字节转wav,android开发:把一个byte数组转换成wav音频文件,并且播放

    ============问题描述============ 如题,byte数组转换成wav音频文件,并且播放,下面代码能生成data/data/com.example.playwav/cache/tem ...

  4. C语言解析WAV音频文件

    转载:http://www.cnblogs.com/LexMoon/p/wave-c.html 1.C语言解析WAV音频文件 代码地址: Github : https://github.com/Cas ...

  5. 如何用C语言编写wav读取函数,C++读取WAV音频文件的头部数据的实现方法

    C++读取WAV音频文件的头部数据的实现方法 前言: 在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正.写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有 ...

  6. c语言 文件 long double 读取,读取*.wav音频文件

    1.wav音频文件的格式 wav文件由文件头和采样数据2部分组成. 文件头又分为RIFF(Resource Interchange File Format).WAVE文件标识段 和 声音数据格式说明段 ...

  7. java 双声道音频_java实现切割wav音频文件的方法详解【附外部jar包下载】

    本文实例讲述了java实现切割wav音频文件的方法.分享给大家供大家参考,具体如下: import it.sauronsoftware.jave.Encoder; import it.sauronso ...

  8. python播放wav文件_python3 写一个WAV音频文件播放器的代码

    环境:ubuntu 16.04 python3.5 pycharm 包 : wave pyaudio sys 上代码:AudioPlayer.py # coding:utf-8 # author:ki ...

  9. 从mp4中提取wav音频文件

    需求: 从mp4文件中提取wav音频文件 运行效果: mp4: 运行后脚本后提取出的wav文件 代码: import os.pathimport moviepy.editor as mpe# 导出格式 ...

  10. Java程序获取和修改.wav音频文件的内部结构

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/79498075冷血之心的博客) wav音频文件是一种无损的音频文件, ...

最新文章

  1. kubernetes组件
  2. 函数传参字典_Python 函数参数解包
  3. jQuery学习笔记(一):入门
  4. mysql表格导入java_使用java技术将Excel表格内容导入mysql数据库
  5. ajax 跨域请求api_【.NET Core 3.0】框架之十二 || 跨域 与 Proxy
  6. easyui 如何为标签动态追加属性实现渲染效果
  7. SAP ABAP实用技巧介绍系列之 快速找出function module的帮助文档
  8. 【SpringCloud】服务注册之 Consul
  9. 梯度下降优化算法总结
  10. 不愿做「奴隶」的程序员们组建了一个王国
  11. pycharm的todo和fixme标记,标志为今后再做和bug点
  12. Python自省 type(),dir(),getattr(),hasattr(),isinstance().
  13. 解决办法:java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_eye(III)J
  14. 【转】AB实验设计思路及实验落地 ABtest不平衡
  15. 无线认证 服务器是怎么回事,无线wifi认证服务器参数设置方法是什么
  16. 多个物体模型快速制作爆炸图?试一试ThingJS
  17. “区块链+物联网”的发展现状和应用案例
  18. 开通了个人微信公众号:slbGTD,准备把GTD相关的内容写成一本书
  19. 整数拼接,拼成最小整数(暴力穷举)
  20. [论文翻译]Sparse R-CNN: End-to-End Object Detection with Learnable Proposals

热门文章

  1. 国二java好过还是office好过,计算机二级考哪一个科目比较容易过,Ms office 较为简单实用...
  2. Java中银行转账的一些问题
  3. java 8 64_java8离线安装包64位
  4. 咸阳机场地下停车场如何收费,咸阳机场停车收费价格
  5. bp神经网络预测模型原理,神经网络模型怎么预测
  6. 中国第二代支付清算体系
  7. python实现微信自动发信息软件_python实现微信每日一句自动发送给喜欢的人
  8. R语言作图入门——软件安装,数据导入
  9. 芒果DB删除指定日期内数据
  10. vue js代码混淆加密、压缩