**[注意:此文章为笔者加强自己所学知识所写,如有疏漏请多多包涵,当然如果能帮助到其他人就更好了]

上篇提到了wav文件格式,但是只是简单了解,目的是读取wav数据写入pcm。
本篇重点详细介绍wav格式,并且通过代码解析wav的信息。

目录

一、wav格式详细介绍

                     1.wav构成

                     2.三大区块

                        (1)RIFF 区块

                        (2)FORMAT 区块

                        (3)DATA 区块

              二、代码解析wav信息

一、wav格式详细介绍

  1. wav构成

WAV文件是一种音频格式文件,其内容以区块(chunk)为最小单位进行存储。一般构成分为:riff区块,format区块,data区块。

wave构成图以及每一区块中所占内存如下:

wav构成图

2.三大区块

(1)  RIFF 区块

我们通过winhex先任意打开一个wav文件。

RIFF区块有三部分内容:

id(4字节)

size(4字节)

type(4字节)

知道wav基本构成后,从winhex中我们可以看到

RIFF的id    (4字节) 对应ascii码:RIFF

RIFF的size(4字节) 对应大小为:1,890,036

RIFF的type(4字节) 对应ascii码:WAVE

这里一会我们会用代码实现,并且验证分析结果。

(2)  FORMAT 区块

FORMAT区块简称为fmt,其包含8部分内容:

id                      (4字节)

size                   (4字节)

audio format     (2字节)

num of channel(2字节)

sample rate      (4字节)

byte rate           (4字节)

block align        (2字节)

bits per sample (2字节)

FMT的id                     (4字节)  对应ascii码:fmt

FMT的size                  (4字节) 对应大小为:16

FMT的audio format     (2字节) 对应大小为:1

FMT的num of channel(2字节) 对应大小为:2

FMT的sample rate      (4字节) 对应大小为:22,050

FMT的byte rate           (4字节) 对应大小为:88,200

FMT的block align        (2字节) 对应大小为:4

FMT的bits per sample(2字节)  对应大小为:16

(3)  DATA 区块

DATA区块有三部分内容:

id   (4字节)

size(4字节)

data(N字节)

DATA的id     (4字节)对应ascii码:data

DATA的size (4字节)对应大小为:1,890,000

DATA的data (N字节)

二、代码解析wav信息

wav.h:

#ifndef RESOLVE_WAV_WAVE_H
#define RESOLVE_WAV_WAVE_H#include <stdint.h>
#pragma pack (2)typedef struct WAV_RIFF
{char RIFF_id[4];     uint32_t RIFF_size;  char RIFF_type[4];
} RIFF_t;typedef struct WAV_FMT
{char FMT_id[4];    uint32_t FMT_size; uint16_t FMT_auioFormat;   uint16_t FMT_numChannels;   uint32_t FMT_sampleRate;    uint32_t FMT_byteRate;      uint16_t FMT_blockAlign;    uint16_t FMT_bitsPerSample;
} FMT_t;typedef struct WAV_data
{char DATA_id[4];    uint32_t DATA_size;
} Data_t;typedef struct WAV_fotmat
{RIFF_t riff;FMT_t fmt;Data_t data;
} WAV;#pragma pack ()
#endif 

main.c:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include "wave.h"void wavInfoPrint(WAV wav)
{RIFF_t riff;FMT_t fmt;Data_t data;riff = wav.riff;fmt = wav.fmt;data = wav.data;printf("RIFF-id \t\t%c%c%c%c\n", riff.RIFF_id[0], riff.RIFF_id[1], riff.RIFF_id[2], riff.RIFF_id[3]);printf("RIFF-size \t\t%d\n", riff.RIFF_size);printf("RIFF-type \t\t%c%c%c%c\n", riff.RIFF_type[0], riff.RIFF_type[1], riff.RIFF_type[2], riff.RIFF_type[3]);printf("\n");printf("FMT-id \t\t\t%c%c%c%c\n", fmt.FMT_id[0], fmt.FMT_id[1], fmt.FMT_id[2], fmt.FMT_id[3]);printf("FMT-size \t\t%d\n", fmt.FMT_size);printf("FMT-audio RIFF_type \t%d\n", fmt.FMT_auioFormat);printf("FMT-num of channels \t%d\n", fmt.FMT_numChannels);printf("FMT-sample rate \t%d\n", fmt.FMT_sampleRate);printf("FMT-byte rate \t\t%d\n", fmt.FMT_byteRate);printf("FMT-block align \t%d\n", fmt.FMT_blockAlign);printf("FMT-bits per sample \t%d\n", fmt.FMT_bitsPerSample);printf("\n");printf("DATA-id \t\t%c%c%c%c\n", data.DATA_id[0], data.DATA_id[1], data.DATA_id[2], data.DATA_id[3]);printf("DATA-size \t\t%d\n", data.DATA_size);printf("\n");
}int main(int argc,const char **argv)
{WAV wav;FILE* fp = fopen(argv[1], "rb");if (fp == NULL) {printf("open failed\n");return 0;}fread(&wav, 1, sizeof(wav), fp);wavInfoPrint(wav);fclose(fp);
}

