4

私はしばらくこれに取り組んできましたが、進歩はありませんでした。だからこれは私の最後の手段です!システム オーディオ (ヘッドフォンで聞こえるオーディオ) を Skype に送信しようとしています (通話中の人に基本的に聞こえるものを聞かせます)。そして、Skype4comlib と naudio を使用してこれを行うと考えました。

私が行ったことは、 を使用するクラスを作成し、WasapiLoopbackCapture一時WaveFileWriterデータを .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 を使用していません。

私がしたことは、セバスチャン L が提案したように「仮想ケーブル」を使用することでした。この方法で、Skype に出入りするものを制御できます。欠点は、仮想ケーブルをインストールし、それらを使用するように Skype を構成する必要があることです。

ここに画像の説明を入力

ここに画像の説明を入力

ケーブルは、標準の入力/出力としてオーディオ デバイスに表示されます。

ここに画像の説明を入力

これらのケーブルを使用しましたVACおよびVB ケーブル

それが役に立てば幸い。

于 2015-07-10T08:22:50.950 に答える