有关于 WAV 解码 的问题 重尝

vcfor 2002-05-09 10:52:31
有关于WAV的问题。

我们平常在PC机上存储的 波形WAV 文件, 这个文件有没有对数据进行了压缩?

如进行了压缩,那应如何解码? 有没有什么关于这方面的资料?

如有一种 PCM 44位头文件的 波形 WAV 文件, 我如何对它进行 解码,得到
解码后的数据?

如没有,是否说我们可以真接取文件 WAV 数据区(data后)中的数据来对啦叭数据
输出来实现声音播放。

你的参与就是对我的帮助。谢谢。
...全文
298 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
use_id 2002-05-10

to: xuying

你说的解码就是分析出文件格式出来吗?

不是对 文件格式中 "data" 后面的数据操作(解码)吗?

你说直接用结构2)解码吗? 如是这样子,那么文件解码与不解码的总体大小不是没有什么变化。 那还不如说是不种纯文件格式。
回复
Ago23 2002-05-09
http://www.csdn.net/expert/topic/709/709609.xml?temp=.4640314
回复
xuying 2002-05-09
按结构2)对A律u律 解码
回复
vcfor 2002-05-09

欢迎大家参与。 兄弟在此先行谢过了。
回复
vcfor 2002-05-09
那如何,对A律u律 解码呢?
回复
xuying 2002-05-09
根据wFormatTag就可判断了是PCM还是A律u律了。
回复
vcfor 2002-05-09

to : xuyihg()

第二种情况:
2)A率和u率PCM的音频文件头格式为一个长58字节的结构,该结构的声明及说明如下:

那么对于上面的 第二种情况呢? 我该如何解码呢?

是否说如我对第二种情况解码了的话,就大休上成了一个 PCM WAV 文件了。
回复
xuying 2002-05-09
没有压缩。
PCM WAV按上面的机构1)就可以解码了。
回复
vcfor 2002-05-09

我问的是:是不是WAV文件 有一种压缩进行了?

当我需要对压缩的WAV 解码时,我应该如何做?

是不是对应的不同WAV文件具有不同的压缩算法。也就是说我需要对不同类型的WAV文件进行不同的解码?

那么对 PCM WAV 格式, 我需要解码,我应该如何做?

谢谢!
回复
xuying 2002-05-09
1)标准Wave PCM格式的音频文件头格式为一个44字节长的结构,该结构的声明及说明如下:

typedef struct
{
char riff[4]; //="RIFF";
DWORD size_8; // = 音频文件 - 8 ( =音频数据长度+该结构体长度 - 8)
char wave[4]; //="WAVE";
char fmt[4]; //="fmt ";
DWORD fmtSize; //下一个结构体的大小 = 16;

//struct WAVEFORMAT defined in "mmreg.h"
WORD wFormatTag; //WAVE_FORMAT_PCM ( = 1);
WORD wChannels; //通道数 = 1
DWORD dwSamplesPerSec; //采样率 (8000 或 16000)
DWORD dwAvgBytesPerSec; //每秒字节数 ( = 采样率 × 量化比特数 ÷ 8 (nSamplesPerSec * wBitsPerSample / 8 ))
WORD wBlockAlign; //每采样点字节数 (量化比特数÷8 (wBitsPerSample / 8))
WORD wBitsPerSample; //量化比特数((当采样率为8000时=8,当采样率为16000时=16))

char data[4]; //="data";
DWORD datasize; //纯数据长度
}TWaveHeadPCM, *PTWaveHeadPCM;

2)A率和u率PCM的音频文件头格式为一个长58字节的结构,该结构的声明及说明如下:

typedef struct
{
char riff[4]; //="RIFF";
DWORD size_8; //= filesize - 8
char wave[4]; //="WAVE";
char fmt[4]; //="fmt ";
DWORD fmtSize; //=下一个结构体的大小;

//struct WAVEFORMATEX define in "mmreg.h"
WORD wFormatTag; //= (WAVE_FORMAT_ALAW (==6) :alaw , WAVE_FORMAT_ULAW (==7) :ulaw);
WORD wChannels; //通道数
DWORD dwSamplesPerSec; //采样率
DWORD dwAvgBytesPerSec; //每秒字节数
WORD wBlockAlign; //wChannels*dwAvgBytesPerSec
WORD wBitsPerSample; //每个采样点的量化比特数
WORD cbSize; //下一个结构体的大小 = 0;

char fact[4]; //="fact";
WORD unknown1; //=4;
WORD unknown2; //=0;
DWORD datasize_raw; //=datasize(纯数据长度)

char data[4]; //="data";
DWORD datasize; //纯数据长度
}TWaveHeadAMULAW, *PTWaveHeadAMULAW;
注意:其中未特殊说明的项与标准PCM相同。

结构中的“WORD wFormatTag;”指明了它的类型,类型的定义在“mmsystem.h”有声明。
4。对于双声道到单声道可以简单的每一个采样点丢弃一半的数据就可以了。
回复
xuying 2002-05-09
WAV文件头:

偏移地址 字节数 数据类型 内 容
00H 4 char "RIFF"标志
04H 4 long int 文件长度
08H 4 char "WAVE"标志
0CH 4 char "fmt"标志
10H 4 过渡字节(不定)
14H 2 int 格式类别(10H为PCM形式的声音数据)
16H 2 int 通道数,单声道为1,双声道为2
18H 2 int 采样率(每秒样本数),表示每个通道的播放速度,
1CH 4 long int 波形音频数据传送速率,其值为通道数×每秒数据位数×每样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。
20H 2 int 数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。
22H 2 每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。
24H 4 char 数据标记符"data"
28H 4 long int 语音数据的长度
回复
wumugulu 2002-05-09
不知道你想干什么,用api直接播放不就行了么!!!???
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-05-09 10:52
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……