wav文件格式解析

本文详细介绍了wav文件格式,它基于RIFF结构,包含必需的fmt和data chunk,以及其他可选chunk。解析wav文件时主要关注fmt chunk的数据。文章还提供了一个示例代码,用于从wav文件中提取数据部分并输出为pcm文件。
摘要由CSDN通过智能技术生成

wav文件格式解析

概述

wav文件支持多种不同的比特率、采样率、多声道音频。
wav是一种RIFF(resource interchange file format 资源互换文件格式,以chunk为单位组织文件)格式文件。在windows上,大部分多媒体文件都是RIFF文件。
wav文件由RIFF chunk构成,fmt /data chunk是其必须的两个子chunk,除此以外还可以有fact等可选chunk,我们在做parse的时候,主要是分析fmt chunk的数据。

wav标准结构

wav文件一般结构
1.wav文件都是由chunk组成,chunk的格式如下:

size 内容 解释
4 bytes ID 如“RIFF”
4 bytes chunk size N 如标准fmt chunk为16字节
N bytes data chunk的内容

2.只有“fmt ”、“data”两个子chunk的wav文件格式:

size 内容 解释
4 bytes RIFF 文件类型格式
4 bytes filesize 其值为filesize字段后的大小,真正的文件大小为filesize + 8 bytes
4 bytes WAVE 文件格式
4 bytes "fmt " chunk id,fmt即format,这个chunk保存了音频的采样率、声道数、采样位数等关键信息
4 bytes fmt chunk size fmt chunk的大小,一般有16/18/20/22/40字节(也有超过40字节的情况,如果不知道后面部分的含义,直接跳过即可),超过16字节部分为扩展块
2 bytes AudioFormat 编码格式代码,其值见 《常见编码格式》 表
2 bytes Num channels 声道数,一般有1-8
4 bytes Sample Rate 采样率,8/11.025/12/16/22.05/24/32/44.1/48/64/88.2/96/176.4/192 kHZ
4 bytes Byte Rate 传输速率,每秒的字节数,计算公式为:采样率*channels*采样位数/8
2 bytes Block Align 块对齐,告知播放软件一次性需处理多少字节,公式为: 采样位数*声道数/8
2 bytes Bits Per Sample 采样位数,一般有8/16/24/32/64,值越大,对声音的还原度越高
4 bytes “data” data chunk id
4 bytes Data Size N 原始音频数据的大小
N bytes Data 原始音频数据,也是我们最终想获得的部分,数据保存方式见 pcm存储 表

3.fmt 扩展块

fmt chunk的大小一般为16/18/20/22/40字节,当其大小大于16字节时,多出的内容都保存在扩展块中。

size 内容 解释
2bytes cbsize 扩展块长度,为0时,fmt chunk size为18;为2时,fmt chunk size为20;为22时,fmt chunk size为40
2bytes 有效采样位数 最大值为采样字节数*8
4bytes 声道掩码 声道号与扬声器位置的映射掩码
2bytes codec 真正的编码格式代码(相对于extension 的fmt codec为0xFFFE而言)
14bytes unknown 还不知道其含义,在mediainfo中与2字节的codec一起组成subformat

示例

以下代码为解析wave格式文件的示例,其功能为将wave文件中的数据部分取出并输出为文件,同时打印相关信息。
output文件可命名为xxx.pcm。
命令行使用:xxx.exe [input] [output]

wav_type.h

/*****************************************************
File Name   :  wav_type.h
Date        :  2020/10/27
Author      :  l.hua
Descriptions:  all the declarations used by wav_to_pcm.c

Change log  :
Date               Mender           Cause
******************************************************/
#ifndef _WAV_TYPE_H_
#define _WAV_TYPE_H_

extern "C"
{
   
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <direct.h>
#include <stdint.h>
}

#define DECODE_FAIL -1
#define COPY_FAIL -2
#define READ_BUF_SIZE (1024*1024*4)                  

