2014-12-27 52 views
4

我一直在这一段时间,但没有取得任何进展。所以这是我的最后一招! 我正在尝试向Skype发送系统音频(我在耳机中听到的音频)(让我的电话中的人听到我基本听到的声音)。我想我会使用Skype4comlib和naudio来做到这一点。使用Naudio系统音频到Skype

我所做的是创建一个类,它使用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; 
    } 


} 

有没有人知道为什么这是行不通的?我不再有下一步该做什么的线索。

任何帮助将不胜感激!

+0

无法解析符号NAudio。我在哪里可以得到它? –

+1

@YuraZaletskyy http://naudio.codeplex.com/如果这就是你要求的=) – Tokfrans

+0

我编译你的课程时遇到的另一个问题是类Call和Skype。给他们的声明 –

回答

2

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

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

enter image description here

enter image description here

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

enter image description here

我已经使用了这些电缆VACVB cable

希望它能帮助。

+0

这是要走的路。谢谢! – Tokfrans

+0

很高兴帮助;) –