【求大神指导】wav文件数据区(文件头后面的)怎么用c语言编写啊?

如果您用的不是c告诉我思想谢谢啦... 如果您用的不是c 告诉我思想 谢谢啦 展开
 我来答
ejiizhg
2014-01-13 · TA获得超过185个赞
知道小有建树答主
回答量:184
采纳率:0%
帮助的人:140万
展开全部

wav文件是微软保存音频数据的文件,它的数据内容一般都是录音的数据内容,下面的wav文件介绍供参考:

首先wav文件是基于微软版本的EA-IFF方法来保存数据的,IFF是Electronic Arts公司开发的一种文件格式(EA IFF 1985),基于基本的IFF格式,wav的收保存在各种不同的“chunk”中。

在wav文件中,有三种chunk是必须的,另外的chunk都是可选的,简单的可以如图所示:


1.             'RIFF', 'WAVE' chunk

这个chunk主要是一个标记,告诉我们这是一个wav文件。它的数据信息可以用如下:

----------------------------------

 |ID    |  4 Bytes |   'RIFF'    |
   ----------------------------------
    | Size  |  4 Bytes|              |
   ----------------------------------
    | Type  |  4 Bytes|   'WAVE' |
   ----------------------------------

所以wav文件的wave chunk是很简单的,共有12个字节,size表示的是整个wav文件大小除去该chunk的ID和Size的大小,也就是FileSize-8。

 

2.             "fmt" chunk

格式chunk包含个各种描述内容格式的重要参数,比如音频的采样率,比特率等。它的信息可以用如下的图来表示:

--------------------------------------------------------------------
    |ID            |  4Bytes     |   'fmt'                            |
   --------------------------------------------------------------------
    |Size          |  4Bytes    | 数值为16或18,18则最后又附加信息     |
   ------------------------------------------------------------------------
    |FormatTag     |  2 Bytes  | 编码方式,一般为0x0001    |    
   --------------------------------------------------------------------    |
    |Channels      |  2 Bytes  | 声道数目,1--单声道;2--双声道       |    
   --------------------------------------------------------------------    |
    | SamplesPerSec |  4Bytes  | 采样频率                            |  
   --------------------------------------------------------------------    |
    | AvgBytesPerSec|  4Bytes  | 每秒所需字节数                      |    
   --------------------------------------------------------------------    |
    |BlockAlign    |  2 Bytes  | 数据块对齐单位(每个采样需要的字节数) |   
   --------------------------------------------------------------------    |
    | BitsPerSample |  2Bytes  | 每个采样需要的bit数                 |   
    --------------------------------------------------------------------    |
   |              |  2 Bytes  | 附加信息(可选,通过Size来判断有无) |    
   --------------------------------------------------------------------  ----

该部分的内容以’fmt’为标记,4字节size表示的该chunk除去ID和Size的大小,如图中所示为16或18;FormatTag表示的该wav数据的编码,这里最常用的编码就是0x0001,为PCM编码,其他的编码,可以参考微软的Windows  wave格式。声道数,采样率不再累赘,blockalign以8字节对齐,可以用下面的方式计算

nBlockAlign = channels * ((nBitsPerSample + 7) / 8);

nBitsPerSample表示音频数据字长,16位的bit最为常见;AvgBytesPerSe表示每秒钟的字节数。

 

3.             'data' chunk

数据chunk则保存了真正的wav数据;它的格式如下:

|ID    |  4 Bytes |   'data'    |
    ----------------------------------
    | Size  |  4 Bytes|             |
    ----------------------------------
    | data |         |             |
    ----------------------------------
    以'data'作为该Chunk的标示。然后是数据的大小。紧接着就是wav数据。根据Format Chunk中的声道数以及采样bit数,每个byte中wav数据的bit位置可以分成以下几种形式(以intel的little edian为例):

a,单声道8位字长

 ---------------------------------------------------------------------
    |   单声道  |    取样1    |    取样2    |    取样3    |    取样4    |
   |             |--------------------------------------------------------
    |  8bit量化 |    声道0    |    声道0    |    声道0    |    声道0    |
   ---------------------------------------------------------------------
    b, 双声道8位字长

|  双声道   |         取样1               |          取样2            |
   |              |--------------------------------------------------------
    |  8bit量化 |  声道0(左)  |  声道1(右)  |  声道0(左)  |  声道1(右)  |
   ---------------------------------------------------------------------
    c, 单声道16位字长

|             |         取样1               |          取样2          |
    |   单声道   |--------------------------------------------------------
    | 16bit量化 |    声道0    |  声道0     |    声道0    |  声道0      |
   |               | (低位字节)  | (高位字节)  | (低位字节)  | (高位字节)  |
   ---------------------------------------------------------------------
   c, 双声道16位字长

|             |                        取样1                                     |
    |   双声道   |--------------------------------------------------------  
    | 16bit量化 |  声道0(左)  |  声道0(左)  |  声道1(右)  |  声道1(右) |
   |               | (低位字节)  | (高位字节)  | (低位字节)  | (高位字节)  |
   ---------------------------------------------------------------------

参考:

http://www.codeguru.com/cpp/g-m/multimedia/audio/article.php/c8935/PCM-Audio-and-Wave-Files.htm#page-1

http://blog.csdn.net/bluesoal/article/details/932395

追问
那怎样利用跨平台格式的乐谱文件产生声卡可用的数据文件?
追答
是midi文件转化成其他格式吗?这个转换是有工具的
匿名用户
2014-01-13
展开全部
实在很难跟你解释,首先WAV文件只是一个容器,存放的声音数据,这些数据由WAV文件头定义的(包括它们的格式),所以WAV其实可以放很多种编码的

最常见的应该是PCM那种编码了,可以从微软的MSDN里查到相关的WAV结构,不过WAV数据都是一些波形的采样,这个一般不需要你去写的,如果你有自己的波形生成算法,才需要这么做,一般录音的话直接调微软的wavoutwrite那套API就OK了
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
通达还挺拔的小松柏g
2014-01-13
知道答主
回答量:40
采纳率:0%
帮助的人:7.8万
展开全部
猜猜看吧。
追问
你逗我吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式