4

我已经有一段时间了,但没有任何进展。所以这是我最后的手段!我正在尝试将系统音频(我在耳机中听到的音频)发送到 Skype(让我通话中的人基本上听到我听到的内容)。我想我会使用 Skype4comlib 和 naudio 来做到这一点。

我所做的是创建一个使用WasapiLoopbackCaptureWaveFileWriter将临时数据写入 .wav 文件的类,并使用 SkypeSystemAudio.set_InputDevice 方法重定向音频。但是当我和某人说话并且我试图开始录音时,那个人不再听到我的声音了。我只是完全安静下来,没有声音播放给这个人。

我认为最好把全班都贴出来,因为这样更容易理解所有内容。

public class SkypeSystemAudio
{
    public NAudio.Wave.WasapiLoopbackCapture capture;
    NAudio.CoreAudioApi.MMDevice device;
    NAudio.Wave.WaveFileWriter writer;
    private Call CurrentCall = null;
    private Skype SkypeApplet;
    private const int SkypeProtocol = 9;
    private bool IsRecording = false;
    public string tempfilepath = System.IO.Directory.GetCurrentDirectory() + @"\temp.wav";
    #region Public
    public void Initialize()
    {
        device = NAudio.Wave.WasapiLoopbackCapture.GetDefaultLoopbackCaptureDevice();
        Init();
    }
    public void Initialize(NAudio.CoreAudioApi.MMDevice device)
    {
        this.device = device;
        Init();
    }
    public void StartRecording()
    {
        capture.StartRecording();
        if (CurrentCall != null)
        {

            CurrentCall.set_OutputDevice(TCallIoDeviceType.callIoDeviceTypeFile, tempfilepath);
            IsRecording = true;
        }

    }
    public void StopRecording()
    {
        capture.StopRecording();
        if (CurrentCall != null)
        {

            CurrentCall.set_OutputDevice(TCallIoDeviceType.callIoDeviceTypeFile, "");

        }
    }
    #endregion


    private void Init()
    {
        capture = new WasapiLoopbackCapture(device);
        capture.ShareMode = NAudio.CoreAudioApi.AudioClientShareMode.Shared;
        capture.DataAvailable += capture_DataAvailable;
        capture.RecordingStopped += capture_RecordingStopped;

        WaveFormat format = new WaveFormat(16000, 1); // skype wants 16 Bit samples, 16khz, mono WAV file
        //tried using the standard waveformat in the device object too. Didn't work though.

        writer = new WaveFileWriter(tempfilepath, format );

        SkypeApplet = new Skype();
        SkypeApplet.Attach(SkypeProtocol, true);
        SkypeApplet.CallStatus += SkypeApplet_CallStatus;

    }

    void SkypeApplet_CallStatus(Call pCall, TCallStatus Status)
    {
        if (Status == TCallStatus.clsRinging)
        {
            CurrentCall = pCall;
            pCall.Answer();
        }
    }

    void capture_DataAvailable(object sender, WaveInEventArgs e)
    {
        if (writer != null)
            writer.Write(e.Buffer, 0, e.BytesRecorded);
    }

    void capture_RecordingStopped(object sender, StoppedEventArgs e)
    {
        IsRecording = false;
    }


}

有谁知道为什么这不起作用?我不知道下一步该做什么。

任何帮助将不胜感激!

4

1 回答 1

2

我实际上做了一些类似的事情,但没有使用 Skype4COM。

我所做的就是像 Sebastian L 建议的那样使用“虚拟电缆”,这样您就可以控制进出 Skype 的内容,缺点是您需要安装虚拟电缆并配置 Skype 以使用它们。

在此处输入图像描述

在此处输入图像描述

电缆将作为标准输入/输出出现在音频设备中。

在此处输入图像描述

我用过这些电缆VACVB 电缆

希望能帮助到你。

于 2015-07-10T08:22:50.950 回答