使用 PJSUA 在 android 中录制 sip 通话
Recording sip calls in android with PJSUA
我正在开发一个带有内部录音的 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)
我的电话:onCallMediaState:
pjsua_aud.c ...正在创建记录器 myfilename.wav..
pjsua_aud.c ....无法打开文件进行记录:Read-only 文件系统 [status=120030]
media.cpp ...pjsua_recorder_create(&pj_name, enc_type, NULL, -1, options, &recorderId) 错误:Read-only 文件系统(status=120030) [../src/pjsua2/media.cpp:443]
连接媒体端口失败标题:pjsua_recorder_create(&pj_name, enc_type, NULL, -1, options, &recorderId)
代码:120030
描述:Read-only文件系统
位置:../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:
您应该为保存录音的位置指定一个确切的文件夹和文件,类似这样。
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 文件夹下的根文件夹中(您可以将其更改为任何您想要的)。
此外,请确保您请求存储权限。
我正在开发一个带有内部录音的 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)
我的电话:onCallMediaState:
pjsua_aud.c ...正在创建记录器 myfilename.wav..
pjsua_aud.c ....无法打开文件进行记录:Read-only 文件系统 [status=120030]
media.cpp ...pjsua_recorder_create(&pj_name, enc_type, NULL, -1, options, &recorderId) 错误:Read-only 文件系统(status=120030) [../src/pjsua2/media.cpp:443]
连接媒体端口失败标题:pjsua_recorder_create(&pj_name, enc_type, NULL, -1, options, &recorderId)
代码:120030
描述:Read-only文件系统
位置:../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:
您应该为保存录音的位置指定一个确切的文件夹和文件,类似这样。
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 文件夹下的根文件夹中(您可以将其更改为任何您想要的)。
此外,请确保您请求存储权限。