2016-11-08 3 views
1

Я пытаюсь выполнить итерацию по волновому файлу и отправить 20 мс из них на каждой итерации. Предполагая, что я использую 8 кГц, 1 канал, 16bit аудиофайл, у меня есть следующий код, используя 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 содержит все аудиоданные.

Как только я пойму эту проблему, я смогу перейти к стерео и различным аудиоформатам.

Любая помощь приветствуется, спасибо.

ответ

0

Проблема связана с blockcopy операции

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

вы копируете весь входной буфер от запуска каждый раз, потому что вы не определили любого смещения

см BlockCopy документации

+0

Спасибо. Что лучше всего делать здесь? Должно ли это быть чем-то вроде этого или есть какой-либо другой эффективный способ? «код int offst = 0; для (int i = 0; i

+0

это хорошо для первого подхода ... возможно, его можно немного изменить, как только вы убедитесь, что он работает как ожидалось – cristallo

+0

К сожалению, это приносит очень запутанный результат ... My исходные аудиоданные находятся внутри 'byte [] data = new byte [wHeader.Length];' Когда я зацикливание аудиоданные это выглядит следующим образом: «для (INT I = 0; я <читать, я + = 2) { Buffer.BlockCopy (данные, offst, InpBuf, 0, TBUF) ; offst + = tBuf; Array.Clear (InpBuf, 0, InpBuf.Length); } ' Однако внутри InpBuf я вижу первую половину в порядке, а затем получаю нули до конца, а потом значения отличаются от данных. Я мог бы пропустить всю точку здесь ... –