#define WAVE_FORMAT_UNKNOWN             0x0000
#define WAVE_FORMAT_UNKNOWN_DES         "WAVE_FORMAT_UNKNOWN" 
#define WAVE_FORMAT_PCM                 0x0001
#define WAVE_FORMAT_PCM_DES             "WAVE_FORMAT_PCM"
#define WAVE_FORMAT_ADPCM               0x0002
#define WAVE_FORMAT_ADPCM_DES           "WAVE_FORMAT_ADPCM"
#define WAVE_FORMAT_IEEE_FLOAT          0x0003
#define WAVE_FORMAT_IEEE_FLOAT_DES      "WAVE_FORMAT_IEEE_FLOAT"
#define WAVE_FORMAT_ALAW                0x0006
#define WAVE_FORMAT_ALAW_DES            "WAVE_FORMAT_ALAW"
#define WAVE_FORMAT_MULAW               0x0007
#define WAVE_FORMAT_MULAW_DES           "WAVE_FORMAT_MULAW"
#define WAVE_FORMAT_DTS_MS              0x0008
#define WAVE_FORMAT_DTS_MS_DES          "WAVE_FORMAT_DTS_MS"
#define WAVE_FORMAT_WMAS                0x000A
#define WAVE_FORMAT_WMAS_DES            "WAVE_FORMAT_WMAS"
#define WAVE_FORMAT_IMA_ADPCM           0x0011
#define WAVE_FORMAT_IMA_ADPCM_DES       "WAVE_FORMAT_IMA_ADPCM"
#define WAVE_FORMAT_TRUESPEECH          0x0022
#define WAVE_FORMAT_TRUESPEECH_DES      "WAVE_FORMAT_TRUESPEECH"
#define WAVE_FORMAT_GSM610              0x0031
#define WAVE_FORMAT_GSM610_DES          "WAVE_FORMAT_GSM610"
#define WAVE_FORMAT_MSNAUDIO            0x0032
#define WAVE_FORMAT_MSNAUDIO_DES        "WAVE_FORMAT_MSNAUDIO"
#define WAVE_FORMAT_G726                0x0045
#define WAVE_FORMAT_G726_DES            "WAVE_FORMAT_G726"
#define WAVE_FORMAT_MPEG                0x0050
#define WAVE_FORMAT_MPEG_DES            "WAVE_FORMAT_MPEG"
#define WAVE_FORMAT_MPEGLAYER3          0x0055
#define WAVE_FORMAT_MPEGLAYER3_DES      "WAVE_FORMAT_MPEGLAYER3"
#define WAVE_FORMAT_UNKNOWN2            0x0070
#define WAVE_FORMAT_UNKNOWN2_DES      "WAVE_FORMAT_UNKNOWN2"
#define WAVE_FORMAT_UNKNOWN3            0x0072
#define WAVE_FORMAT_UNKNOWN3_DES      "WAVE_FORMAT_UNKNOWN3"
#define WAVE_FORMAT_DOLBY_AC3_SPDIF     0x0092
#define WAVE_FORMAT_DOLBY_AC3_SPDIF_DES "WAVE_FORMAT_DOLBY_AC3_SPDIF"
#define WAVE_FORMAT_A52                 0x2000
#define WAVE_FORMAT_A52_DES             "WAVE_FORMAT_A52"
#define WAVE_FORMAT_DTS                 0x2001
#define WAVE_FORMAT_DTS_DES             "WAVE_FORMAT_DTS"
#define WAVE_FORMAT_WMA1                0x0160
#define WAVE_FORMAT_WMA1_DES            "WAVE_FORMAT_WMA1"
#define WAVE_FORMAT_WMA2                0x0161
#define WAVE_FORMAT_WMA2_DES            "WAVE_FORMAT_WMA2"
#define WAVE_FORMAT_WMAP                0x0162
#define WAVE_FORMAT_WMAP_DES            "WAVE_FORMAT_WMAP"
#define WAVE_FORMAT_WMAL                0x0163
#define WAVE_FORMAT_WMAL_DES            "WAVE_FORMAT_WMAL"
#define WAVE_FORMAT_DIVIO_AAC           0x4143
#define WAVE_FORMAT_DIVIO_AAC_DES       "WAVE_FORMAT_DIVIO_AAC"
#define WAVE_FORMAT_AAC                 0x00FF
#define WAVE_FORMAT_AAC_DES             "WAVE_FORMAT_AAC"
#define WAVE_FORMAT_FFMPEG_AAC          0x7060
#define WAVE_FORMAT_FFMPEG_AAC_DES      "WAVE_FORMAT_FFMPEG_AAC"
#define WAVE_FORMAT_EXTENSIBLE          0xFFFE
#define WAVE_FORMAT_EXTENSIBLE_DES      "WAVE_FORMAT_EXTENSIBLE"

