wav音频文件格式解析



本文转自:http://blog.csdn.net/mcgrady_tracy/article/details/52502263

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

文件格式如图所示:


一个完整的wav文件,组成格式为: wav头信息 + PCM采样数据组成,在生成wav文件的时候,wav头信息里面由于涉及到PCM数据的长度,往往写wav头信息是最后的!


解析代码如下:

  1. #include <stdio.h>  
  2. #include <stdint.h>  
  3. #include <stdlib.h>  
  4.   
  5. struct WAV_Format {  
  6.     uint32_t ChunkID;   /* "RIFF" */  
  7.     uint32_t ChunkSize; /* 36 + Subchunk2Size */  
  8.     uint32_t Format;    /* "WAVE" */  
  9.   
  10.     /* sub-chunk "fmt" */  
  11.     uint32_t Subchunk1ID;   /* "fmt " */  
  12.     uint32_t Subchunk1Size; /* 16 for PCM */  
  13.     uint16_t AudioFormat;   /* PCM = 1*/  
  14.     uint16_t NumChannels;   /* Mono = 1, Stereo = 2, etc. */  
  15.     uint32_t SampleRate;    /* 8000, 44100, etc. */  
  16.     uint32_t ByteRate;  /* = SampleRate * NumChannels * BitsPerSample/8 */  
  17.     uint16_t BlockAlign;    /* = NumChannels * BitsPerSample/8 */     
  18.     uint16_t BitsPerSample; /* 8bits, 16bits, etc. */  
  19.   
  20.     /* sub-chunk "data" */  
  21.     uint32_t Subchunk2ID;   /* "data" */  
  22.     uint32_t Subchunk2Size; /* data size */  
  23. };   
  24.   
  25. int main(void)  
  26. {  
  27.     FILE *fp = NULL;  
  28.     struct WAV_Format wav;  
  29.   
  30.     fp = fopen("test.wav""rb");  
  31.     if (!fp) {  
  32.         printf("can't open audio file\n");  
  33.         exit(1);  
  34.     }  
  35.   
  36.     fread(&wav, 1, sizeof(struct WAV_Format), fp);  
  37.   
  38.     printf("ChunkID \t%x\n", wav.ChunkID);  
  39.     printf("ChunkSize \t%d\n", wav.ChunkSize);  
  40.     printf("Format \t\t%x\n", wav.Format);  
  41.     printf("Subchunk1ID \t%x\n", wav.Subchunk1ID);  
  42.     printf("Subchunk1Size \t%d\n", wav.Subchunk1Size);  
  43.     printf("AudioFormat \t%d\n", wav.AudioFormat);  
  44.     printf("NumChannels \t%d\n", wav.NumChannels);  
  45.     printf("SampleRate \t%d\n", wav.SampleRate);  
  46.     printf("ByteRate \t%d\n", wav.ByteRate);  
  47.     printf("BlockAlign \t%d\n", wav.BlockAlign);  
  48.     printf("BitsPerSample \t%d\n", wav.BitsPerSample);  
  49.     printf("Subchunk2ID \t%x\n", wav.Subchunk2ID);  
  50.     printf("Subchunk2Size \t%d\n", wav.Subchunk2Size);  
  51.   
  52.     fclose(fp);  
  53.   
  54.     return 0;  
  55. }  
#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/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值