wav文件格式解析

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张图片
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 
#include 
#include 
#include 
#include 
#include 
}

#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_S* pFormatInfo);

int AudioSaveAs1(FILE* FSrcFile, FILE* FDesFile);

int AudioSaveAs2(FILE* FSrcFile, FILE* FDesFile, int Len);

#endif// _WAV_TYPE_H_#pragma once

wav_type.c

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

Change log  :
Date               Mender           Cause

******************************************************/
#include "wav_type.h"

/**************************************************************************
  Function Name: WavDecode
  Purposes: Gets format infomation from source file.
  Descriptions: Gets format infomation from source file.
  Arguments:
	FSrcFile: [in] A file pointer to the sourcefile.
	pFormatInfo: [out] A WavAddExtraTex_S pointer to saving format infomation.
  Returns:
	success: Return data location in the source file.
	fail: return DECODE_FAIL;
  See also:
**************************************************************************/
int WavDecode(FILE* FSrcFile, WavHeaderTex_S* pFormatInfo)
{
	int iSize = sizeof(WavComTex_S);
	int iDataPos = 0;
	char acChunkId[4];
	int iChunkLen = 0;
	int iRet = 0;
	/* Move file pointer to the start of the file */
	fseek(FSrcFile, 0, SEEK_SET);

	/* Check that if FSrcFile or pFormatInfo is NULL */
	if (FSrcFile == NULL || pFormatInfo == NULL) {
		printf("DECODE FAIL.\n");
		return DECODE_FAIL;
	}

	memset(pFormatInfo, 0, sizeof(WavHeaderTex_S));
	if (fread(&pFormatInfo->sComm, 1, iSize, FSrcFile) != iSize) {
		printf("FREAD RIFF FAIL.\n");
		return DECODE_FAIL;
	}
	iDataPos += iSize;

	if (strncmp(pFormatInfo->sComm.cWave, "WAVE", 4)) {
		printf("Not support format[Didn't find 'WAVE'].\n");
		return DECODE_FAIL;
	}

	/* Find "fmt" chunk */
	strncpy(acChunkId, pFormatInfo->sComm.cFmtChunk, 4);
	iChunkLen = pFormatInfo->sComm.lChunkLen;
	while (strncmp(acChunkId, "fmt ", 4) != 0) {
		/* Skip the chunk */
		fseek(FSrcFile, iChunkLen, SEEK_CUR);
		iDataPos += iChunkLen;
		/* Try to find "fmt" */
		if (fread(acChunkId, 1, 4, FSrcFile) != 4) {
			printf("FREAD CHUNKID FAIL 1.\n");
			return DECODE_FAIL;
		}
		if (fread((uint8_t*)&iChunkLen, 1, 4, FSrcFile) != 4) {
			printf("FREAD CHUNKLEN FAIL 1.\n");
			return DECODE_FAIL;
		}
		iDataPos += 8;
	}

	/* Copy "fmt " info to pFormatInfo->sComm */
	strncpy(pFormatInfo->sComm.cFmtChunk, acChunkId, 4);
	pFormatInfo->sComm.lChunkLen = iChunkLen;
	/* Read sFmt chunk */
	iSize = pFormatInfo->sComm.lChunkLen;
	if (50 < iSize) {
		printf("Not support format[Fmt chunk is greater than 50].\n");
		return DECODE_FAIL;
	}

	if (fread(&pFormatInfo->sFmt, 1, iSize, FSrcFile) != iSize) {
		printf("FREAD FMT FAIL.\n");
		return DECODE_FAIL;
	}
	iDataPos += iSize;

	/* Try to find "data" */
	if (fread(acChunkId, 1, 4, FSrcFile) != 4) {
		printf("FREAD CHUNKID FAIL 2.\n");
		return DECODE_FAIL;
	}
	if (fread((uint8_t*)&iChunkLen, 1, 4, FSrcFile) != 4) {
		printf("FREAD CHUNKLEN FAIL 2.\n");
		return DECODE_FAIL;
	}
	iDataPos += 8;

	while (strncmp(acChunkId, "data", 4) != 0) {
		/* Skip the chunk */
		fseek(FSrcFile, iChunkLen, SEEK_CUR);
		iDataPos += iChunkLen;
		/* Try to find "data" */
		if (fread(acChunkId, 1, 4, FSrcFile) != 4) {
			printf("%d\n", iChunkLen);
			printf("%c%c%c%c\n", acChunkId[0], acChunkId[1], acChunkId[2], acChunkId[3]);
			printf("FREAD CHUNKID FAIL 3.\n");
			return DECODE_FAIL;
		}
		if (fread((uint8_t*)&iChunkLen, 1, 4, FSrcFile) != 4) {
			printf("FREAD CHUNKLEN FAIL 3.\n");
			return DECODE_FAIL;
		}
		iDataPos += 8;
	}

	return iDataPos;
}

