从outpud设备到输入设备的实时音频流(从系统混音器到麦克风)

时间:2017-08-03 17:07:05

标签: c# naudio

我需要将我的OS混音器声音传输到麦克风。 (通过Skype传输它们)。 重要的是 - 我需要能够配置流的延迟/延迟。

(VAC)虚拟音频线对我来说不是解决方案:它在我的情况下不起作用。我有一个外部USB声音设备,一个应用程序不适合我。我试过了。真正

我谷歌超过2天,一无所获。 所以我想尝试为此编写自己的应用程序。没有NAudio的经验。

目前我只有:

using System;
using System.Collections.Generic;
using NAudio.Wave;

namespace SoundApp
{
    public class AudioCable
    {
        private WaveOut _wvOut = null;

        private DirectSoundOut _output = null;
        private WaveIn _sourceStreamIn = null;
        private WaveOut _sourceStreamOut = null;

        public void InitDevices(string fromDevice, string toDevice)
        {
            Dispose();

            _sourceStreamIn = new WaveIn();
            _sourceStreamOut = new WaveOut();
            _output = new DirectSoundOut();

            if (fromDevice.Contains("INPUT"))
            {
                var tmp = fromDevice.Split('|')[0].Replace("INPUT: ", "").Trim(' ');
                int tmpDeviceNumber = int.Parse(tmp);
                _sourceStreamIn.DeviceNumber = tmpDeviceNumber;
            }
            else
            {
                var tmp = toDevice.Split('|')[0].Replace("OUTPUT: ", "").Trim(' ');
                int tmpDeviceNumber = int.Parse(tmp);
                _sourceStreamOut.DeviceNumber = tmpDeviceNumber;
            }

            Guid deviceGuid;
            if (toDevice.Contains("INPUT"))
            {
                var tmp = toDevice.Split('|')[0].Replace("INPUT: ", "").Trim(' ');
                int tmpDeviceNumber = int.Parse(tmp);
                WaveInCapabilities deviceInfo = WaveIn.GetCapabilities(tmpDeviceNumber);
                deviceGuid = deviceInfo.ManufacturerGuid;
            }
            else
            {
                var tmp = toDevice.Split('|')[0].Replace("OUTPUT: ", "").Trim(' ');
                int tmpDeviceNumber = int.Parse(tmp);
                WaveOutCapabilities deviceInfo = WaveOut.GetCapabilities(tmpDeviceNumber);
                deviceGuid = deviceInfo.ManufacturerGuid;
            }
            _output = new DirectSoundOut(deviceGuid);
        }

        public void PlaySound()
        {
            WaveInProvider waveIn = null;

            if (_sourceStreamIn != null)
            {
                waveIn = new WaveInProvider(_sourceStreamIn);
            }
            else if (_sourceStreamOut != null)
            {
                throw new Exception("Sorry, not supported right now");
                //waveIn = new WaveInProvider(_sourceStreamOut);
            }

            _output.Init(waveIn);
            _output.Play();
        }

        public void Dispose()
        {
            _sourceStreamIn = null;
            _sourceStreamOut = null;

            if (_output != null)
            {
                if (_output.PlaybackState == PlaybackState.Playing)
                {
                    _output.Stop();
                }

                _output.Dispose();
                _output = null;
            }
        }

        public string[] GetAudioDevices()
        {
            var devices = new List<string>();

            for (int i = 0; i < WaveIn.DeviceCount; i++)
            {
                WaveInCapabilities deviceInfo = WaveIn.GetCapabilities(i);
                devices.Add($"INPUT: {i}     | {deviceInfo.ProductName}");
            }

            for (int i = 0; i < WaveOut.DeviceCount; i++)
            {
                WaveOutCapabilities deviceInfo = WaveOut.GetCapabilities(i);
                devices.Add($"OUTPUT: {i} | {deviceInfo.ProductName}");
            }

            return devices.ToArray();
        }
    }
}

表格来源:

namespace SoundApp
{
    public partial class Form1 : Form
    {
        AudioCable _ac = new AudioCable();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            cBoxSource.DropDownStyle = ComboBoxStyle.DropDownList;
            cBoxTarget.DropDownStyle = ComboBoxStyle.DropDownList;

            cBoxSource.Items.AddRange(_ac.GetAudioDevices());
            cBoxTarget.Items.AddRange(_ac.GetAudioDevices());
        }

        private void btnStartStop_Click(object sender, EventArgs e)
        {
            _ac.InitDevices(cBoxSource.SelectedItem.ToString(), cBoxTarget.SelectedItem.ToString());
            _ac.PlaySound();
        }
    }
}

所以在第一次我试图将麦克风传输到声音输出设备......而它根本不起作用。

所以我的问题是:

  1. 没有麦克风声,我不明白为什么会这样。代码有效,不会抛出任何错误。
  2. 看起来没有能力将输出设备声音流传输到带有NAudio的inputDevice。是否存在一些黑客攻击?

0 个答案:

没有答案