惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
博客园_首页
罗磊的独立博客
云风的 BLOG
云风的 BLOG
J
Java Code Geeks
Last Week in AI
Last Week in AI
D
DataBreaches.Net
Jina AI
Jina AI
博客园 - Franky
大猫的无限游戏
大猫的无限游戏
Apple Machine Learning Research
Apple Machine Learning Research
V
V2EX
D
Docker
MongoDB | Blog
MongoDB | Blog
B
Blog RSS Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
宝玉的分享
宝玉的分享
Engineering at Meta
Engineering at Meta
The Cloudflare Blog
博客园 - 三生石上(FineUI控件)
有赞技术团队
有赞技术团队
人人都是产品经理
人人都是产品经理
H
Help Net Security
T
The Blog of Author Tim Ferriss

博客园 - Mike_Zhang

使用python统计FreeSWITCH呼叫并发 从pcap文件提取sip信令文本 FreeSWITCH开启silk编码及转码 FreeSWITCH使用mod_fail2ban模块来提升安全 FreeSWITCH使用RNNoise进行实时通话降噪 使用RNNoise进行音频降噪 python3.14版本的free-threading功能体验 一种FreeSWITCH流量镜像WebSocket音频推流方案 C++使用WinHTTP访问http/https服务 cJSON静态库编译及vs2022使用示例 openssl静态库编译及vs2022使用示例 FreeSWITCH日志功能分析及apr模拟 使用pjsip封装自定义软电话sdk 使用kamailio进行分机注册及互拨 apr库编译及队列使用笔记 debian10环境安装rtpengine FreeSWITCH对接http协议的tts服务 python3解析wav文件获取dtmf值 音频文件降噪及python示例 FreeSWITCH使用soundtouch进行变声
pjsip编译、说明及vs2022使用示例
Mike_Zhang · 2024-11-12 · via 博客园 - Mike_Zhang

环境: window10_x64 & vs2022

pjsip版本: 2.14.1

之前整理过pjsip 2.10的编译及python使用示例:

今天整理下pjsip 2.14.1的编译、接口说明,以及在vs2022环境下基于 c/c++ 使用pjsua进行注册、呼叫、挂机的示例,并提供相关资源下载。

一、源码获取及编译

1. 下载pjsip源代码

也可直接从pjsip官网给的github地址下载:

2. 使用VS2022编译

 双击pjproject-vs14.sln

为了防止编译报错,首先进入这个目录:

pjproject-2.14.1\pjlib\include\pj

复制 config_site_sample.h 这个文件 config_site.h

 编译:

二、数据结构说明

这里列举下pjsua常用的数据结构。

1)pjsua_config

主要用于配置UA的回调函数。

2)pjsua_logging_config

用于配置日志属性

3)pjsua_transport_config

用于配置本地绑定的socket属性,比如监听端口等。

4)pjsua_acc_config

用于配置sip账号信息,比如用户名、密码、注册地址等。 

三、接口说明

 这里列举下pjsua常用接口。

1)pjsua_create

功能

创建pjsua实例,在调用其它函数之前需要调用该函数;

使用完毕(返回PJ_SUCCESS时),需要调用pjsua_destroy函数。

完整声明如下:

pj_status_t pjsua_create(void)

参数

返回值

  PJ_SUCCESS , 成功

  其它值 , 失败

2)pjsua_config_default

功能

用于初始化pjsua配置。

完整声明如下:

void pjsua_config_default(pjsua_config *cfg)

参数

返回值

3)pjsua_logging_config_default

功能

用于初始化pjsua的日志配置。

完整声明如下:

void pjsua_logging_config_default(pjsua_logging_config *cfg)

参数

返回值

无 

4)pjsua_init

功能

使用指定的配置初始化pjsua,所有配置参数都是可选的,如果没有指定相关配置则使用默认配置。

完整声明如下:

pj_status_t pjsua_init(const pjsua_config *ua_cfg, const pjsua_logging_config *log_cfg, const pjsua_media_config *media_cfg)

参数

ua_cfg : user agent配置
log_cfg : 日志配置
media_cfg : 媒体配置

返回值

  PJ_SUCCESS : 成功

  其它值 : 失败 

5)pjsua_transport_config_default

功能

初始化udp配置信息。

完整声明如下:

void pjsua_transport_config_default(pjsua_transport_config *cfg)

