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