使用PJSUA在android中记录Sip呼叫

时间:2019-08-05 12:45:34

标签: android sip pjsip pjsua2

我正在开发带有内部记录的Sip应用程序。我需要将双方音频都记录在移动设备内部。

阅读与之相关的多个博客和文章。我知道唯一的解决方案是使用NDK。经过很大的努力,我将pjsip / pjsua2编译并集成到了我的应用程序中,使用该客户端注册和调用可以正常工作。但是,无法记录通话。我曾经尝试过pjsua的AudioMediaRecorder,但由于没有适当的文档,所以我什么都不懂。

@Override

公共无效onCallMediaState(OnCallMediaStateParam prm)

{

Log.i(TAG, "onCallMediaState: ");
CallInfo ci;
try {
    ci = getInfo();
} catch (Exception e) {
    return;
}

CallMediaInfoVector cmiv = ci.getMedia();
for (int i = 0; i < cmiv.size(); i++) {
    CallMediaInfo cmi = cmiv.get(i);
    if (cmi.getType() == pjmedia_type.PJMEDIA_TYPE_AUDIO && (cmi.getStatus() == pjsua_call_media_status.PJSUA_CALL_MEDIA_ACTIVE)) {
        try {

            am = getAudioMedia(i);
            audioMediaRecorder.createRecorder("callaudio.wav");
            am.startTransmit(audioMediaRecorder);

            MyApp.ep.audDevManager().getCaptureDevMedia().
                    startTransmit(am);
            am.startTransmit(MyApp.ep.audDevManager().
                    getPlaybackDevMedia());
        } catch (Exception e) {
            System.out.println("Failed connecting media ports" +
                    e.getMessage());
            continue;
        }
    }
}
MyApp.observer.notifyCallMediaState(this);

}

此myaudiofile.wav文件保存在哪里?我怎么能得到它?

上面的代码产生这样的日志-

pjsua_media.c ...电话1:更新媒体。

pjsua_media.c .....媒体流call01:0被破坏

pjsua_aud.c ....音频通道更新..

strm0x953fe014 ..... VAD暂时禁用

strm0x953fe014 .....编码器流已启动

strm0x953fe014 .....解码器流已启动

pjsua_media.c ....音频已更新,流#0:PCMA(sendrecv)

MyCall:onCallMediaState:

pjsua_aud.c ...创建记录器myfilename.wav ..

pjsua_aud.c...。无法打开文件进行记录:只读文件系统[status = 120030]

media.cpp ... pjsua_recorder_create(&pj_name,enc_type,NULL,-1,选项,&recorderId)错误:只读文件系统(状态= 120030)[../src/pjsua2/media.cpp:443]

连接媒体端口失败标题:pjsua_recorder_create(&pj_name,enc_type,NULL,-1,options,&recorderId)

代码:120030

说明:只读文件系统

位置:../ src / pjsua2 / media.cpp:443 15:52:01.458
pjsua_core.c .... TX 940字节对UDP 218.248.233.142:5060的响应msg 200 / INVITE / cseq = 1(tdta0x96976064):

1 个答案:

答案 0 :(得分:2)

您应该为保存录音的位置指定一个确切的文件夹和文件。

 File root = Environment.getExternalStorageDirectory();

 // Specify a directory for your recordings
 File dir = new File(root.getAbsolutePath() + File.separator + "PJSIP-Recordings");

 // Ensure that the directory exists
 dir.mkdirs();

 audioMediaRecorder.createRecorder(dir.getAbsolutePath() + File.separator + "callaudio.wav"); 

这将保存在PJSIP-Recordings文件夹下的根文件夹中(您可以将其更改为所需的任何名称)。

此外,请确保您请求存储权限。