NAudio C # решает проблему - PullRequest
1 голос
/ 15 июня 2019

У меня проблема с использованием NAudio и WasapiLoopBackCapture ... Я новичок и не понимаю всего, что я делаю.Я хочу конвертировать байтовый буфер в другой с форматом волны 44100 и скоростью 16 бит.Это работает, но у меня появляется какой-то шум или странный шум после преобразования.

Редактировать: Я пытался объединить весь буфер без преобразования.Я конвертирую и пишу только в конце, а потом все работает нормально.Я думаю, что проблема в функции Convert16 или readStream.Если я объединяю конвертированный буфер, шипение приходит между 2 буферами.Это может быть проблема длины?Мне нужно конвертировать буфер без слияния, потому что я отправляю их по udp

Функции Convert16 и Readstream из этой темы

    public byte[] Convert16(byte[] input, int length, WaveFormat format)
    {
        if (length == 0)
            return new byte[0];
        using (var memStream = new MemoryStream(input, 0, length))
        {
            using (var inputStream = new RawSourceWaveStream(memStream, format))
            {
                var sampleStream = new NAudio.Wave.SampleProviders.WaveToSampleProvider(inputStream);
                var resamplingProvider = new NAudio.Wave.SampleProviders.WdlResamplingSampleProvider(sampleStream, audioRate);
                var ieeeToPCM = new NAudio.Wave.SampleProviders.SampleToWaveProvider16(resamplingProvider);
                var sampleStreams = new NAudio.Wave.StereoToMonoProvider16(ieeeToPCM);
                sampleStreams.RightVolume = 0.5f;
                sampleStreams.LeftVolume = 0.5f;
                return readStream(sampleStreams, length);
            }
        }
    }

    private byte[] readStream(IWaveProvider waveStream, int length)
    {
        byte[] buffer = new byte[length];
        using (var stream = new MemoryStream())
        {
            int read;
            while ((read = waveStream.Read(buffer, 0, length)) > 0)
            {
                stream.Write(buffer, 0, read);
            }
            return stream.ToArray();
        }
    }


    public void InputBufferToFileCallback(object sender, WaveInEventArgs e)
    {
        // Used to see WaveViewer and to test
        baseWriter.Write(e.Buffer, 0, e.BytesRecorded);

        // byte[] convertedTo16 -- PROBLEM IS HERE
        convertedTo16 = Convert16(e.Buffer, e.BytesRecorded, waveFormatIn);

        // Used to see WaveViewer and to test
        convertedWriter.Write(convertedTo16, 0, convertedTo16.Length);

        // Send over udp real time
        SendSoundController(convertedTo16);
    }

Мы можем видеть наНа этом изображении разница между повторной выборкой смелости и моей повторной выборкой.Мы видим проблему.

https://i.imgur.com/H3PbNYR.png

Спасибо и хорошего дня.

...