如何将系统麦克风音频流传输到附加设备的麦克风音频流

Posted

技术标签:

【中文标题】如何将系统麦克风音频流传输到附加设备的麦克风音频流【英文标题】:How transfer system mic audio stream to attached device mic audio stream 【发布时间】:2016-07-07 08:16:33 【问题描述】:

我正在尝试连接用于电话呼叫的 USB 设备,该设备具有用于麦克风和扬声器的 pnp 声音控制器。现在我有两个扬声器和两个麦克风用于输入输出,如下图所示。。现在我的动机是将音频流从系统麦克风传输到 USB 麦克风,从 USB 扬声器传输到系统扬声器。

我试图用虚拟电缆软件解决这个问题,但我需要依赖第三方。使用 c# 可以实现的可能解决方案是什么。

我没有这方面的知识,所以不知道如何开始。谷歌搜索后我发现了

    CS Core N Audio

可以帮我,我不知道怎么做。

 public partial class Form1 : Form

    public Form1()
    
        InitializeComponent();
    

    private void button1_Click(object sender, EventArgs e)
    
        List<NAudio.Wave.WaveInCapabilities> sources = new List<NAudio.Wave.WaveInCapabilities>();

        for (int i = 0; i < NAudio.Wave.WaveIn.DeviceCount; i++)
        
            sources.Add(NAudio.Wave.WaveIn.GetCapabilities(i));
        

        sourceList.Items.Clear();

        foreach (var source in sources)
        
            ListViewItem item = new ListViewItem(source.ProductName);
            item.SubItems.Add(new ListViewItem.ListViewSubItem(item, source.Channels.ToString()));
            sourceList.Items.Add(item);
        
    

    NAudio.Wave.WaveIn sourceStream,sourceStream1 = null;
    NAudio.Wave.DirectSoundOut waveOut = null;

    private void button2_Click(object sender, EventArgs e)
    
        if (sourceList.SelectedItems.Count == 0) return;

        int deviceNumber = sourceList.SelectedItems[0].Index;

        sourceStream = new NAudio.Wave.WaveIn();
        sourceStream.DeviceNumber = 0;
        sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels);



        NAudio.Wave.WaveInProvider waveIn = new NAudio.Wave.WaveInProvider(sourceStream1);
        sourceStream.
        waveOut = new NAudio.Wave.DirectSoundOut();
        waveOut.Init(waveIn);

        sourceStream1.StartRecording();
        waveOut.Play();
    

    private void button3_Click(object sender, EventArgs e)
    
        if (waveOut != null)
        
            waveOut.Stop();
            waveOut.Dispose();
            waveOut = null;
        
        if (sourceStream != null)
        
            sourceStream.StopRecording();
            sourceStream.Dispose();
            sourceStream = null;
        
    

    private void button4_Click(object sender, EventArgs e)
    
        button3_Click(sender, e);
        this.Close();
    

使用此代码我可以将麦克风音频发送到扬声器,但我如何使用它来实现我的任务。

【问题讨论】:

这不是答案,但它会给你一个提示 daveamenta.com/2011-05/… 它在 c++ 中,但你可以将它编译为 DLL 或 EXE 并从你的 C# 代码中调用它。 您能否详细说明一下,您为什么要这样做?目标是什么?对我来说,您似乎想同时使用系统麦克风和 USB 麦克风 - 对吧?也许您可以说出您在使用两台设备时遇到的问题,可能会有更好的解决方案。 @DanielGilbert USB 麦克风是唯一可以输入的端口,没有用于声音输入的物理麦克风(连接到外部声卡)。我的目标是通过向我的设备发送命令来开发使用 c# 操作的电话,该设备运行良好。如果我将耳机直接连接到我的设备上,它就完美了。但我想通过连接到系统的耳机交换声音。这样我就可以从我的外部硬件中移除麦克风和扬声器插孔。 【参考方案1】:

实际上,如果不编写任何自定义驱动程序,就无法做到这一点。您不能将音频数据渲染到输入设备。输入设备旨在从中读取数据。输出设备(扬声器)用于写入数据。

有些程序(如虚拟音频电缆)使用自定义驱动程序来绕过这些限制。

【讨论】:

WinDDK 包含一些示例。

以上是关于如何将系统麦克风音频流传输到附加设备的麦克风音频流的主要内容,如果未能解决你的问题,请参考以下文章

如何流式传输 blob

如何桥接字节数组和音频流?

将音频流读取到输出设备

使用 .NET Framework 捕获麦克风音频流

将实时 Android 音频流式传输到服务器

收听实时音频流