/**************************************************************************
  Function Name: AudioSaveAs1
  Purposes: Copy from FSrcFile to the FDesfile.
  Descriptions: Copy the FSrcFile to the FDesfile.
  Arguments:
	FSrcFile: [in] A file pointer to the sourcefile.
	FDesFile: [out] A WavAddExtraTex_S pointer to saving format infomation.
  Returns:
	success: Return the real length of the copy.
	fail: return COPY_FAIL;
  See also:
**************************************************************************/
int AudioSaveAs1(FILE* FSrcFile, FILE* FDesFile)
{
	int iReadLen = 0, iWriteLen = 0;
	int iLen = 0;
	/* Buffer that copys FSrcFile to FDesFile. */
	uint8_t* pu8ReadBuf = NULL;

	pu8ReadBuf = (uint8_t*)malloc(READ_BUF_SIZE);
	if (NULL == pu8ReadBuf) {
		printf("MALLOC READBUF FAIL.\n");
		return COPY_FAIL;
	}

	while (!feof(FSrcFile)) {
		memset(pu8ReadBuf, 0, READ_BUF_SIZE);
		iReadLen = fread(pu8ReadBuf, 1, READ_BUF_SIZE, FSrcFile);
		iWriteLen = fwrite(pu8ReadBuf, 1, iReadLen, FDesFile);
		if (iWriteLen != iReadLen) {
			printf("WRITE TO FDesFile ERROR.\n");
			if (pu8ReadBuf != NULL) {
				free(pu8ReadBuf);
			}
			return COPY_FAIL;
		}
		iLen += iWriteLen;
	}
	if (pu8ReadBuf != NULL) {
		free(pu8ReadBuf);
	}

	return iLen;
}

/**************************************************************************
  Function Name: AudioSaveAs2
  Purposes: Copy the Len length from FSrcFile to the FDesfile.
  Descriptions: Copy the Len length FSrcFile to the FDesfile.
  Arguments:
	FSrcFile: [in] A file pointer to the sourcefile.
	FDesFile: [out] A WavAddExtraTex_S pointer to saving format infomation.
	Len: [in] the length will copy.
  Returns:
	success: Return the real length of the copy.
	fail: return COPY_FAIL;
  See also:
**************************************************************************/
int AudioSaveAs2(FILE* FSrcFile, FILE* FDesFile, int Len)
{
	size_t iReadLen = 0, iWriteLen = 0;
	size_t iLen = 0;
	/* Buffer that copys FSrcFile to FDesFile. */
	uint8_t* pu8ReadBuf = NULL;

	pu8ReadBuf = (uint8_t*)malloc(READ_BUF_SIZE);
	if (NULL == pu8ReadBuf) {
		printf("MALLOC READBUF FAIL.\n");
		return COPY_FAIL;
	}

	while (Len > 0) {
		memset(pu8ReadBuf, 0, READ_BUF_SIZE);

		if (Len >= READ_BUF_SIZE) {
			iReadLen = fread(pu8ReadBuf, 1, READ_BUF_SIZE, FSrcFile);
		}
		else {
			iReadLen = fread(pu8ReadBuf, 1, Len, FSrcFile);
		}
		iWriteLen = fwrite(pu8ReadBuf, 1, iReadLen, FDesFile);
		if (iWriteLen != iReadLen) {
			printf("WRITE TO FDesFile FAIL.\n");
			if (pu8ReadBuf != NULL) {
				free(pu8ReadBuf);
			}
			return COPY_FAIL;
		}
		iLen += iWriteLen;
		Len -= iWriteLen;

		/* Check that if the file reads to the end */
		if (feof(FSrcFile)) {
			printf("Read to the end.\n");
			break;
		}
	}
	if (pu8ReadBuf != NULL) {
		free(pu8ReadBuf);
	}

	return iLen;
}

wav_to_pcm.c