/******************************
	STRUCTURE   DECLARATIONS
******************************/
typedef struct {
   
	uint16_t u16FormatTag;
	uint16_t u16Channels;
	uint32_t u32SamplesPerSec;
	uint32_t u32BytePerSec;
	uint16_t u16BlockAlign;
	uint16_t u16BitsPerSample;
}WavFmtCommTex_S;

typedef struct {
   
	WavFmtCommTex_S sFmtComm;
	uint16_t u16ExtraSize;
	uint16_t u16EffectiveBitsPerSample;
	uint32_t u32Loudspeaker;
	uint16_t u16RealCodecTag;
	uint8_t u8Occupy[24];
}WavFmtTex_S;

typedef struct {
   
	char cRiff[4];
	uint32_t lFileSize;
	char cWave[4];
	char cFmtChunk[4];
	uint32_t lChunkLen;
}WavComTex_S;

typedef struct {
   
	WavComTex_S sComm;
	WavFmtTex_S sFmt;
}WavHeaderTex_S;

/******************************
	FUNCTION   DECLARATIONS
******************************/

int WavDecode(FILE* FSrcFile, WavHeaderTex_
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
wav文件是一种常见的音频文件格式,它是由Microsoft和IBM共同定义的。下面是对wav文件格式的详解: 1. 文件头(Header):wav文件的前44个字节是文件头,包含了文件的基本信息。文件头的结构如下: - ChunkID(4字节):文件标识,通常为"RIFF"。 - ChunkSize(4字节):文件大小,即整个文件的大小减去8个字节(ChunkID和ChunkSize本身的大小)。 - Format(4字节):文件格式,通常为"WAVE"。 - Subchunk1ID(4字节):子块标识,通常为"fmt "。 - Subchunk1Size(4字节):子块大小,即除去Subchunk1ID和Subchunk1Size本身的大小。 - AudioFormat(2字节):音频格式,常见值为1表示PCM(脉冲编码调制)。 - NumChannels(2字节):声道数,常见值为1表示单声道,2表示立体声。 - SampleRate(4字节):采样率,即每秒采样的样本数。 - ByteRate(4字节):数据传输速率,即每秒传输的字节数。 - BlockAlign(2字节):数据块对齐,即每个采样的字节数。 - BitsPerSample(2字节):样本位数,即每个采样的位数。 2. 数据块(Data Chunk):文件头之后的部分是音频数据块,包含了实际的音频采样数据。数据块的结构如下: - Subchunk2ID(4字节):子块标识,通常为"data"。 - Subchunk2Size(4字节):子块大小,即音频数据的大小。 - Data(变长):音频数据,以二进制形式存储。 在wav文件中,音频数据以采样点的形式存储,每个采样点的值表示音频信号在该时间点上的幅度。采样点的位数(BitsPerSample)决定了每个采样点的精度,位数越高,精度越高,音频质量也越好。 总结起来,wav文件格式通过文件头和数据块来存储音频数据,其中文件头包含了文件的基本信息,数据块存储了实际的音频采样数据。通过解析文件头和读取数据块中的采样数据,可以对wav文件进行分析和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值