PJSUA2 - 将音频录制为wav文件

问题描述:

使用PJSUA2我试图将来电直接录制到wav文件,但无法听到wav文件中的任何音频。下面PJSUA2 - 将音频录制为wav文件

代码:

void SipCall::onCallMediaState(pj::OnCallMediaStateParam& /*prm*/) 
{ 
    pj::CallInfo call_info = getInfo(); 
    pj::AudioMedia* audio_media = 0; 

    for (unsigned int i = 0; i < call_info.media.size(); ++i) { 
     if (call_info.media[i].type == PJMEDIA_TYPE_AUDIO) { 
      audio_media = static_cast<pj::AudioMedia*>(getMedia(i)); 
      break; 
     } 
    } 

    if (audio_media != 0) { 
      try {  
       pj::AudioMediaRecorder recorder; 
       recorder.createRecorder("file.wav"); 
       audio_media->startTransmit(recorder); 
       pj_thread_sleep(5000); 
       audio_media->stopTransmit(recorder); 
      } 
      catch (pj::Error& err) { 
       qWarning("[SipAccount::onIncomingCall] : Failed to record call to %s. Error = %s", "file.wav", err.info().data());  
      }   
     } 
} 

有一个关于PJSUA2文档质量很差所以没有任何人有任何想法,我做错了什么?

有一个问题,因为AudioMediaRecorder对象在创建之后就超出了范围。如果你让它成为这个班级的成员,那么下面的内容将会起作用。

void SipCall::onCallMediaState(pj::OnCallMediaStateParam& /*prm*/) 
{ 
    pj::CallInfo call_info = getInfo(); 
    pj::AudioMedia* audio_media = 0; 
    for (unsigned int i = 0; i < call_info.media.size(); ++i) { 
     if (call_info.media[i].type == PJMEDIA_TYPE_AUDIO) { 
     audio_media = static_cast<pj::AudioMedia*>(getMedia(i)); 
     break; 
     } 
    } 

    if (audio_media != 0) { 
     try {  
      recorder.createRecorder("file.wav"); 
      audio_media->startTransmit(recorder); 
     } 
     catch (pj::Error& err) { 
      qWarning("[SipAccount::onIncomingCall] : Failed to record call to %s. Error = %s", "file.wav", err.info().data());  
     }   
    } 
} 

做任何必要的清理下onCallState()方法:

void SipCall::onCallState(pj::OnCallStateParam& prm) 
{ 
    int i = prm.e.type; 
    i = 0; 

    pj::CallInfo call_info = getInfo(); 

    switch (call_info.state) { 
     case PJSIP_INV_STATE_DISCONNECTED: 
      // Add clean up code here 
      delete this;   
      break; 
     case PJSIP_INV_STATE_CONFIRMED:       
      break; 
     default: 
      break; 
    } 
} 
+0

你好,亲爱的,你可以让我告诉我如何在目的地传输声音文件。我很困惑我们应该怎样的文件,因为从http://www.pjsip.org/docs/book-latest/html/media.html我可以看到有可能做到我需要的一样。 我需要做的是:当呼叫者按住按钮时,我需要打你的电话。 –

我有同样的问题,同时通过JNI调用PJ。在我的情况下,我忘记关闭录音机。如果看起来接近documentation,则表示除非关闭录音机,否则无法播放wav文件。所以在你停止传输后,不要忘记删除记录器。

你在做错事情正在等待onCallMediaState的线程。为了进一步处理这个调用,这个线程必须继续运行。所以,你创建录音机,等待(没有任何反应,所以你什么都不录),关闭录音机,继续通话。所以没有记录。它与范围无关,因为在你的案例中,记录器在超出范围时已经完成了他的工作。

您需要做的主要事情的确不是等待onCallMediaState的线程,让通话继续,并在通话被破坏时销毁录音机。如果发生这种情况,您需要从SipCall::onCallMediaState中获取录像机声明,当然,或者您所说的录像机在完成任务之前会被破坏。