簡體   English   中英

PJSUA2-將通話音頻錄制到WAV文件

[英]PJSUA2 - Recording call audio to wav file

我正在嘗試使用PJSUA2將來電直接記錄到wav文件中,但是聽不到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;
   }
}

通過JNI調用PJ時,我遇到了同樣的問題。 就我而言,我忘了關閉錄音機了。 如果您仔細閱讀文檔中的內容 ,它表示除非關閉記錄器,否則無法播放wav文件。 因此,停止傳輸后,請不要忘記刪除錄像機。

您做錯了的事情是在onCallMediaState的線程中等待。 為了進一步處理該調用,該線程必須繼續運行。 因此,您創建了記錄器,等待(什么都沒發生,因此您什么也不記錄),關閉記錄器,繼續通話。 因此,沒有任何記錄。 它與范圍無關,因為在您的情況下,記錄儀在超出范圍時已經不做任何記錄。

實際上,您需要做的主要事情是不要在onCallMediaState的線程中等待,讓調用繼續進行,並在銷毀呼叫時銷毀記錄器。 為此,您當然需要從SipCall::onCallMediaState獲取記錄器聲明,或者正如您所說的,記錄器在完成其工作之前將被銷毀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM