C语言wav格式详解,代码实践
**[注意:此文章为笔者加强自己所学知识所写,如有疏漏请多多包涵,当然如果能帮助到其他人就更好了]
上篇提到了wav文件格式,但是只是简单了解,目的是读取wav数据写入pcm。
本篇重点详细介绍wav格式,并且通过代码解析wav的信息。
目录
一、wav格式详细介绍
1.wav构成
2.三大区块
(1)RIFF 区块
(2)FORMAT 区块
(3)DATA 区块
二、代码解析wav信息
一、wav格式详细介绍
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格式详解,代码实践相关推荐
- pcm 采样率转换_PCM编码与Waveform音频文件(.wav)格式详解
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...
- 痞子衡嵌入式:PCM编码与Waveform音频文件(.wav)格式详解
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...
- 【音频】WAV 格式详解
WAV 文件格式解析 概述 wav 文件支持多种不同的比特率.采样率.多声道音频. WAV 文件格式是 Microsoft 的 RIFF 规范的一个子集,用于存储多媒体文件.RIFF(resource ...
- python语言的格式框架_django框架模板语言使用方法详解
本文实例讲述了django框架模板语言使用方法.分享给大家供大家参考,具体如下: 模板功能 作用:生成html界面内容,模版致力于界面如何显示,而不是程序逻辑.模板不仅仅是一个html文件,还包括了页 ...
- C语言:JSON格式详解
C语言:JSON格式详解 C语言:cJSON库用法详解 C语言:使用cJSON库构造JSON C语言:使用cJSON库解析JSON字符串 JSON 简介 JSON全称 JavaScript Objec ...
- 坐标移动c语言,C语言 坐标移动详解及实例代码
搜索热词 题目描述 开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动.从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面. ...
- wav文件头格式详解
wav文件头格式详解 首先先声明几个变量: int file_size; //文件大小 int channel; //声道数 int sample_rate; //采样率 ...
- C#,生信软件实践(03)——DNA数据库GenBank格式详解及转为FASTA序列格式的源代码
1 GenBank 1.1 NCBI--美国国家生物技术信息中心(美国国立生物技术信息中心) NCBI(美国国立生物技术信息中心)是在NIH的国立医学图书馆(NLM)的一个分支.它的使命包括四项任务: ...
- id3算法c语言实现,从ID3到C5.0的故事:算法详解及实践应用
原标题:从ID3到C5.0的故事:算法详解及实践应用 在前面,我们分别概述性地介绍了决策树的基本知识: 1.算法概述 ID3(Iterative Dichotomiser3)算法可以说决策树算法中最著 ...
最新文章
- Jupyter Notebook 快捷键(基本)
- 【Android 界面效果49】RecyclerView高度随Item自适应
- 卷积神经网络CNN入门【pytorch学习】
- linux下模拟cc攻击命令,介绍几种用Linux命令判断CC攻击的方法
- 再谈变分自编码器(VAE):估计样本概率密度
- 肖仰华 | 知识图谱与认知智能
- matlab para for,matlab并行之parafor
- 爱的十个秘密--7.舍弃的力量
- react18新特性
- 【STM32H7的DSP教程】第14章 DSP统计函数-最大值,最小值,平均值和功率
- mysql 汉化成中文版
- echarts3 地图文字位置设置
- 亲属关系--并查集训练T1
- 总结个人关于雷达样式的见解(脉内脉间调制)
- 百度指数和股票的相关性
- gdrive无限网盘挂载systemd文件
- android 加载图片进度条,实现微信图片加载显示进度的效果-LoadingProgress
- 学计算机必学日语哪个学校,高中生学日语,大学可以学电脑类的专业吗?
- 如何撰写国内外研究现状
- 超级用户su没有权限修改所属