CSCore: как применить эффект во время захвата звука

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

Моя проблема: я спросил, как записать аудиовыход с помощью cscore несколько месяцев назад: C# запись звука со звуковой карты. Все это прекрасно работает, но теперь я хотел бы расширить свое приложение. Я хотел бы предложить возможность применять эффекты к записанному аудио в режиме реального времени. Я уже нашел эту документацию: http://cscore.codeplex.com/wikipage?title=Build%20a%20source%20chain&referringTitle=Documentation но она просто показывает, как применять эффекты к воспроизведению. Я ищу подсказку или документацию о том, как это сделать. Я почти уверен, что мне чего-то не хватает, но я действительно не знаю, как преобразовать захват в нечто вроде воспроизведения?

1 ответ

Решение

Вы на правильном пути. Построение цепочки источников - это хороший подход. Вы можете просто конвертировать ISoundIn объект к источнику звука с помощью SoundInSource -класс ( SoundInSource). Я изменил код из последнего вопроса:

    using (WasapiCapture capture = new WasapiLoopbackCapture())
    {
        //if nessesary, you can choose a device here
        //to do so, simply set the device property of the capture to any MMDevice
        //to choose a device, take a look at the sample here: http://cscore.codeplex.com/

        //initialize the selected device for recording
        capture.Initialize();

        //create a wavewriter to write the data to
        using (WaveWriter w = new WaveWriter("dump.wav", capture.WaveFormat))
        {
            //convert the ISoundIn object into an audio source
            //make sure, that the ISoundIn object is already initialized
            var captureSource = new SoundInSource(capture){ FillWithZeros = false }; 

            //build any source chain
            var echoEffect = new DmoEchoEffect(captureSource);

            int read = 0;
            var buffer = new byte[echoEffect.WaveFormat.BytesPerSecond]; //buffer to read from the source chain

            captureSource.DataAvailable += (s, e) =>
            {
                while ((read = echoEffect.Read(buffer, 0, buffer.Length)) > 0) //read all available data from the source chain
                {
                    w.Write(buffer, 0, read); //write the read data to the wave file
                }
            };

            //start recording
            capture.Start();

            Console.ReadKey();

            //stop recording
            capture.Stop();
        }
    }
Другие вопросы по тегам