首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PJSUA2 -将呼叫音频记录到wav文件

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

Stack Overflow用户
提问于 2015-10-05 13:02:25
回答 3查看 2.4K关注 0票数 1

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

代码如下:

代码语言:javascript
复制
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上的文档很糟糕,所以有人知道我做错了什么吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-22 09:12:41

出现了一个问题,因为AudioMediaRecorder对象在创建之后就超出了作用域。如果您使它成为类的成员,下面的内容将有效。

代码语言:javascript
复制
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()方法中进行任何必要的清理:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-05-11 08:54:23

在通过JNI给PJ打电话的时候,我也遇到了同样的问题。在我的情况下,我忘了关录音机。如果您在文档中查看,它会说,除非您关闭录音机,否则无法播放wav文件。所以停止传输后,别忘了删除录音机。

票数 1
EN

Stack Overflow用户

发布于 2017-11-24 12:32:21

你所做的错事是在onCallMediaState的线程中等待。为了进一步处理调用,这个线程必须继续运行。所以,创建记录器,等待(而什么也不发生,所以你什么也不记录),关闭记录器,呼叫继续。所以没有任何记录。这与范围无关,因为在你的情况下,记录器在超出范围时没有完成任何记录工作。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32949357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档