/*****************************************************
File Name   :  wav_to_pcm.c
Date        :  2020/10/27
Author      :  l.hua
Descriptions:  1.Search all .wav files on disk D:\Mycode\resource,
				 and save the file path to D:\Mycode\resource\filelist.txt;
			   2.Read file paths from filelist.txt one by one;
			   3.analyze the audio infomation in the files, and save to
				 D:\Mycode\resource\description.txt;
			   4.Read the sound data in the files and save it as .pcm files;

Change log  :
Date               Mender           Cause

******************************************************/
#include "wav_type.h"

/* Causes the compiler to ignore the 4996 warning. */
//#pragma warning(disable:4996)          

#define PARAM_ERROR -3
#define PRINT_ERROR -4
#define FILE_ERROR -5
int PRT(const WavHeaderTex_S* pFormatInfo);

int main(int argc, char *argv[])
{
	if (argc < 3){
		printf("too few parametwrs.Need three parameters: xxx.exe xxx.wav xxx.pcm\n");
		return PARAM_ERROR;
	}

	FILE* pFSrcFile = NULL;
	FILE* pFDesFile = NULL;
	WavHeaderTex_S* pFormatInfo = NULL;
	int iHeaderSize = sizeof(WavHeaderTex_S);
	int iDataLoc = 0;
	int i = 0;

	pFormatInfo = (WavHeaderTex_S*)malloc(iHeaderSize);
	if (pFormatInfo == NULL) {
		printf("MALLOC WavHeaderTex_S FAIL.\n");
		return -1;
	}

	memset(pFormatInfo, 0, iHeaderSize);

	/* Open .wav file with 'rb' mod */
	pFSrcFile = fopen(argv[1], "rb");
	if (NULL == pFSrcFile) {
		printf("open [%s] failed.\n", argv[1]);
		return FILE_ERROR;
	}

	/* Get wavheaderinfo */
	iDataLoc = WavDecode(pFSrcFile, pFormatInfo);
	if (iDataLoc == DECODE_FAIL) {
		if (strncmp(pFormatInfo->sComm.cWave, "WAVE", 4)) {
			printf("[%s] is not WAVE.\n", argv[1]);
		}
		fclose(pFSrcFile);
		return FILE_ERROR;
	}
	/* Printf demux info */
	if (PRT(pFormatInfo) == PRINT_ERROR) {
		fclose(pFSrcFile);
		return PRINT_ERROR;
	}

	/* Open .pcm file with 'w' mod, if there is no such file, create it frist */
	pFDesFile = fopen(argv[2], "w");
	if (NULL == pFDesFile) {
		printf("OPEN %s FAIL.\n", argv[2]);
		fclose(pFSrcFile);
		return FILE_ERROR;
	}

	/* Copy .wav to .pcm */
	fseek(pFSrcFile, iDataLoc, SEEK_SET);
	if (AudioSaveAs1(pFSrcFile, pFDesFile) == COPY_FAIL) {
		fclose(pFSrcFile);
		fclose(pFDesFile);
		return COPY_FAIL;
	}

	fclose(pFSrcFile);
	fclose(pFDesFile);
	if (pFormatInfo != NULL)
		free(pFormatInfo);

	return 0;
}

