概述

WAV文件格式是Microsoft的RIFF规范的一个子集,用于存储多媒体文件。WAV(RIFF)文件由若干个Chunk组成,分别为:  RIFF WAVE Chunk,Format Chunk,Fact Chunk(可选),Data Chunk。具体格式如下:

RIFF Chunk

根据RIFF的格式,可以抽象出RIFF chunk的结构体:

struct RIFF_CHUNK
{char ChunkID[4]; //'R','I','F','F'unsigned int ChunkSize;char Format[4];  //'W','A','V','E'
};

其中ChunkSize代表的是整个wav_file的大小减去ChunkID和ChunkSize的大小,即wav_file_size=ChunkSize+8。

Format Chunk

Format chunk主要是描述音频数据的格式。根据Format chunk的格式,可以抽象出Format Chunk的数据结构:
struct FORMAT_CHUNK
{char FmtID[4]; //'f','m','t'unsigned int FmtSize;unsigned short FmtTag;unsigned short FmtChannels;unsigned int SampleRate;unsigned int ByteRate;unsigned short BlockAilgn;unsigned short BitsPerSample;
};

.FmtSize:  通常取值为16或者18,16代表是该音频使用PCM编码方式。

.FmtTag:   如果上述取值为16,则此值通常为1,代表该音频的编码方式是PCM编码。
.FmtChannels:  声道数目,1代表单声道,2代表双声道,就是所谓的立体声。
.SampleRate:  采样频率。如果对此概念不是很了解,可以查看此文章: Linux音频驱动-声音采集过程
.ByteRate: 每秒所需的字节数。等于SampleRate * NumChannels * BitsPerSample/8。
.BlockAilgn: 数据块对齐单位。等于NumChannels * BitsPerSample/8。
.BitsPerSample:  采样位数。

Data Chunk

Data Chunk主要是描述raw sound数据和大小,根据Data Chunk格式,抽象出Data Chunk的数据结构:
struct DATA_CHUNK
{char DataID[4]; //'d','a','t','a'unsigned int DataSize;
};

DataSize就是整个raw data的大小。

实例分析

1.  在网上下载wav的音频文件,使用mediainfo显示该音频文件的详细信息。
root@test:~$ mediainfo ~/Download/test.wav
General
Complete name                            : /home/test/Download/test.wav
Format                                   : Wave
File size                                : 44.2 MiB
Duration                                 : 4mn 22s
Overall bit rate mode                    : Constant
Overall bit rate                         : 1 411 KbpsAudio
ID                                       : 0
Format                                   : PCM
Format settings, Endianness              : Little
Codec ID                                 : 1
Duration                                 : 4mn 22s
Bit rate mode                            : Constant
Bit rate                                 : 1 411.2 Kbps
Channel(s)                               : 2 channels
Sampling rate                            : 44.1 KHz
Bit depth                                : 16 bits
Stream size                              : 44.2 MiB (100%)

2.  使用vim使用十六进制打开该文件

      1 0000000: 5249 4646 741d c302 5741 5645 666d 7420  RIFFt...WAVEfmt                            2 0000010: 1000 0000 0100 0200 44ac 0000 10b1 0200  ........D.......3 0000020: 0400 1000 6461 7461 501d c302 0100 0000  ....dataP.......4 0000030: ffff 0000 0000 0000 0000 0100 0000 ffff  ................5 0000040: 0000 0100 0000 ffff 0000 0000 ffff 0100  ................6 0000050: 0200 ffff fdff 0100 0300 ffff ffff 0200  ................7 0000060: 0000 feff 0100 0200 ffff feff 0100 0200  ................8 0000070: ffff ffff 0100 0000 ffff 0100 0000 ffff  ................

3.   分析上述的数据

"52 49 46 46"     对应的Ascii码字符为"RIFF"。
"74 1d c3 02"     对应的就是ChunkSize,对应的十六进制是:0x2c31d74=46341492。那整个wav文件的大小就为:  46341492+8=46341500。将此值转化为MB位单位: 44.2MB,可以验证上述使用mediainfo的信息。
"57 41 56 45"     对应的Ascii码字符为"WAVE"。
"66 6d 74 20"     对应的Ascii码字符为"fmt"。
"10 00 00 00"     四字节对应的是该音频的编码方式,通常为16,代表PCM编码方式。也就是十六进制0x10。
"01 00"               对应为1,代表PCM编码方式。 
"02 00"               通道个数,通道数为2,验证上述mediainfo的信息。
"44 ac 00 00"     采用频率,转化为十六进制为:  0xac44=44100=44.1KHz
"10 b1 02 00"     每秒所需的字节数,转化为十六进制为:  0x2b110=176400。通过此值可以计算该音频的时长:  46341500/17600=4.37。0.37*60=22.2,则该音频的时长为4mn22s。
"04 00"               数据对齐单位。
"10 00"               采样位数,等于0x10=16。
"64 61 74 61"     对应的Ascill码字符为"data"。
"50 1d c3 02"     对应该音频的raw数据的大小,转化为十六进制为0x2c31d50=46341456,此值等于wav_size-44=46341500-44。

