2014-12-27 97 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

很高興幫助;) –