PJSUA2 - 将呼叫音频录制到wav文件

时间:2015-10-05 13:02:26

标签: c++ pjsip

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

以下代码:

UPDATE table SET dateColumn = STR_TO_DATE(dateColumn, '%d-%m-%Y');

关于PJSUA2的文档很差,所以有谁知道我做错了什么?

3 个答案:

答案 0 :(得分:1)

出现问题,因为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;
   }
}

答案 1 :(得分:1)

我在通过JNI致电PJ时遇到了同样的问题。在我的情况下,我忘了关闭录音机。如果你在documentation附近看,它表示你不能播放wav文件,除非你关闭录音机。因此,在停止传输后,请不要忘记删除录像机。

答案 2 :(得分:0)

你做错的事是在onCallMediaState的线程中等待。为了进一步处理该调用,该线程必须继续运行。所以,你创建记录器,等待(没有任何反应,所以你什么也没记录),关闭记录器,呼叫继续。所以没有记录任何内容。它与范围无关,因为在你的情况下,记录器已经完成了他的工作,当它超出范围时没有记录任何东西。

你需要做的主要事情是不要在onCallMediaState的线程中等待,让呼叫继续,并在呼叫被破坏时销毁记录器。要做到这一点,你需要从SipCall::onCallMediaState获取录音机声明,当然或者正如你所说的录音机在它完成任务之前就会被摧毁。