Linux音频驱动-WAV文件格式分析相关推荐

  1. linux 音频文件格式,Linux音频驱动-WAV文件格式分析

    实例分析 1.  在网上下载wav的音频文件,使用mediainfo显示该音频文件的详细信息. root@test:~$ mediainfo ~/Download/test.wav General C ...

  2. wav文件格式分析与详解

    wav文件格式分析与详解 WAV文件是在PC机平台上很常见的.最经典的多媒体音频文件,最早于1991年8月出现在Windows 3.1操作系统上,文件扩展名为WAV,是WaveFom的简写,也称为波形 ...

  3. Linux 音频驱动(四) ASoC音频驱动之Machine驱动

    目录 1. 基本介绍 2. 源码分析 2.1. Machine数据结构 struct snd_soc_dai_link 3. 声卡 3.1. 数据结构struct snd_soc_card 3.2. ...

  4. Linux 音频驱动(五) ALSA音频驱动之PCM逻辑设备

    目录 1. 前言 2. PCM逻辑设备 2.1. 创建 PCM逻辑设备: 2.2. PCM逻辑设备文件操作函数集:snd_pcm_f_ops[] 2.3. Open PCM逻辑设备 2.4. Writ ...

  5. STM32MP157驱动开发——Linux 音频驱动

    STM32MP157驱动开发--Linux 音频驱动 一.简介 1.CS42L51 简介 2.I2S总线 3.STM32MP1 SAI 总线接口 二.驱动开发 1.音频驱动 1)修改设备树 i2c 接 ...

  6. Linux音频驱动之二:Control接口的调用

    本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记 一. control接口说明 Control接口主要让用户空间的应用程序(alsa-lib)可以访问和控制音频 ...

  7. [数据压缩]WAV文件格式分析及AVI数据结构分析

    目录 WAV文件格式分析 WAV概述 WAV文件格式分析 根据实例的WAV文件结构分析 AVI数据结构 音频与视频的数据放置方式 视频帧与音频帧的字节数 参考引用 WAV文件格式分析 WAV概述 Wa ...

  8. Linux 音频驱动(二) ASoC音频驱动之Platform驱动

    目录 1. 简介 2. 源码分析 2.1. CPU DAI 2.1.1. 数据结构struct snd_soc_dai_driver 2.1.2. 注册CPU DAI:snd_soc_register ...

  9. WAV文件格式分析(附AVI文件格式分析)

    目录 一.WAV格式简介 二.WAV格式结构 1.RIFF chunk 2.Format chunk 3.Data chunk 三.AVI文件格式分析 Q1:音频和视频的数据是如何放置的?交织放置or ...

  10. 【数据压缩3】AVI文件格式分析及问题回答+WAV文件格式分析

    目录 AVI文件问题回答 1.AVI文件音频和视频的数据是如何放置的,交织放置还是连续放置? 2.AVI文件一个视频帧大约占据多少字节?一个音频数据块大约占用多少字节? WAV文件格式分析 文件概述 ...

最新文章

  1. C语言字符char和整型int的关系
  2. ASP.NET Core中的依赖注入(2):依赖注入(DI)
  3. webpack4.0让编译速度飙升
  4. Delphi的对象注销方法Destroy和free的区别
  5. 文本文件与二进制文件,C++流(待续)
  6. Win10系统下安装VC6.0教程
  7. 查理和政策配对工厂——设计一个问卷运算系统的B端到C端
  8. mariadb的explain分析及InnoDB存储引擎
  9. Ubuntu 16.04 下 Vim安装
  10. 信息学奥赛一本通(1138:将字符串中的小写字母转换成大写字母)
  11. python圆柱体_python绘制圆柱体的方法
  12. 函数adapthisteq
  13. pythondjangoddos_django带服务器
  14. jetbot 无法通过浏览器访问_linux中启动tomcat后浏览器无法访问的解决方法
  15. Rplidar A1利用Qt图形库进行周围环境的轮廓抓取
  16. tensorflow-ckpt2npy
  17. 解决RecyclerView内子条目可滑动导致的滑动冲突
  18. Mosquitto设置用户名密码
  19. android之基于百度语音合讯飞语音识别的语音交互
  20. Couldnt communicate with helper application Git提交

热门文章

  1. Spring+Quartz 整合二:调度管理与定时任务分离
  2. IFTT-意大利金融交易税
  3. 未捕获异常string was not recognized_给你代码:PHP7中的异常与错误处理
  4. 电脑锁屏按什么键解锁_锁屏键除了锁屏还能干什么?这 6 个 App 带你玩转手机实体键...
  5. 安装TensorFlow-gpu
  6. .NET(WinCE、WM)开发转Android开发 ——Xamarin和Smobiler对比...
  7. 基于etcd+confd通过nginx对docker服务混合注册发现详解
  8. 关于远程访问tomcat问题的总结
  9. oracle表空间使用率统计查询
  10. Java通过反射获取类的私有属性和方法