Использование NAudio с UDP и без микрофона - PullRequest
0 голосов
/ 15 мая 2018

Мне нужно получить данные UDP на указанный IP-адрес и порт и преобразовать их в файл WAV, используя C # и VS 2017. Я немного поработал с Google и прочитал, что NAudio может помочь в этом. Поэтому я скачал NAudioDemo на https://github.com/naudio/NAudio, и открыл проект NAudioDemo в VS 2017. Убедившись, что пакет NAudio NuGet был восстановлен, я запустил проект, выбрал для загрузки демо Network Chat и нажал кнопку «Загрузить».

Это загруженное демо Network Chat. Я ввел правильный IP-адрес и номер порта в текстовые поля и убедился, что значения Compression и Protocol были установлены правильно.

NAudio Demo (x64) screen shot

Вы заметите, что на снимке экрана раскрывающийся список «Устройство ввода» не был установлен. Это потому, что я запускаю демонстрационную версию на Windows Server 2012 R2 , а на сервере не настроены устройства ввода, и в раскрывающемся списке ничего нет.

Когда я нажимаю кнопку Start Streaming, она вызывает метод NetworkChatPanel.Connect, и это создает новый объект NetworkAudioPlayer. Внутри конструктора класса NetworkAudioPlayer он запускает следующий код:

public NetworkAudioPlayer(INetworkChatCodec codec, IAudioReceiver receiver)
{
    this.codec = codec;
    this.receiver = receiver;
    receiver.OnReceived(OnDataReceived);

    waveOut = new WaveOut();
    waveProvider = new BufferedWaveProvider(codec.RecordFormat);
    waveOut.Init(waveProvider);
    waveOut.Play();
}

Создает новый экземпляр объекта WaveOut и вызывает метод waveOut.Init. Это вызывает следующее исключение:

Необработанное исключение типа «NAudio.MmException» произошло в NAudio.dll BadDeviceId, вызывающий waveOutOpen, произошла

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

Не могли бы вы помочь мне запустить и работать на Windows Server 2012 R2 без устройств ввода, чтобы я мог сохранить данные UDP в виде файла WAV? Спасибо.

1 Ответ

0 голосов
/ 26 июня 2018

Очевидно, что без звуковой карты вы не можете воспроизводить аудио. Так что избавьтесь от всего кода, относящегося к WaveOut, и вместо него создайте WaveFileWriter. Когда вы получаете событие DataReceived, запишите полученное аудио в WaveFileWriter (с помощью метода Write). Затем убедитесь, что Dispose WaveFileWriter, когда вы закончите

...