Как узнать формат байтов? NAudio - PullRequest
0 голосов
/ 14 февраля 2020

Что я пытаюсь сделать: получать данные с микрофона (IWaveIn) => понижать амплитуду звука (уменьшать громкость) (проблема) => воспроизводить его на динамики (IWaveProvider)

Проблема в том, что всякий раз, когда я пытаюсь умножить выборку на x! = 1.0f, я получаю очень шумные отзывы. Я думаю, что это может быть формат байтов, но я не знаю, как это проверить. Любая помощь / предложение будет оценено.

Количество = 17640; Смещение = 0;

public int Read(byte[] buffer, int offset, int count)
    {
        int read = bufferedWaveProvider.Read(buffer, offset, count);

        /*
                waveIn.WaveFormat.Channels; //2
                waveIn.WaveFormat.BlockAlign;//4
                waveIn.WaveFormat.BitsPerSample;//16
                waveIn.WaveFormat.SampleRate;//44100
         */

        for (int i = 0; i < read / 4; i++)
        {
            int firstByte = i * 4;
            float sample = BitConverter.ToSingle(buffer, firstByte);
            sample = sample * 1.0f;

            byte[] bytes = BitConverter.GetBytes(sample);
            buffer[firstByte + 0] = bytes[0];
            buffer[firstByte + 1] = bytes[1];
            buffer[firstByte + 2] = bytes[2];
            buffer[firstByte + 3] = bytes[3];
        }

        return read;
    }
    private void OnDataAvailable(object sender, WaveInEventArgs e)
    {
        bufferedWaveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded);
    }

1 Ответ

1 голос
/ 15 февраля 2020

Вы получаете аудио в формате, указанном в WaveIn.WaveFormat. Ваш комментарий показывает 16 бит на семпл, что означает, что вы получаете аудио как подписанные 16 битные семплы. Таким образом, вы можете использовать BitConverter.ToInt16

Но есть более простые способы сделать это. Если вы наберете ToSampleProvider() на вашем BufferedWaveProvider, вы можете передать его на VolumeSampleProvider, который позволит вам напрямую регулировать громкость, не распаковывая сэмплы самостоятельно.

...