wav音频文件格式解析

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

文件格式如图所示:


解析代码如下:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>struct WAV_Format {uint32_t ChunkID;	/* "RIFF" */uint32_t ChunkSize;	/* 36 + Subchunk2Size */uint32_t Format;	/* "WAVE" *//* sub-chunk "fmt" */uint32_t Subchunk1ID;	/* "fmt " */uint32_t Subchunk1Size;	/* 16 for PCM */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. *//* sub-chunk "data" */uint32_t Subchunk2ID;	/* "data" */uint32_t Subchunk2Size;	/* data size */
}; int main(void)
{FILE *fp = NULL;struct WAV_Format wav;fp = fopen("test.wav", "rb");if (!fp) {printf("can't open audio file\n");exit(1);}fread(&wav, 1, sizeof(struct WAV_Format), fp);printf("ChunkID \t%x\n", wav.ChunkID);printf("ChunkSize \t%d\n", wav.ChunkSize);printf("Format \t\t%x\n", wav.Format);printf("Subchunk1ID \t%x\n", wav.Subchunk1ID);printf("Subchunk1Size \t%d\n", wav.Subchunk1Size);printf("AudioFormat \t%d\n", wav.AudioFormat);printf("NumChannels \t%d\n", wav.NumChannels);printf("SampleRate \t%d\n", wav.SampleRate);printf("ByteRate \t%d\n", wav.ByteRate);printf("BlockAlign \t%d\n", wav.BlockAlign);printf("BitsPerSample \t%d\n", wav.BitsPerSample);printf("Subchunk2ID \t%x\n", wav.Subchunk2ID);printf("Subchunk2Size \t%d\n", wav.Subchunk2Size);fclose(fp);return 0;
}

// 2016-09-22 add
ByteRate计算方法是SampleRate * NumChannels * BitsPerSample/8,那么这个公式计算出来的是1秒钟音频数据大小,单位为Byte,以44100、16bit、2通道为例,那么计算出来值为176400,根据总音频数据大小,可以得出播放时间的计算公式为Subchunk2Size / ByteRate。


参考:http://soundfile.sapp.org/doc/WaveFormat/


http://www.ppmy.cn/news/361252.html

相关文章

WAV文件格式分析

一. RIFF概念 在Windows环境下&#xff0c;大部分的多媒体文件都依循着一种结构来存放信息&#xff0c;这种结构称为"资源互换文件格式"(Resources lnterchange File Format)&#xff0c;简称RIFF。例如声音的WAV文件、视频的AV1文件等等均是由此结构衍生出来的。RI…

音频之WAV格式编码解析

学习目标&#xff1a; 音频之WAV格式编码解析 学习内容&#xff1a; 介绍 WAV是最常见的声音文件格式之一&#xff0c;wav文件分为两个部分&#xff0c;第一个部分是wav头文件&#xff0c;第二个部分是PCM编码的音频数据部分。是微软公司专门为Windows开发的一种标准数字音频…

【计算摄影学】总目录

1.数码相机 《数码相机中的图像传感器和信号处理》和《光与赢的魔幻乐园有趣的透镜》 1.1 数码相机概览 1.2 数码相机中光学系统 2.图像传感器 《数码相机中的图像传感器和信号处理》和《智能cmos图像传感器与应用》 2.1 图像传感器基础知识 2.2 CCD图像传感器 2.3 CMOS图像…

Java中的动态链接VS操作系统动态链接

在操作系统OS中为了优化内存的使用会采用一种动态链接方式&#xff0c;一个文件想要在操作系统中运行必须经过编译、汇编译、链接、装载等步骤。可以参考Java程序是怎么跑起来的。本篇主要讲解Java栈帧中动态链接部分与操作系统的的动态链接的区别与联系 操纵系统为什么需要动态…

防雷抗浪涌插排插座推荐,同为科技(TOWE)防雷桌面PDU安全可靠

同为科技TOWE双排防雷抗浪涌桌面PDU插座 随着夏天天气越来越热&#xff0c;强对流天气增多&#xff0c;雷雨天气频发。在雷电季节&#xff0c;通常影响家用电器安全的主要原因是由于雷电感应的侵入&#xff0c;特别是对绝缘强度低、过电压耐受力差的微电子产品影响甚大。而所谓…

遍历JSON将字符放入数组中

处理JSON&#xff1a;function traverseJSON(obj, arr) {for (var key in obj) {if (typeof obj[key] string) {arr.push(obj[key]);} else if (typeof obj[key] object) {traverseJSON(obj[key], arr);}} }traverseJSON({}, [])遍历数组查找下标&#xff1a; function compa…

大数据技术Flink详解

一、有状态的流式处理 Apache Flink 是一个分布式流处理器,具有直观和富有表现力的API,可实现有状态的流处理应用程序。它以容错的方式有效地大规模运行这些应用程序。Flink 于2014 年4 月加入Apache 软件基金会作为孵化项目,并于2015 年1 月成为顶级项目。从一开始,Flink …

Google 程序员都是怎么研究 AI 的?

作者 | 赵敏 责编 | 郭芮 9 月 20 日-10 月 7 日&#xff0c;谷歌AI体验展在上海龙美术馆&#xff08;西岸馆&#xff09;展出。谷歌总共展出了 17 个互动项目&#xff0c;和九月底人工智能大会上谷歌介绍的项目有一些重叠&#xff0c;也有一些区别。这次体验展没有背后的技术原…