2016-11-08 58 views
1

我想遍历一个wave文件,并在每次迭代时发送20ms。 假设我使用8kHz的,1个信道,16位音频文件,我使用n音讯下面的代码:Wave文件 - 处理特定的音频数据块

WaveFileReader wHeader = new WaveFileReader(fullFileName); 

byte[] data = new byte[wHeader.Length]; 
int read = wHeader.Read(data, 0, data.Length); 
short[] sampleBuffer = new short[read/2]; 
short[] InpBuf; 

for (int i = 0; i < read; i += 2) 
{ 
InpBuf = new short[159]; //20ms? 

Buffer.BlockCopy(data, 0, sampleBuffer, 0, read); 
InpBuf = sampleBuffer; 

Process20(InpBuf); //Send 20ms of audio data which inside InpBuf 

} 

我可以看到完整的音频数据是内部sampleBuffer现在(产生波正弦),但我不能将这些20ms分成InpBuf,我看到InpBuf包含整个音频数据。

一旦我明白了这个问题,我就能够转向立体声和不同的音频格式。

任何帮助表示赞赏,谢谢。

回答

0

的问题是关系到blockcopy操作

Buffer.BlockCopy(data, 0, sampleBuffer, 0, read); 

您是从复制每次启动整个输入缓冲区,因为你还没有定义的任何偏移

看到BlockCopy文档

+0

感谢。在这里做什么是最好的事情? 它应该是这样的东西还是有其他有效的方式吗? 'code int offst = 0; (int i = 0; i

+0

这对第一种方法很有用...大概一旦你确定它按预期工作,它可以被调整一点点 – cristallo

+0

不幸的是,这带来了一个非常混乱的结果... 我的原始音频数据在'byte [] data = new byte [wHeader.Length]'内' (int i = 0; i