参数

返回值

6)pjsua_transport_create

功能

根据传入的配置信息创建并启动sip transport(会绑定本地sip端口,并进行socket监听)。

完整声明如下:

pj_status_t pjsua_transport_create(pjsip_transport_type_e type, const pjsua_transport_config *cfg, pjsua_transport_id *p_id)

参数

type : transport类型,可选参数有 PJSIP_TRANSPORT_UDP 、 PJSIP_TRANSPORT_TCP 、 PJSIP_TRANSPORT_TLS 等。
cfg : 需要使用的udp配置
p_id : 可选参数,用于接收transport ID

返回值

  PJ_SUCCESS : 成功

  其它值 : 失败

功能

启动pjsua实例。

完整声明如下:

pj_status_t pjsua_start(void)

参数

返回值

  PJ_SUCCESS : 成功

  其它值 : 失败

8)pjsua_acc_config_default

功能

初始化pjsua的账号信息。

完整声明如下:

void pjsua_acc_config_default(pjsua_acc_config *cfg)

参数

返回值

9)pjsua_acc_add

功能

添加pjsua账号,并进行注册。

完整声明如下:

pj_status_t pjsua_acc_add(const pjsua_acc_config *acc_cfg, pj_bool_t is_default, pjsua_acc_id *p_acc_id)

参数

acc_cfg : 账号配置信息,比如sip账号id、密码、注册地址等。
is_default : 是否是默认账户
p_acc_id : 用于接收account id数据

返回值

  PJ_SUCCESS : 成功

  其它值 : 失败

10)pjsua_call_make_call

功能

使用指定账号进行外呼,需要使用sip uri格式。

完整声明如下:

pj_status_t pjsua_call_make_call(pjsua_acc_id acc_id, const pj_str_t *dst_uri, const pjsua_call_setting *opt, void *user_data, const pjsua_msg_data *msg_data, pjsua_call_id *p_call_id)

参数

acc_id : 账号id
dst_uri : 需要外呼的sip uri,比如 sip:1000@192.168.137.100:5060
opt : 呼叫设置
user_data : 需要附加的用户数据
msg_data : INVITE请求里面扩展的header头,NULL时不设置
p_call_id : 用于接收call id的指针

返回值

  PJ_SUCCESS : 成功

  其它值 : 失败

11)pjsua_msg_data_init

功能

初始化pjsua_msg_data类型数据。

完整声明如下:

void pjsua_msg_data_init(pjsua_msg_data *msg_data)

参数

返回值

12)pjsua_call_hangup

功能

挂机操作,挂断指定呼叫。

完整声明如下:

pj_status_t pjsua_call_hangup(pjsua_call_id call_id, unsigned code, const pj_str_t *reason, const pjsua_msg_data *msg_data)

参数

call_id : 需要挂断呼叫的call id
code : 挂机sip状态码,比如 200603 等
reason : 挂机原因
msg_data : 需要添加的消息头

返回值

  PJ_SUCCESS : 成功

  其它值 : 失败

13)pjsua_call_answer

功能

完整声明如下:

pj_status_t pjsua_call_answer(pjsua_call_id call_id, unsigned code, const pj_str_t *reason, const pjsua_msg_data *msg_data)

参数

call_id : 需要接听呼叫的call id

code : sip状态码

reason : 原因

msg_data : 需要添加的消息头

返回值

  PJ_SUCCESS : 成功

  其它值 : 失败

四、基于MFC的示例

 这里基于MFC实现个简单软电话,实现注册、呼叫、挂机等基础功能。

 工程名称: pjPhone

工程目录:

示例代码:

 完整内容可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20241112 获取。

 1、添加依赖库

把编译好的lib库文件放在depends目录:

2、配置工程属性

 1)配置include目录;

完整内容可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20241112 获取。

2)配置lib库目录;

 完整内容可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20241112 获取。

3)配置链接lib库;

 完整内容可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20241112 获取。

3、编译及使用

 这里使用的是静态链链接,编译后不需要额外的dll文件。

编译后的二进制文件可直接运行。

1)注册效果

2)呼叫效果

 3)接听效果

可运行的二进制文件(pjPhone.exe)及打包的工程文件(pjPhone-vs2022.7z),可从文末提供的渠道获取。

关注微信公众号(聊聊博文,文末可扫码)后回复 20241112 获取。