Member 1898210 Ответов: 2

C# и wave - как я обрабатываю 20 мс аудиоданных


Всем привет,

У меня возникли проблемы с достижением того, что, я уверен, вы, ребята, можете мне помочь.
Я пытаюсь перебирать волновой файл и обрабатывать 20 мс аудиоданных каждый раз. Тем не менее, я путаюсь с массивами байтов и преобразованиями, и я был бы благодарен, если бы кто-то мог помочь в этом с примерами...

В конце мне нужно будет обработать несколько типов (2 канала, 16 кГц и т. д.), Но пока у меня есть готовый 8000 Гц, 1 канал 16 бит файл.

Я использую Наудио для чтения файла.

Что я уже пробовал:

/*
Pcm 8000Hz 1 channels 16 bits per sample
Extra Size: 0 Block Align: 2 Average Bytes Per Second: 16000
WaveFormat: 16 bit PCM: 8kHz 1 channels
Length: 351360 bytes: 00:00:21.9600000 
*/

WaveFileReader wHeader= new WaveFileReader(FullFileName);

byte[] data = new byte[wHeader.Length];
int read = wHeader.Read(data, 0, data.Length);  //Length = 351360
short[] shortBuffer = new short[read / 2]; // = 175680
int tBuf = 159; //Not sure this is 20ms?
short[] InpBuf = new short[tBuf]; //This is the 20ms inputBuffer I will process
int offst = 0;

Buffer.BlockCopy(data, 0, shortBuffer, 0, data.Length);


for (int i = 0; i < read; i += 2)
            {
                Buffer.BlockCopy(shortBuffer , offst, InpBuf, 0, tBuf);  //I'm taking the tBuf (=159) data from the full shortBuffer into InpBuf (with offset of 0)
                offst += tBuf+1; //advancing the next offset from 0 to 160

                Process20ms(InpBuf);  //now I can process the 20ms of data

                Array.Clear(InpBuf, 0, InpBuf.Length); //resetting the InpBuf for the next iteration
            }


В любом случае, это не очень хорошо работает, когда я сравниваю inpBuf куски по полной shortBuffer Я вижу, что данные в inpBuf[0] и inpBufp[78] идентичны, но потом я получаю 00000 до inpBuf[159].
После inpBuf[160] Я получаю совершенно другие данные.

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

Как только я пойму это, я думаю, что будет намного проще обрабатывать стереофонические (2 канала) файлы.

Спасибо...

2 Ответов

Рейтинг:
1

Bernhard Hiller

Я думаю Buffer.BlockCopy копирует байты, а не шорты. Поскольку вы используете 16-битные образцы, вам нужно скопировать в два раза больше байтов.


Рейтинг:
0

Richard MacCutchan

Вы используете Buffer.BlockCopy для копирования с data к sampleBuffer, а затем из shortBuffer к InpBuf. Но вы никогда не помещаете никаких данных в shortBuffer Ваш код довольно запутан со всеми этими различными буферами. Все, что вам действительно нужно, - это тот, в котором можно читать данные. Затем вы можете обрабатывать определенные группы байтов непосредственно в этом буфере.


Member 1898210

Спасибо-извините за путаницу, мой плохой- & gt; shortBuffer-это sampleBuffer, я просто переименовал его, чтобы было более четкое название...

Richard MacCutchan

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

Member 1898210

В любом случае, я знаю, что это цитата, сбивающая с толку, так что просто ради простоты... :

data-исходный байт[] с аудиоданными
shortBuffer - короткий[] с аудиоданными
inpBuff - кусок аудиоданных, который должен содержать только 20 мс