Windows | PJSIP使用说明 | 北邮计算机网络实验课作业 | 视频通话

官网

首页

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就可以打通了,是不是听到了滴滴滴滴的声音!

PJSUA是一款强大的开源多媒体通信库,主要用于实时音视频应用程序的开发,包括VoIP电话、视频会议等。要在PJSUA Demos中同时显示双方的视频,通常需要设置多方会话并配置相应的视屏窗口。 以下是基本步骤: 1. **设置多方会话**: - 在你的应用代码中,创建一个支持多方通话的会话(Session),而不是简单的点对点连接。 ```cpp pjmedia_channel* channel = pjmedia_create_audio_channel(transport); pjmedia_session* session = pjmedia_endpt_create_session(endpt, PJMEDIA_SESSION_TYPE_RTP); pjmedia_multiconnection* conn = pjmedia_conn_connect(session, "multiconnect"); ``` 2. **添加视频媒体端点**: - 添加视频设备,并将其关联到session。 ```cpp pjmedia_codec_vid inst; inst.id = pjmedia_codec_get_default_encoder(PJ_CODEC_VID_H264); // 或其他编码器 pjmedia_endpt_register_codecs(endpt, &inst); pjmedia_vid_dev_info devinfo; pjmedia_device_query(viddev_index, &devinfo); pjmedia_endpoint_add_video_device(session, devinfo.index); ``` 3. **视频渲染**: - 创建两个或更多的VideoWindow实例,分别代表被呼叫者和呼叫者,然后在接收到视频流时更新它们。 ```cpp pjmedia_window_cfg cfg; pjmedia_window* caller_win = pjmedia_window_create(pjmedia_endpt_get_media_toolbox(endpt), &cfg); pjmedia_window* callee_win = pjmedia_window_create(...); // 类似地创建另一个窗口 pjmedia_frame frm; while (pjmedia_stream_read(session, &frm) >= 0) { if (pjmedia_frame_is_video(&frm)) { pjmedia_window_update(caller_win, &frm); pjmedia_window_update(callee_win, &frm); } } pjmedia_window_destroy(caller_win); pjmedia_window_destroy(callee_win); ``` 4. **处理媒体协商**: - 调整媒体配置以适应视频交互,比如分辨率、码率等,这通常在`pjmedia_config_set()`函数中完成。
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值