VOIP/SIP新手呼叫时遇pjmedia_endpt_create_base_sdp断言失败求助
SIP呼叫报错:Invalid address family 问题排查与解决
我是一名刚接触VOIP和SIP的大学生,已经完成SIP服务器搭建并成功注册账号,但发起呼叫时触发以下错误:
10:43:18.461 pjsua_acc.c ..Acc 0: Registration sent
10:43:18.461 pjsua_call.c Making call with acc #0 to sip:132@172.10.0.151
10:43:18.461 pjsua_media.c .Call 0: initializing media..
softphone: ../src/pjmedia/endpoint.c:935: pjmedia_endpt_create_base_sdp: Assertion `!"Invalid address family"' failed. Aborted
因为之前遇到权限错误和无音频设备错误,我在代码里禁用了音频,怀疑问题出在这段代码:
// Make a call with audio disabled CallOpParam prm(true); // Pass true to indicate this is an outgoing call prm.opt.audioCount = 0; // Disable audio // Debugging info for call setup try { MyCall *call = new MyCall(acc); call->makeCall("sip:133@192.168.123.80", prm); cout << "*** Call setup completed ***" << endl; } catch (Error &err) { cout << "Error during call setup: " << err.info() << endl; }
问题原因
仅设置audioCount=0禁用音频时,PJSUA仍会尝试初始化媒体会话并生成SDP,但此时未正确绑定有效地址,导致地址族校验断言失败。
修复方案
1. 完全禁用媒体会话
在CallOpParam配置中添加PJSUA_CALL_NO_MEDIA标志,跳过所有媒体初始化逻辑:
prm.opt.videoCount = 0; // 同时禁用视频 prm.opt.flag |= PJSUA_CALL_NO_MEDIA; // 强制不创建媒体流
2. 全局配置禁用媒体
如果你的软phone不需要任何媒体功能,可在端点初始化时全局配置:
EpConfig ep_cfg; ep_cfg.mediaConfig.audioCount = 0; ep_cfg.mediaConfig.videoCount = 0; ep_cfg.uaConfig.ipv6Enabled = false; // 匹配服务器IP协议(IPv4/IPv6)
3. 修复后的完整代码
// Make a call with audio disabled CallOpParam prm(true); // Pass true to indicate this is an outgoing call prm.opt.audioCount = 0; // Disable audio prm.opt.videoCount = 0; // Disable video prm.opt.flag |= PJSUA_CALL_NO_MEDIA; // Skip media initialization entirely // Debugging info for call setup try { MyCall *call = new MyCall(acc); call->makeCall("sip:133@192.168.123.80", prm); cout << "*** Call setup completed ***" << endl; } catch (Error &err) { cout << "Error during call setup: " << err.info() << endl; }
内容的提问来源于stack exchange,提问作者Sumit Rana
相关产品推荐
相关产品推荐

