Странные значения данных PCM aduio в NAudioC#

Место общения программистов C#
Ответить
Anonymous
 Странные значения данных PCM aduio в NAudio

Сообщение Anonymous »

Я хочу создать приложение, которое считывает значения БД с микрофона. Для этого я использую NAudio для «записи» потока WaveIn, преобразования данных в образцы, получения максимума каждого буфера, усреднения максимумов буфера за 1 секунду и преобразования их в dbfs. Я использую приложение WPF на .NET 10.
С 32-битным звуком с плавающей запятой все работает нормально, но при использовании 24-битного PCM все ломается. Я получаю либо 0 (при выключенном звуке), либо ~16777184, как только получаю звук.
Я также заметил, что буфер выглядит немного странно:

Код: Выделить всё

160 234 255 160 234 255 128 233 255 128 233 255 64 232 255 64 232 255 32 231 255 32 231 255 0 230 255 0 230 255 224 228 255 224 228 255 192 227 255 192 227 255 160 226 255 160 226 255 160 225 255 160 225 255 128 224 255 128 224 255 128 223 255 128 223 255 160 222 255 160 222 255 160 221 255 160 221 255 192 220 255 192 220 255 192 219 255 192 219 255 0 219 255 0 219 255 32 218 255 32 218 255 96 217 255 96 217 255 128 216 255 128 216 255 224 215 255 224 215 255 32 215 255 32 215 255 128 214 255 128 214 255 192 213 255 192 213 255 64 213 255 64 213 255 160 212 255 160 212 255 32 212 255 32 212 255 160 211 255 160 211 255 32 211 255 32 211 255 192 210 255 192 210 255 96 210 255 96 210 255 0 210 255 0 210 255 192 209 255 192 209 255 128 209 255 128 209 255 64 209 255 64 209 255 32 209 255 32 209 255 224 208 255 224 208 255 192 208 255 192 208 255 192 208 255 192 208 255 192 208 255 192 208 255 192 208 255 192 208 255 192 208 255 192 208 255 224 208 255 224 208 255 0 209 255 0
(первые 256 бит)
Кажется, что значения растут (а затем циклически повторяются) при движении вниз по буферу, при этом громкость не оказывает никакого эффекта. Я бы понял, что LSB сделает это, но не остальное. Это приводит к тому, что вычисление максимума всегда возвращает большое число, поскольку всегда есть триплет рядом с 255, 255, 255. Иногда я получаю немного стабильных данных, где второй и третий бит каждого триплета увеличивается и уменьшается в зависимости от входного объема. Иногда это весь буфер, иногда всего несколько десятков бит, и я не знаю, чем это вызвано.
Вот код для отображения буфера:

Код: Выделить всё

        private void OnDataAvailablePCM(object sender, WaveInEventArgs args)
{
StringBuilder sb = new StringBuilder();

foreach (byte b in args.Buffer[0..256])
{
sb.Append(b.ToString() + " ");
}

Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => {
(window as MainWindow).bufb.Text = sb.ToString();
}));
}
А вот тот, который использовался для расчета максимального значения (взято из документации NAudio, но изменено на 24-битное целое число):

Код: Выделить всё

        private void OnDataAvailablePCM(object sender, WaveInEventArgs args)
{
float max = 0;
// interpret as 24 bit audio
for (int index = 0; index < args.BytesRecorded; index += 3)
{
int sample = (args.Buffer[index + 2]  {
(window as MainWindow).bufb.Text = max.ToString();
}));
}
Я действительно не знаю, что вызывает эту проблему. В Windows и Voicemeeter все настроено на 2 канала 24 бит 96 кГц. NAudio установлен на буфер 100 мс (изменение не имеет никакого эффекта), и я использую новый WaveFormat(96000,24,2) в качестве формата волны.
Я пытаюсь понять это уже несколько часов, поэтому любой ввод приветствуется. ТИА

Подробнее здесь: https://stackoverflow.com/questions/798 ... -in-naudio
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»