文章目录
官网
首页
PJSIP - Open Source SIP, Media, and NAT Traversal Library
使用说明文档
pjsip Open source SIP, media, and NAT traversal stacks/libraries for smartphones
下载地址
Download PJSIP - Open Source SIP, Media, and NAT Traversal library
- Windows用户必须下载.zip格式的源码
- Unix与Max OS用户必须下载 .bz2 格式的源码
实验环境
VS2015 win32平台
windows10
SDL2-2.0.10
ffmpeg-4.2.1-win32-dev
ffmpeg-4.2.1-win32-shared
Direct X 12
Qt 5.6.3
安装
进入PJSIP的说明文档,很醒目的大字,点进去即可
选择合适的开发平台,这儿我使用Windows平台
大致浏览以下对应开发平台说明文档的目录,在Requirements小节,会发现需要VS和DirectX,还有其他Tools、SDK之类的,可以边下载安装,边看这个文档。
Build Preparation for Windows
下载源码,点击“Get the source code”
点击连接
下载Zip格式文件
解压文件,记一下解压目录
Build Preparation for Windows第二步create a config_site.h
进入指定目录../pjlib/include/pj/
,创建config_site.h即可(VS必须手动创建),这个文件可以为空,为空是使用默认值。干脆把config_site_simple.h复制一份重命名为config_site.h
Requirements
Tools and SDKs
- 需要VS,我下载安装了VS2015社区版
- 需要DirectX SDK,我查了以下自己电脑DirectX的版本,检索dxdiag并运行,在系统信息框里可以看到自己的DirectX版本,这里我的版本是12,不知道对PJSIP有没有影响:
Build and run
在VS2015中 文件-打开-‘项目/解决方案’选择之前解压目录中的pjproject-vs14.sln
发现项目不兼容,点确定
点安装
关闭VS后,又尴尬地等待VS更新,
重新打开VS以及项目
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019111510343286.png?x-oss-process=image/wate rmark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N0b25lX2ZhbGw=,size_16,color_FFFFFF,t_70)
不知道怎么处理,那就暂时不处理吧23333
找到pjsua,右键pjsua将其设置为启动项;右键
编译项目build,或者可以直接点生成解决方案会生成exe文件,可以选择debug或者release
如果是编译的话会直接跳出命令行框框,如果是生成解决方案的话,就是去bin目录下找相应的文件。
与服务器通信
实验课老师服务器的网路不支持TCP???加上--no-tcp
打开cmd,进入目录
d:
cd Program Files\ExperimentForNetwork\pjproject-2.9\pjsip-apps\bin
pjsua-i386-Win32-vc14-Release.exe --no-tcp
按m
sip:12345@10.105.240.15
注册
首先根据语音提示进行1注册,要在嘀声后把本组同学的学号依次输入,学号之间用号分开,最后用#结束。例如本组有三个同学,学号分别是12345、67890、23456,则需依次如输入123456789023456#。输入完成后IVR会提示你的组号(组号是IVR自动生成的)然后IVR会提示嘀声后输入本组的密码。请牢记组号和密码,后续的操作和实验报告都会需要。
在PJSIP中发送DTMF的命令是,上例中的操作如下。
d:
cd Program Files\ExperimentForNetwork\pjproject-2.9\pjsip-apps\bin
pjsua-i386-Win32-vc14-Release.exe --no-tcp
(与服务器通信)
m
sip:12345@10.105.240.15
选择注册,输入1:
*
1
根据提示输入学号:
*
学号#
询问你学号是否输入正确,正确按1,错误按0
*
1
会告诉你组号,根据提示输入密码:
*
1234#
最后IVR会提示注册成功。然后挂机。
我的组号:578
详细步骤记录:
选择注册,输入1:
*
1
根据提示输入学号:
*
学号#
询问你学号是否输入正确,正确按1,错误按0
*
1
组号578
会告诉你组号,根据提示输入密码:
*
1234#
会再次让你输入密码
登录
重新拨通IVR后根据语音提示选择2登录,IVR会提示在嘀声后输入“组号”,请输入注册是获得的组号,然后IVR会提示嘀声后输入“密码”。完成登录后可以进行1录音及回放、2回放录音、3查询本组同学的学号三项操作。
d:
cd Program Files\ExperimentForNetwork\pjproject-2.9\pjsip-apps\bin
pjsua-i386-Win32-vc14-Release.exe --no-tcp
(与服务器通信)
m
sip:12345@10.105.240.15
选择登录
*
2
输入组号
*
578#
输入密码
*
123456#
登录成功后
1录音及回放 ;2 回放录音 ;3 查询本组同学的学号
详细步骤记录:
登录
*
2
输入组号
*
578#
输入密码
*
1234#
查询学号
d:
cd Program Files\ExperimentForNetwork\pjproject-2.9\pjsip-apps\bin
pjsua-i386-Win32-vc14-Release.exe --no-tcp
(与服务器通信)
m
sip:12345@10.105.240.15
选择登录
*
2
输入组号
*
578#
输入密码
*
1234#
登录成功后
1录音及回放 ;2 回放录音 ;3 查询本组同学的学号
*
3
录音及回放
d:
cd Program Files\ExperimentForNetwork\pjproject-2.9\pjsip-apps\bin
pjsua-i386-Win32-vc14-Release.exe --no-tcp
(与服务器通信)
m
sip:12345@10.105.240.15
选择登录
*
2
输入组号
*
578#
输入密码
*
1234#
登录成功后
1录音及回放 ;2 回放录音 ;3 查询本组同学的学号
*
1
*
#
最后需要#
结束
回放录音
d:
cd Program Files\ExperimentForNetwork\pjproject-2.9\pjsip-apps\bin
pjsua-i386-Win32-vc14-Release.exe --no-tcp
(与服务器通信)
m
sip:12345@10.105.240.15
选择登录
*
2
输入组号
*
578#
输入密码
*
1234#
登录成功后
1录音及回放 ;2 回放录音 ;3 查询本组同学的学号
*
2
*
#
Video support
Additional requirements
下载SDL 2.0:官网
下载最新的FFmpeg Builds,shared与dev版本均要下载:官网
这里我选择编译平台是win32
很多人说下不到。(百度云,换一下点)
https://pan点baidu点com/s/1AseWtxmXWTj2dqX80N5lUg
6reo
Additional configuration
参考win10 x64 VS2017 PJSIP 视频通话编译流程
将FFmpeg与SDL解压到pjproject-2.9目录下
其中ffmpeg的include和lib目录应该是在pjproject-2.9/ffmpeg-4.2.1-win32-dev
下
将ffmpeg-4.2.1-win32-shared\bin
其中的bin目录下全部dll文件复制到C:\Windows\SysWOW64目录下。
D:\pjproject-2.9\ffmpeg-4.2.1-win32-dev\include\libavcodec目录下的avcodec.h头文件,添加一行
#define FF_INPUT_BUFFER_PADDING_SIZE 32
其中SDL的include和lib目录应该是在pjproject-2.9\SDL2-2.0.10
下。
将D:\Program Files\ExperimentForNetwork\pjproject-2.9\SDL2-2.0.10\lib\x86
其中的全部dll文件复制到C:\Windows\SysWOW64目录下。
在pjmedia、pjmedia-codec、pjmedia-videodev、pjsua、pjsystest、pjmedia_test、samples这几个工程中中添加ffmpeg、SDL的include和lib路径。
右键点击工程->属性->配置属性->C/C++->常规->附加包含目录
中添加include路径;
D:\Program Files\ExperimentForNetwork\pjproject-2.9\ffmpeg-4.2.1-win32-dev\include
D:\Program Files\ExperimentForNetwork\pjproject-2.9\SDL2-2.0.10\include
右键点击工程->属性->配置属性->链接器->常规->附加库目录
中添加lib路径。
D:\Program Files\ExperimentForNetwork\pjproject-2.9\SDL2-2.0.10\lib\x86
D:\Program Files\ExperimentForNetwork\pjproject-2.9\ffmpeg-4.2.1-win32-dev\lib
在pjsua项目的工程->属性->链接器->命令行->其他选项
中添加/SAFESEH:NO
,来忽略一个错误警告:error LNK2026 模块对于 SAFESEH 映像是不安全的
6>LINK : fatal error LNK1104: 无法打开文件“avutil.lib”
8>LINK : fatal error LNK1104: 无法打开文件“avcodec.lib”
9>LINK : fatal error LNK1104: 无法打开文件“avcodec.lib”
添加lib依赖项
ffmpeg
avcodec.lib
avdevice.lib
avfilter.lib
avformat.lib
avutil.lib
postproc.lib
swresample.lib
swscale.lib
SDL
SDL2.lib
配置config_site.h
#define PJMEDIA_HAS_VIDEO 1
#define PJMEDIA_VIDEO_DEV_HAS_SDL 1
#define PJMEDIA_VIDEO_DEV_HAS_DSHOW 1
#define PJMEDIA_HAS_FFMPEG 1
同样的操作对debug来一遍生成pjsip的lib文件供视频用
下载QT
Qt Downloads
点击安装,注册用户后,选择组件下一步直到安装完成
安装过程经常发生这种错误,是因为杀毒软件拦截了安装行为。
将QT目录添加到环境变量中
在命令行中,进入到pjproject-2.9\pjsip-apps\src\vidgui目录下,运行命令qmake -tp vc。
d:
cd Program Files\ExperimentForNetwork\pjproject-2.9\pjsip-apps\src\vidgui
qmake -tp vc
报错
D:\Program Files\ExperimentForNetwork\pjproject-2.9\pjsip-apps\src\vidgui>qmake -tp vc
WARNING: TARGET is empty
WARNING: TARGET is empty
WARNING: TARGET is empty
在同一目录下vidgui.pro文件中第30行“target =”后面添加一个文件名,编译成功后将会生成一个vcxproj类型的文件。
在vidgui.pro文件中追加一行:QT += core gui widgets
,可以解决因为Qt4,Qt5之间的版本兼容问题带来的找不到某些头文件。
再将vidgui.pro文件中的11行的debug改成release,12和14行的vc8改成vc14。这是因为vs2015使用的是vc14,要成功编译就要改依赖库。
修改后再次运行qmake -tp vc
成功后生成下列文件。
将FFmpeg与SDL解压到pjproject-2.9目录下
其中ffmpeg的include和lib目录应该是在pjproject-2.9/ffmpeg-4.2.1-win32-dev
下
将ffmpeg-4.2.1-win32-shared\bin
其中的bin目录下全部dll文件复制到C:\Windows\SysWOW64目录下。
D:\pjproject-2.9\ffmpeg-4.2.1-win32-dev\include\libavcodec目录下的avcodec.h头文件,添加一行
#define FF_INPUT_BUFFER_PADDING_SIZE 32
将
将配置改成Release
其中SDL的include和lib目录应该是在pjproject-2.9\SDL2-2.0.10
下。
将D:\Program Files\ExperimentForNetwork\pjproject-2.9\SDL2-2.0.10\lib\x86
其中的全部dll文件复制到C:\Windows\SysWOW64目录下。
在pjmedia、pjmedia-codec、pjmedia-videodev、pjsua这几个工程中中添加ffmpeg、SDL的include和lib路径。
右键点击工程->属性->配置属性->C/C++->常规->附加包含目录
中添加include路径;
D:\Program Files\ExperimentForNetwork\pjproject-2.9\ffmpeg-4.2.1-win32-dev\include
D:\Program Files\ExperimentForNetwork\pjproject-2.9\SDL2-2.0.10\include
右键点击工程->属性->配置属性->链接器->常规->附加库目录
中添加lib路径。
D:\Program Files\ExperimentForNetwork\pjproject-2.9\SDL2-2.0.10\lib\x86
D:\Program Files\ExperimentForNetwork\pjproject-2.9\ffmpeg-4.2.1-win32-dev\lib
在pjsua项目的工程->属性->链接器->命令行->其他选项
中添加/SAFESEH:NO
,来忽略一个错误警告:error LNK2026 模块对于 SAFESEH 映像是不安全的
将pjproject-2.9\pjsip-apps\src\vidgui
中的vidwin.cpp
中37行的setAttribute(Qt::WA_PaintOutsidePaintEvent);
注释掉。这句是针对directX11版本的。将vidgui.cpp
中296行的toAscii().data()
改成toLatin1()
。这是因为在Qt5中,Qstring对象没有toAscii()
方法。
编译
1>------ 已启动生成: 项目: vcxproj, 配置: Release Win32 ------
1>LINK : warning LNK4098: 默认库“LIBCMTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
1>vidgui.obj : error LNK2019: 无法解析的外部符号 _pjsua_vid_preview_param_default,该符号在函数 "public: void __thiscall MainWin::preview(void)" (?preview@MainWin@@QAEXXZ) 中被引用
1>vidgui.obj : error LNK2019: 无法解析的外部符号 _pjsua_vid_preview_start,该符号在函数 "public: void __thiscall MainWin::preview(void)" (?preview@MainWin@@QAEXXZ) 中被引用
1>vidgui.obj : error LNK2019: 无法解析的外部符号 _pjsua_vid_preview_get_win,该符号在函数 "public: void __thiscall MainWin::preview(void)" (?preview@MainWin@@QAEXXZ) 中被引用
1>vidgui.obj : error LNK2019: 无法解析的外部符号 _pjsua_vid_preview_stop,该符号在函数 "public: void __thiscall MainWin::preview(void)" (?preview@MainWin@@QAEXXZ) 中被引用
1>vidgui.obj : error LNK2019: 无法解析的外部符号 _pjsua_vid_win_get_info,该符号在函数 "public: void __thiscall MainWin::initVideoWindow(void)" (?initVideoWindow@MainWin@@QAEXXZ) 中被引用
1>vidgui.obj : error LNK2019: 无法解析的外部符号 _SDL_GetError,该符号在函数 _main 中被引用
1>vidgui.obj : error LNK2019: 无法解析的外部符号 _SDL_InitSubSystem,该符号在函数 _main 中被引用
1>release\\vcxproj.exe : fatal error LNK1120: 7 个无法解析的外部命令
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
这里失败的原因是因为pjsua没有编译好。
ffmpeg
avcodec.lib
avdevice.lib
avfilter.lib
avformat.lib
avutil.lib
postproc.lib
swresample.lib
swscale.lib
SDL
SDL2.lib
编译
生成的可执行程序是pjproject-2.9\pjsip-apps\src\vidgui\release目录下的可执行文件。双击打开。
打通电话。因为我笔记本没有图像设备,所以打开不了摄像头。
可以考虑搭建SIP服务器,下载MiniSipServer
安装后配置系统信息
添加分机信息
分别在100号和101号客户端运行pjsua,+a
添加自己的用户信息
Your SIP URL: SIP:100@10.108.21.176
URL of the registrar:SIP:10.108.21.176
Auth Realm:myvoipapp.com
Auth Username:100
Auth Password: 100
Your SIP URL: SIP:101@10.108.21.176
URL of the registrar:SIP:10.108.21.176
Auth Realm:myvoipapp.com
Auth Username:101
Auth Password: 101
SIP对方的URL就可以打通了,是不是听到了滴滴滴滴的声音!