在Android中使用PJSUA录制SIP通话

3
我正在开发一个带内部录音的sip应用程序。我需要在手机内部记录双方的音频。我阅读了几篇关于此事的博客和文章。我知道唯一的解决方案是使用NDK。经过努力,我将pjsip / pjsua2编译并集成到我的应用程序中,客户端注册和通话都可以正常工作。但是,无法记录通话。我尝试了pjsua的AudioMediaRecorder,但由于没有适当的文档,我什么也没明白。
@Override public void 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, options, &recorderId) 错误:只读文件系统 (status=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 字节的响应消息 200/INVITE/cseq=1 (tdta0x96976064) 发送到 UDP 218.248.233.142:5060:

1个回答

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文件夹中(您可以将其更改为任何您想要的名称)。
此外,请确保请求存储权限。

1
你救了我的命 :) 非常感谢!但是,它只记录了对方的音频,没有记录我的声音。你有关于这个的建议吗? - Ameena Shafeer
1
你需要将捕获的音频传输到媒体记录器中:MyApp.ep.audDevManager().getCaptureDevMedia().startTransmit(audioMediaRecorder) - user8127814
1
它运行得很好!现在,我遇到了一个关于外拨电话的问题。请您查看以下链接:https://stackoverflow.com/questions/57387292/pjsua2-sample-app-outgoing-calls-getting-403-forbidden-response-with-tcp-connect - Ameena Shafeer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接