运行结果

可以看出,代码运行结果和我们用winhex分析一致。

C语言wav格式详解,代码实践相关推荐

  1. pcm 采样率转换_PCM编码与Waveform音频文件(.wav)格式详解

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...

  2. 痞子衡嵌入式:PCM编码与Waveform音频文件(.wav)格式详解

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...

  3. 【音频】WAV 格式详解

    WAV 文件格式解析 概述 wav 文件支持多种不同的比特率.采样率.多声道音频. WAV 文件格式是 Microsoft 的 RIFF 规范的一个子集,用于存储多媒体文件.RIFF(resource ...

  4. python语言的格式框架_django框架模板语言使用方法详解

    本文实例讲述了django框架模板语言使用方法.分享给大家供大家参考,具体如下: 模板功能 作用:生成html界面内容,模版致力于界面如何显示,而不是程序逻辑.模板不仅仅是一个html文件,还包括了页 ...

  5. C语言:JSON格式详解

    C语言:JSON格式详解 C语言:cJSON库用法详解 C语言:使用cJSON库构造JSON C语言:使用cJSON库解析JSON字符串 JSON 简介 JSON全称 JavaScript Objec ...

  6. 坐标移动c语言,C语言 坐标移动详解及实例代码

    搜索热词 题目描述 开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动.从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面. ...

  7. wav文件头格式详解

    wav文件头格式详解 首先先声明几个变量: int file_size;      //文件大小 int channel;        //声道数 int sample_rate;   //采样率 ...

  8. C#,生信软件实践(03)——DNA数据库GenBank格式详解及转为FASTA序列格式的源代码

    1 GenBank 1.1 NCBI--美国国家生物技术信息中心(美国国立生物技术信息中心) NCBI(美国国立生物技术信息中心)是在NIH的国立医学图书馆(NLM)的一个分支.它的使命包括四项任务: ...

  9. id3算法c语言实现,从ID3到C5.0的故事:算法详解及实践应用

    原标题:从ID3到C5.0的故事:算法详解及实践应用 在前面,我们分别概述性地介绍了决策树的基本知识: 1.算法概述 ID3(Iterative Dichotomiser3)算法可以说决策树算法中最著 ...

最新文章

  1. Jupyter Notebook 快捷键(基本)
  2. 【Android 界面效果49】RecyclerView高度随Item自适应
  3. 卷积神经网络CNN入门【pytorch学习】
  4. linux下模拟cc攻击命令,介绍几种用Linux命令判断CC攻击的方法
  5. 再谈变分自编码器(VAE):估计样本概率密度
  6. 肖仰华 | 知识图谱与认知智能
  7. matlab para for,matlab并行之parafor
  8. 爱的十个秘密--7.舍弃的力量
  9. react18新特性
  10. 【STM32H7的DSP教程】第14章 DSP统计函数-最大值,最小值,平均值和功率
  11. mysql 汉化成中文版
  12. echarts3 地图文字位置设置
  13. 亲属关系--并查集训练T1
  14. 总结个人关于雷达样式的见解(脉内脉间调制)
  15. 百度指数和股票的相关性
  16. gdrive无限网盘挂载systemd文件
  17. android 加载图片进度条,实现微信图片加载显示进度的效果-LoadingProgress
  18. 学计算机必学日语哪个学校,高中生学日语,大学可以学电脑类的专业吗?
  19. 如何撰写国内外研究现状
  20. 超级用户su没有权限修改所属

热门文章

  1. 平板DNS服务器未响应,ipad应用验证没反应
  2. QQ 等级全球第一的人找到了:小时候家里开网吧
  3. cass10.1+鸿业生成平纵横数据
  4. 关于HTML中的滚动条/去掉滚动条
  5. 电脑屏幕出现仅计算机,电脑开机只显示桌面?
  6. Maix Bit(K210) 裸机开发教程(三) 定时的使用
  7. python决策树运用
  8. Mybatis #和$获取参数值的区别以及@param的使用场景
  9. 基于ssm校园招聘管理系统获取(java毕业设计)
  10. 基于MATLAB的数字滤波器语音信号去噪