Wave 文件 - 处理特定的音频数据块
Posted
技术标签:
【中文标题】Wave 文件 - 处理特定的音频数据块【英文标题】:Wave file - processing specific chunk of audio data 【发布时间】:2016-11-08 09:25:47 【问题描述】:我正在尝试迭代一个波形文件并在每次迭代时发送 20ms 的文件。 假设我使用的是 8khz、1 通道、16 位 音频文件,我使用 NAudio 有以下代码:
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 内(生成的正弦波),但我无法将这 20 毫秒分成 InpBuf,我看到 InpBuf 包含整个音频数据。
一旦我了解了这个问题,我就可以转向立体声和不同的音频格式。
感谢任何帮助,谢谢。
【问题讨论】:
【参考方案1】:问题与blockcopy操作有关
Buffer.BlockCopy(data, 0, sampleBuffer, 0, read);
您每次都从 start 复制整个输入缓冲区,因为您没有定义任何偏移量
参见BlockCopy 文档
【讨论】:
谢谢。在这里做的最好的事情是什么?它应该是这样的还是有其他有效的方法?code int offst = 0; for (int i = 0; i < read; i += 2) Buffer.BlockCopy(data, offst, InpBuf, 0, 159); offst += 159; Process20(InpBuf); //Send 20ms of audio data which inside InpBuf Array.Clear(InpBuf, 0, InpBuf.Length); code
第一种方法很好......一旦您确定它按预期工作,它可能可以稍微调整一下
不幸的是,这带来了一个非常混乱的结果......我的原始音频数据在 'byte[] data = new byte[wHeader.Length];'当我循环音频数据时,它看起来像这样:'for (int i = 0; i
以上是关于Wave 文件 - 处理特定的音频数据块的主要内容,如果未能解决你的问题,请参考以下文章
音频识别(Audio Classification)学习笔记
WAV 文件 (.wav) 和 WAVE 音频文件 (.wave) 有啥区别?