Воспроизведение системы записанного звука - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь записать системный звук и транслировать его по tcp, чтобы затем воспроизводить его на другом компьютере, но моя проблема в том, что тогда я воспроизводю звук, который, как мне кажется, воспроизводится очень медленно.Я использую WasapiLoopbackCapture для записи системного звука, но когда я пытаюсь воспроизвести байты, которые я записываю, он воспроизводится медленно.Как это исправить?Если я записываю файл, а затем воспроизводлю его, он звучит нормально, но я не могу напрямую воспроизводить байты.
Это код, который я использую для воспроизведения звука.

bufferedWaveProvider = new BufferedWaveProvider(CaptureInstance.WaveFormat);
savingWaveProvider = new SavingWaveProvider(bufferedWaveProvider, outputFilePath);
soundPlayer = new WasapiOut();
soundPlayer.Init(bufferedWaveProvider);
soundPlayer.Play();

И позже в коде, когда я получаю буфер через TCP, я добавляю образец.

bufferedWaveProvider.AddSamples(bytes, 0, bytes.Length);

1 Ответ

0 голосов
/ 25 марта 2019

Вы должны убедиться, что форматы волн точно совпадают. Обычно WASAPI Loop-Capture захватывает стерео сэмплы IEEE с плавающей запятой на частоте 44,1 кГц или 48 кГц. Таким образом, WaveFormat из BufferedWaveProvider должен быть установлен точно в тот же формат, в котором записывается звук.

Другая проблема, о которой следует знать, это то, что вы должны использовать свойство BytesRecorded события DataAvailable, а не длину буфера. Буфер захвата не всегда может быть полностью заполнен.

Наконец, необработанные стереофонические сэмплы IEEE с частотой 44 кГц или выше не очень эффективный способ передачи звука по сети. Может быть, ваша сеть не справляется. Обычно программы, которые передают аудио по сети, применяют какой-то кодек для уменьшения требований к пропускной способности.

...