2017-02-20 19 views
2

現在、PJSUA2で作業し始めています。私は呼び出しを受け入れるSIPクライアントを開発したいと思っています。それがコールを受け入れると、私はWAVファイルを再生し、入力をWAVファイルにも記録します。 PJSIPは私のデフォルトのオーディオデバイスを検出しませんが、とにかく使いたくないのでうまくいきますので、audDevManager()。setNullDev()でNullAudioに行きます。ここでPJSUA2 - Null-AudioでWindowsでWAVへの呼び出しを録音する

は私のコールのコードです:

class MyCall : public Call { 
public: 
AudioMediaPlayer player; 
AudioMediaRecorder recorder; 
AudioMediaRecorder recorderVerify; 

MyCall(Account &acc, int call_id = PJSUA_INVALID_ID) 
: Call(acc, call_id) 
{ } 

void MyCall::onCallState(OnCallStateParam &prm) 
{ 
    cout << "!!!!! onCallState is called !!!!!" << endl; 
    CallInfo ci = getInfo(); 
    cout << "ci.state = " << ci.state << endl; 
    if (ci.state == PJSIP_INV_STATE_DISCONNECTED) { 
     delete this; 
    } 
} 

void MyCall::onCallMediaState(OnCallMediaStateParam &prm){ 
    cout << "!!!!!  onCallMediaState is called  !!!!!" << endl; 

    try{ 
     player.createPlayer("Ring02.wav", PJMEDIA_FILE_NO_LOOP); 
     recorder.createRecorder("in.wav"); 
     recorderVerify.createRecorder("test.wav"); 
     CallInfo ci = getInfo(); 
     AudioMedia* aud_med = 0; 
     // Iterate all the call medias 
     for (unsigned i = 0; i < ci.media.size(); i++) { 
      cout << "Check audio " << i << endl; 
      if (ci.media[i].type==PJMEDIA_TYPE_AUDIO && getMedia(i)) { 
       aud_med = static_cast<AudioMedia*>(getMedia(i)); 
       break; 
      } 
     } 
     if (aud_med != 0){ 
      cout << "Send stuff to media" << endl; 

      // Connect the call audio media to sound device 
      AudDevManager& mgr = Endpoint::instance().audDevManager(); 
      player.startTransmit(*aud_med); 
      aud_med->startTransmit(recorder); 
      player.startTransmit(recorderVerify); 
     } 

    } catch (Error& err) { 
     cout << "Error when playing: " << err.info() << endl; 
    } 
} 

};

私はすでにPJSUA2 - Recording call audio to wav fileに基づいてプレーヤーとレコーダーのメンバー変数を作成しました。これで、発信者にWAVファイルを正しく再生させることができ、自分のWAVファイルをrecorderVerifyで録音することもできます。しかし、発信者からの音声は録音されませんが、生成されたWAVファイルは代わりに無音です。

私は何かを初期化する必要がありますか?あなたの助けをありがとう!

+0

何が間違っていたか分かりましたか? – Roman

+0

Unfotunately not。私はそれを動かすことはできませんでしたし、SIPを伴わなかった他のプロジェクトと一緒に続けました。しかし、あなたが何か考えているなら、私はそれに戻り、試してみたいと思います。 – Niels

答えて

1

これは単なる野生の推測です。

PJSUAは、ダイアログ内モード(wiresharkで確認できます)で最初にOKを受信した直後に2回目のINVITE要求を送信すると、onCallMediaStateが2回目に呼び出され、最初のコーデックではなく、別のgetMedia(i)オブジェクトが存在し、最初の元のオブジェクトが破棄される可能性があります。その場合、レコーダーは録音を停止し、WAVを1秒間取得します。 onCallMediaState第二のINVITE要求のための二回目呼び出されると

、あなたは

彼らはすでに作成されてきたので、スローされます
player.createPlayer("Ring02.wav", PJMEDIA_FILE_NO_LOOP); 
recorder.createRecorder("in.wav"); 
recorderVerify.createRecorder("test.wav"); 

しようとしています。私が正しいとすれば、あなたのログにはそのエラー通知が必要です。だから、セッションが再初期化される前に、したがって、あなたのWAVは、会話の第二の長いレコードの一部が含まれている、記録を継続する

aud_med->startTransmit(recorder); 

に得ることはありません。

関連する問題