android - 使用 PJSUA 在 android 中记录 sip 调用

标签 android sip pjsip pjsua2

我正在开发一个带有内部录音的 sip 应用程序。我需要双方的音频在移动设备内部进行录音。

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

@覆盖

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 ....音频 channel 更新..

strm0x953fe014 .....VAD 暂时禁用

strm0x953fe014 .....编码流开始

strm0x953fe014 .....解码流开始

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

我的电话: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:

最佳答案

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

 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 文件夹下的根文件夹中(您可以将其更改为任何您想要的)。

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

关于android - 使用 PJSUA 在 android 中记录 sip 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57358888/

相关文章:

java - OpenCV 寻找轮廓的角点

java - 如何使复选框/ slider 持久化?

android - 如何在pjsip中获取PJSUA_CALL_MEDIA_REMOTE_HOLD

google-chrome - Asterisk 提供 "Strict RTP learning"消息,但Chrome WebRTC没有音频,但可在Firefox中使用

centos - Asterisk 崩溃 * 检测到 glibc */usr/sbin/asterisk : malloc(): memory corruptio

iphone - iOS5 的 PJSIP 编译错误

android - 需要 android 的 PJSIP 示例

java - A Switch Java 问题 : case expressions must be constant expressions

java - Android USB 主机异步批量传输示例

sip - 如何查看kamailio服务器中的注册用户?