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 &lt; 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) 有啥区别?

iOS开发——WAVE音频文件解析

Python 从零开始制作自己的声音 - wave模块读写wav文件详解

Goldwave生成wave音频数据