int PRT(const WavHeaderTex_S* pFormatInfo)
{
	if (pFormatInfo == NULL) {
		printf("REDIRECTPRT PARAMETER IS NULL.\n");
		return PRINT_ERROR;
	}

	switch (pFormatInfo->sFmt.sFmtComm.u16FormatTag) {
	case WAVE_FORMAT_UNKNOWN:
		printf("CODEID: %s\n", WAVE_FORMAT_UNKNOWN_DES);
		break;
	case WAVE_FORMAT_UNKNOWN2:
		printf("CODEID: %s\n", WAVE_FORMAT_UNKNOWN2_DES);
		break;
	case WAVE_FORMAT_UNKNOWN3:
		printf("CODEID: %s\n", WAVE_FORMAT_UNKNOWN3_DES);
		break;
	case WAVE_FORMAT_PCM:
		printf("CODEID: %s\n", WAVE_FORMAT_PCM_DES);
		break;
	case WAVE_FORMAT_ADPCM:
		printf("CODEID: %s\n", WAVE_FORMAT_ADPCM_DES);
		break;
	case WAVE_FORMAT_IEEE_FLOAT:
		printf("CODEID: %s\n", WAVE_FORMAT_IEEE_FLOAT_DES);
		break;
	case WAVE_FORMAT_ALAW:
		printf("CODEID: %s\n", WAVE_FORMAT_ALAW_DES);
		break;
	case WAVE_FORMAT_MULAW:
		printf("CODEID: %s\n", WAVE_FORMAT_MULAW_DES);
		break;
	case WAVE_FORMAT_DTS_MS:
		printf("CODEID: %s\n", WAVE_FORMAT_DTS_MS_DES);
		break;
	case WAVE_FORMAT_WMAS:
		printf("CODEID: %s\n", WAVE_FORMAT_WMAS_DES);
		break;
	case WAVE_FORMAT_IMA_ADPCM:
		printf("CODEID: %s\n", WAVE_FORMAT_IMA_ADPCM_DES);
		break;
	case WAVE_FORMAT_TRUESPEECH:
		printf("CODEID: %s\n", WAVE_FORMAT_TRUESPEECH_DES);
		break;
	case WAVE_FORMAT_GSM610:
		printf("CODEID: %s\n", WAVE_FORMAT_GSM610_DES);
		break;
	case WAVE_FORMAT_MSNAUDIO:
		printf("CODEID: %s\n", WAVE_FORMAT_MSNAUDIO_DES);
		break;
	case WAVE_FORMAT_DOLBY_AC3_SPDIF:
		printf("CODEID: %s\n", WAVE_FORMAT_DOLBY_AC3_SPDIF_DES);
		break;
	case WAVE_FORMAT_A52:
		printf("CODEID: %s\n", WAVE_FORMAT_A52_DES);
		break;
	case WAVE_FORMAT_DTS:
		printf("CODEID: %s\n", WAVE_FORMAT_DTS_DES);
		break;
	case WAVE_FORMAT_MPEGLAYER3:
		printf("CODEID: %s\n", WAVE_FORMAT_MPEGLAYER3_DES);
		break;
	case WAVE_FORMAT_G726:
		printf("CODEID: %s\n", WAVE_FORMAT_G726_DES);
		break;
	case WAVE_FORMAT_MPEG:
		printf("CODEID: %s\n", WAVE_FORMAT_MPEG_DES);
		break;
	case WAVE_FORMAT_EXTENSIBLE:
		switch (pFormatInfo->sFmt.u16RealCodecTag) {
		case WAVE_FORMAT_PCM:
			printf("CODEID: %s\n", WAVE_FORMAT_PCM_DES);
			break;
		case WAVE_FORMAT_ADPCM:
			printf("CODEID: %s\n", WAVE_FORMAT_ADPCM_DES);
			break;
		case WAVE_FORMAT_IEEE_FLOAT:
			printf("CODEID: %s\n", WAVE_FORMAT_IEEE_FLOAT_DES);
			break;
		case WAVE_FORMAT_ALAW:
			printf("CODEID: %s\n", WAVE_FORMAT_ALAW_DES);
			break;
		case WAVE_FORMAT_MULAW:
			printf("CODEID: %s\n", WAVE_FORMAT_MULAW_DES);
			break;
		case WAVE_FORMAT_IMA_ADPCM:
			printf("CODEID: %s\n", WAVE_FORMAT_IMA_ADPCM_DES);
			break;
		case WAVE_FORMAT_GSM610:
			printf("CODEID: %s\n", WAVE_FORMAT_GSM610_DES);
			break;
		case WAVE_FORMAT_MPEGLAYER3:
			printf("CODEID: %s\n", WAVE_FORMAT_MPEGLAYER3_DES);
			break;
		case WAVE_FORMAT_G726:
			printf("CODEID: %s\n", WAVE_FORMAT_G726_DES);
			break;
		case WAVE_FORMAT_MPEG:
			printf("CODEID: %s\n", WAVE_FORMAT_MPEG_DES);
			break;
		default:
			printf("UNSUPPORT FILE.\n");
			return PRINT_ERROR;
		}
		break;
	default:
		printf("UNSUPPORT FILE.\n");
		return PRINT_ERROR;
	}

	printf("FILESIZE : %d BYTES\n"
		"FMTSIZE  : %u BYTES\n"
		"FREQUENCY: %d HZ\n"
		"BITSAMPLE: %d BITS\n"
		"CHANNELS : %d\n\n"
		, pFormatInfo->sComm.lFileSize
		, pFormatInfo->sComm.lChunkLen
		, pFormatInfo->sFmt.sFmtComm.u32SamplesPerSec
		, pFormatInfo->sFmt.sFmtComm.u16BitsPerSample
		, pFormatInfo->sFmt.sFmtComm.u16Channels);

	return 0;
}


参考链接:https://www.cnblogs.com/ranson7zop/p/7657874.html

你可能感兴趣的:(音频解码,音频编码解码)