2015-10-05 110 views
1

使用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文檔質量很差所以沒有任何人有任何想法,我做錯了什麼?

回答

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; 
    } 
} 
+0

你好,親愛的,你可以讓我告訴我如何在目的地傳輸聲音文件。我很困惑我們應該怎樣的文件,因爲從http://www.pjsip.org/docs/book-latest/html/media.html我可以看到有可能做到我需要的一樣。 我需要做的是:當呼叫者按住按鈕時,我需要打你的電話。 –

1

我有同樣的問題,同時通過JNI調用PJ。在我的情況下,我忘記關閉錄音機。如果看起來接近documentation,則表示除非關閉錄音機,否則無法播放wav文件。所以在你停止傳輸後,不要忘記刪除記錄器。

0

你在做錯事情正在等待onCallMediaState的線程。爲了進一步處理這個調用,這個線程必須繼續運行。所以,你創建錄音機,等待(沒有任何反應,所以你什麼都不錄),關閉錄音機,繼續通話。所以沒有記錄。它與範圍無關,因爲在你的案例中,記錄器在超出範圍時已經完成了他的工作。

您需要做的主要事情的確不是等待onCallMediaState的線程,讓通話繼續,並在通話被破壞時銷燬錄音機。如果發生這種情況,您需要從SipCall::onCallMediaState中獲取錄像機聲明,當然,或者您所說的錄像機在完成任務之前會被破壞。