经验大分享:PJSUA2开发文档

简介: 经验大分享:PJSUA2开发文档

7 呼叫Calls

呼叫由Call类处理

7.1 子类化Call类

要使用Call类,应用程序应创建子类,如:

class MyCall : public Call

{

public:

MyCall(Account acc, int call_id = PJSUA_INVALID_ID)

: Call(acc, call_id)

{ }

~MyCall()

{ }

// Notification when call's state has changed.

virtual void onCallState(OnCallStateParam prm);

// Notification when call's media state has changed.

virtual void onCallMediaState(OnCallMediaStateParam prm);

};

在其子类中,应用程序可以实现呼叫回调,基本上用于处理与呼叫有关的事件,如呼叫状态更改或来电转接请求。

7.2 呼出 Making Outgoing Calls

Call call = new MyCall(acc);

CallOpParam prm(true); // Use default call settings

try {

call->makeCall(dest_uri, prm);

} catch(Error err) {

cout [ err.info() [ endl;

}

上面的代码段创建一个Call对象,并使用默认的呼叫设置启动到dest_uri的呼出。对呼叫的后续操作可以使用呼叫实例中的方法,并且将呼叫的事件报告给回调。有关回调的更多内容将稍后解释。

7.3 接收来电 Receiving Incoming Calls

来电将被报告为Account类的onIncomingCall()。必须从Account类派生一个类来处理来电。

以下是回调实现的示例代码:

void MyAccount::onIncomingCall(OnIncomingCallParam iprm)

{

Call call = new MyCall(this, iprm.callId);

CallOpParam prm;

prm.statusCode = PJSIP_SC_OK;

call->answer(prm);

}

对于来电,如以上所示,在回调函数中创建呼叫实例。应用程序应确保在呼叫生命周期内存储呼叫实例(直到呼叫断开连接)。

7.4 呼叫属性

所有呼叫属性,如状态,媒体状态,远端(远程对等体)信息等都存储为CallInfo类,可以使用Call的getInfo()方法获取。

7.5 呼叫断开

呼叫断开事件是一个特殊的事件,因为一旦报告此事件的回调返回,该调用将不再有效,并且调用对象的任何操作将引发错误异常。因此,建议删除回调中的调用对象。

Call的onCallState()方法报告呼叫断开,可以检测如下:

void MyCall::onCallState(OnCallStateParam prm)

{

CallInfo ci = getInfo();

if (ci.state == PJSIP_INV_STATE_DISCONNECTED) {

/ Delete the call /

delete this;

}

}

7.6 与通话的音频媒体工作

以下是当媒体处于活动状态时将呼叫连接到声音设备的示例代码:

void MyCall::onCallMediaState(OnCallMediaStateParam prm)

{

CallInfo ci = getInfo();

// Iterate all the call medias

for (unsigned i = 0; i < ci.media.size(); i++) {

if (ci.media【i】.type==PJMEDIA_TYPE_AUDIO getMedia(i)) {

AudioMedia aud_med = (AudioMedia )getMedia(i);

// Connect the call audio media to sound device

AudDevManager mgr = Endpoint::instance().audDevManager();

aud_med->startTransmit(mgr.getPlaybackDevMedia());

mgr.getCaptureDevMedia()//代码效果参考:http://www.zidongmutanji.com/bxxx/21252.html

.startTransmit( aud_med);

}

}

}

当音频媒体变得不活动时(例如当呼叫被保持)时,不需要停止到/从声音设备的音频媒体传输,因为(当音频媒体不再有效时)呼叫的音频媒体将自动从会议桥被移除,这也将自动删除来自或连接到该呼叫的所有连接。

7.7 呼叫操作

可以调用Call对象的操作,例如挂断,保持呼叫,发送re-INVITE等。请参阅Call的参考文档以获取更多信息。

7.8 即时消息(IM)

可以使用Call.sendInstantMessage()在通话中发送IM。Call.onInstantMessageStatus()回调方法报告传出即时消息的传输状态。

除了发送即时消息,还可以使用Call.sendTypingIndication()发送打字指示。

在呼叫中收到的IM和打字指示将在回调函数Call.onInstantMessage()和Call.onTypingIndication()中报告。

7.9 类参考

7.9.1 Call

公有函数

1)Call(Account ACC,INT CALL_ID = PJSUA_INVALID_ID )

构造函数

2)virtual ~Call()

析构

3)CallInfo getInfo() const

获取有关此呼叫的详细信息。

返回

呼叫信息。

4)bool isActive() const

检查此呼叫是否具有活动的INVITE会话,并且INVITE会话未被断开。

返回

如果call处于活动状态,则为真。

5)INT getId() const

获取与此呼叫相关联的PJSUA-LIB呼叫ID或索引。

返回

整数大于或等于零。

6)bool hasMedia() const

检查呼叫是否有活动的媒体会话。

返回

如果是,则为真。

7)Media getMedia(unsigned med_idx ) const

获取指定介质索引的介质。

返回

Media 或NULL(如果//代码效果参考:http://www.zidongmutanji.com/bxxx/126762.html

invalid 或inactive)

参数

med_idx - 媒体索引号

8)pjsip_dialog_cap_status remoteHasCap( INT HTYPE,const string hname,const string token ) const

检查远端(远程对等体)是否支持指定的功能。

返回

PJSIP_DIALOG_CAP_SUPPORTED如果显式支持指定的功能,请参阅pjsip_dialog_cap_status以获取更多信息。

参数

htype - 要检查的标题类型(pjsip_hdr_e),该值可以是:

o PJSIP_H_ACCEPT

o PJSIP_H_ALLOW

o PJSIP_H_SUPPORTED

hname -如果htype指定了PJSIP_H_OTHER,则必须在此参数中提供头名称。否则,该值必须设置为空字符串(“”)。

token -检查的能力标记。例如,如果HTYPE是PJSIP_H_ALLOW,则令牌指定方法名称; 如果HTYPE是PJSIP_H_SUPPORTED,则令牌指定诸如“100rel”扩展名。

9)void setUserData(Token user_data )

将应用程序特定数据附加到呼叫。

然后,应用程序可以通过调用检查此数据getUserData() 。

参数

user_data -要附加到任意数据。

10)Token getUserData() const

获取附接至该呼叫,先前已经设置与用户数据()setUserData来。

返回 用户数据

11)pj_stun_nat_type getRemNatType()

获取远程端点的NAT类型。

当natTypeInSdp 在UaConfig中设置时,这是pjsua-lib的专有特征,在SDP中发送NAT类型。

只有从远程接收到SDP之后才能调用此功能。这意味着对于来电,只要来电包含SDP,就可以在收到呼叫时立即调用此功能;对于拨出的呼叫,此功能只能在接收SDP后(通常为200 / OK响应INVITE)才能调用。一般情况下,应用程序应在调用onCallMediaState()时或调用该回调之后才能使用该函数。

返回

NAT类型。

参考

Endpoint:: natGetType(),natTypeInSdp

12)void makeCall(const string dst_uri, const CallOpParamPRM )

参数

dst_uri -要放入To头的URI(通常与目标URI相同)。

prm.opt -可选呼叫设置。

prm.txOption -可选标题等待添加到发出的INVITE请求。

13)void answer(const CallOpParamPRM )

通过呼叫设置参数发送对INVITE请求的响应。

根据指定为参数的状态码,此功能可能发送临时响应,建立呼叫或终止呼叫。有关通话设置的注意事项:

如果在此功能的后续呼叫中更改呼叫设置,则仅应用提供的第一个呼叫设置。所以一般来说,应用程序在获取用户的确认之前不会提供呼叫设置。

如果在SDP已发送未提供通话设置,即:答案与状态码183或者2xx,默认调用的设置将被使用,检查CallSetting它的默认值。

参数

prm.opt -可选呼叫设置。

prm.statusCode -状态码,(100-699)。

prm.reason -可选原因短语。如果为空,将使用默认文本。

prm.txOption -要添加到传出响应消息的标题等的可选列表。请注意,此消息数据将在此INVITE请求的所有下一个答案/响应中持续存在。

14)void hangup(const CallOpParamPRM )

通过使用根据呼叫状态适当的方法挂断呼叫。

参数

prm.statusCode -我们拒绝来电时可以发送的可选状态码。如果值为零,将发送“603 / Decline”。

prm.reason -我们拒绝来电时可以选择发送的原因短语。如果为空,将使用默认文本。

prm.txOption -要添加到传出请求/响应消息的标题等的可选列表。

15)void setHold( const CallOpParamPRM )

将指定的呼叫置于保持状态。

这将发送re-INVITE与适当的SDP通知遥控器呼叫被搁置。请求本身的最终地位将在报告onCallMediaState()回调,这表示该呼叫的媒体状态已经改变了应用程序。

参数

prm.options -pjsua_call_flag常量的位掩码。目前,只能使用标志PJSUA_CALL_UPDATE_CONTACT。

prm.txOption -与请求一起发送的可选消息组件。

16)void reinvite( const CallOpParamPRM )

发送re-INVITE。

请求本身的最终地位将在报告onCallMediaState()回调,这表示该呼叫的媒体状态已经改变了应用程序。

参数

prm.opt -可选呼叫设置,如果为空,当前呼叫设置将保持不变。

prm.opt.flag -pjsua_call_flag常量的位掩码。在此指定PJSUA_CALL_UNHOLD将释放呼叫保持。

prm.txOption -与请求一起发送的可选消息组件。

17)void update( const CallOpParamPRM )

发送UPDATE请求。

参数

prm.opt -可选呼叫设置,如果为空,当前呼叫设置将保持不变。

prm.txOption -与请求一起发送的可选消息组件。

18)void xfer(const string DEST, const CallOpParamPRM )

启动呼叫转移到指定的地址。

该功能将发送REFER请求,指示远程呼叫方向指定的目的地/目标发起新的INVITE会话。

如果应用程序有兴趣监视成功性和传输请求的进步,它可以实现onCallTransferStatus()回调,这将报告该呼叫转移请求的进度。

参数

dest -要联系的新目标的URI。URI可以是名称地址或addr-spec格式。

prm.txOption -与请求一起发送的可选消息组件。

19)void xferReplaces( const call dest_call, const CallOpParam PRM )

发起参加呼叫转移。

此功能会发送REFER请求指示远程呼叫方发起新的INVITE会话的URL destCall。在党dest_call则应从REFER接受者新来电与我们“取代”的号召。

参数

dest_call -呼叫被替换。

prm.options -应用程序可以指定PJSUA_XFER_NO_REQUIRE_REPLACES以阻止在REFER请求创建的传出INVITE请求中包含“Require:replace”。

prm.txOption -与请求一起发送的可选消息组件。

20)void processRedirect( pjsip_redirect_op CMD )

接受或拒绝重定向响应。

应用程序必须调用此函数后,它在信号PJSIP_REDIRECT_PENDING onCallRedirected()回调,以通知呼叫是否接受或拒绝重定向到当前目标。应用程序可以使用PJSIP_REDIRECT_PENDING命令的组合onCallRedirected()回调此功能将呼叫重定向之前要求用户权限。

请注意,如果应用程序选择拒绝或停止重定向(通过分别使用PJSIP_REDIRECT_REJECT或PJSIP_REDIRECT_STOP),则此函数返回之前将调用呼叫断开回调。如果应用程序拒绝对目标的onCallRedirected()回调也可称为前如果有另一个目标试试这个函数返回。

参数

cmd -要应用于当前目标的重定向操作。这种说法的语义相似,在说明书onCallRedirected()回调,除了PJSIP_REDIRECT_PENDING这里不接受。

21)void dialDtmf( const string digits)

使用RFC 2833有效载荷格式将DTMF数字发送到远程。

参数

digits -要发送的DTMF字符串数字。

22)void sendInstantMessage( const SendInstantMessageParam PRM )

在INVITE会话中发送即时消息。

参数

prm.contentType -MIME类型。

prm.content -消息内容。

prm.txOption -要包括在传出请求中的标题等的可选列表。txOption中的body描述符被忽略。

prm.userData -可选的用户数据,在调用IM回调时将返回。

23)void sendTypingIndication( const SendTypingIndicationParamPRM )

在INVITE会话中发送IM打字指示。

参数

prm.isTyping -确实是为了向远方指示当地人当前正在键入IM。

prm.txOption -要包括在传出请求中的标题等的可选列表。

24)void sendRequest( const CallSendRequestParamPRM )

发送任意请求与呼叫。

这对于发送INFO请求是有用的。请注意,应用程序不应该使用此函数发送将更改邀请会话状态的请求,例如re-INVITE,UPDATE,PRACK和BYE。

参数

prm.method -请求的SIP方法。

prm.txOption -可选消息体和/或要包括在传出请求中的头的列表。

字符串dump(布尔with_media,const string 缩进)

将呼叫和媒体统计信息转储为字符串。

返回

呼叫转储和媒体统计字符串。

参数

with_media -真的也包括媒体信息。

indent -左缩进的空格。

25)INT vidGetStreamIdx() const

获取通话中默认视频流的媒体流索引。

通常这将只是检索呼叫中第一个激活的视频流的流索引。如果没有活动,它将返回第一个不活动的视频流。

返回

Media 流索引为-1,如果没有视频流存在于呼叫中。

26)bool vidStreamIsRunning( INT med_idx,pjmedia_dir DIR ) const

确定指定呼叫的视频流当前是否正在运行(即,

已被创建,启动,不被暂停)。

返回

如果目前正在为指定的方向运行流,则为真。

参数

med_idx -媒体流索引,或-1指定默认的视频媒体。

dir -要检查的方向。

27)void vidSetStream(pjsua_call_vid_strm_op op, const CallVidSetStreamParam param)

为指定的呼叫添加,删除,修改和/或操纵视频媒体流。

这可能会触发重新启动或更新以发送呼叫。

参数

op -要执行的视频流操作,可能的值是pjsua_call_vid_strm_op。

param -视频流操作的参数(见CallVidSetStreamParam)。

28)StreamInfo getStreamInfo(unsigned med_idx ) const

获取指定媒体索引的媒体流信息。

返回

流信息。

参数

med_idx -媒体流索引。

29)StreamStat getStreamStat(unsigned med_idx ) const

获取指定媒体索引的媒体流统计信息。

返回

流统计。

参数

med_idx -媒体流索引。

30)MediaTransportInfo getMedTransportInfo(unsigned med_idx ) const

获取指定媒体索引的媒体传输信息。

返回

交通信息。

参数

med_idx -媒体流索引。

31)void processMediaUpdate(OnCallMediaStateParamPRM )

内部功能(由callled 端点(工艺更新调用媒体呼吁媒体状态发生变化时。

32)void processStateChange(OnCallStateParamPRM )

内部功能(通过称为端点)来处理呼叫状态的变化。

33)virtual void onCallState(OnCallStateParamPRM )

呼叫状态发生变化时通知应用程序。

然后,应用程序可以查询通话信息通过调用来获取详细呼叫状态的getInfo()函数。

参数

prm -回调参数

34)virtual void onCallTsxState(OnCallTsxStateParamPRM )

这是一个通用回调,当呼叫中的一个事务已经改变状态时被调用。

例如,应用程序可以实现此回调,以监视传出请求的状态,或者以最终响应回答未处理的传入请求(如INFO)。

参数

prm -回调参数

35)virtual void onCallMediaState(OnCallMediaStateParamPRM )

当通话中的媒体状态发生变化时通知应用程序。

正常应用需要实现这种回调,例如将呼叫的媒体连接到声音设备。当使用ICE时,也会调用此回调来报告ICE协商失败。

参数

prm -回调参数

36)virtual void onCallSdpCreated(OnCallSdpCreatedParamPRM )

当呼叫刚刚创建本地SDP(用于初始或随后的SDP报价/答案)时通知应用程序。

应用程序可以在远程SDP发送和/或协商之前实施此回调来修改SDP,例如,以每个帐户/呼叫基础编解码器优先级应用或添加自定义/专有SDP属性。

参数

prm -回调参数

37)virtual void onStreamCreated(OnStreamCreatedParamPRM )

在创建媒体会话之前,注册到会议桥之前通知应用程序。

如果已将媒体处理端口添加到流中,应用程序可能会返回不同的媒体端口。然后,这个媒体端口将被添加到会议桥。

参数

prm -回调参数

38)virtual void onStreamDestroyed(OnStreamDestroyedParamPRM )

Media 会议从会议桥被注销并被破坏时通知应用程序。

参数

prm -回调参数

39)virtual void onDtmfDigit(OnDtmfDigitParamPRM )

传入DTMF数字时通知应用程序。

参数

prm -回调参数

40)virtual void onCallTransferRequest(OnCallTransferRequestParamPRM )

通知申请被转移(即

REFER被接收)。应用程序可以通过设置代码来决定接受/拒绝传输请求(默认为202)。当此回调未实现时,默认行为是接受转移。

参数

prm -回调参数

41)virtual void onCallTransferStatus(OnCallTransferStatusParamPRM )

通知应用以前发送的呼叫转移请求的状态。

应用程序可以监视呼叫转移请求的状态,例如决定是否终止现有呼叫。

参数

prm -回调参数

42)virtual void onCallReplaceRequest(OnCallRepl

相关文章
|
11天前
|
NoSQL 测试技术 PHP
新手从事直播软件源码开发搭建经验与技巧
新手技术从事直播软件源码开发,从需求调研、技术架构、功能逻辑、技术语言、压力测试等全面剖析。
|
22天前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
3月前
|
存储 XML API
安卓应用程序开发:从新手到专家的旅程
【8月更文挑战第33天】在这篇文章中,我们将一起踏上一段激动人心的旅程,探索如何从一个对安卓应用程序开发一无所知的新手,成长为一个能够独立开发复杂应用程序的专家。我们将通过实际案例和代码示例,深入理解安卓开发的各个方面,包括用户界面设计、数据存储、网络通信等。无论你是刚刚入门,还是已经有一些基础,这篇文章都将为你提供宝贵的知识和技能,帮助你在安卓开发的道路上更进一步。
|
4月前
|
存储 IDE Java
探索安卓应用的构建之旅:从新手到专家
【8月更文挑战第31天】 本文是一篇面向初学者和有一定基础的开发者的技术性文章。我们将一起踏上一段激动人心的旅程,深入了解如何从零开始构建一个安卓应用。文章将引导你理解安卓开发的基础知识,掌握核心概念,并通过实际代码示例加深你的理解和技能。无论你是刚刚接触安卓开发,还是希望提升现有技能,这篇文章都将为你提供宝贵的信息和实用的技巧。准备好了吗?让我们一起开始吧!
|
6月前
|
存储 ice 索引
经验大分享:PJSUA2开发文档
经验大分享:PJSUA2开发文档
91 0
|
7月前
|
数据安全/隐私保护 开发者
效率工具RunFlow完全手册之开发者篇
RunFlow开发者手册涵盖了执行命令、计算器、日期计算、随机生成器和开发者工具集等实用功能。在命令模式中,支持历史记录,便于快速执行命令。计算器能进行进制转换和位运算。日期计算允许时间戳转换、偏移及相差天数计算。随机生成器可产生字母和数字序列。开发者工具集包括代码风格转换、颜色解析、加密解密等多种工具。此外,RunFlow还支持插件开发。
52 2
效率工具RunFlow完全手册之开发者篇
|
7月前
|
IDE 小程序 前端开发
【经验分享】支付宝社区高效的提问技巧
【经验分享】支付宝社区高效的提问技巧
75 4
|
API 开发工具
【平台开发】技术整合思考(六)开发规范(持续更新)
【平台开发】技术整合思考(六)开发规范(持续更新)
76 0
|
运维 监控 算法
“技术开发最应该做什么?”,聊聊我在服务端开发5年的理解和收获
“技术开发最应该做什么?”,聊聊我在服务端开发5年的理解和收获
170 0
|
开发者
【官方帖】各位宜搭开发者,晒一晒你的酷应用开发案例,评论留言吖~~~
快来晒一晒你的酷应用开发案例,有机会在宜搭服务窗/微信公众号等渠道进行宣传推广~ 如果有您有更好的酷应用开发场景,需要宜搭产研共创支持,欢迎评论留言
【官方帖】各位宜搭开发者,晒一晒你的酷应用开发案例,评论留言吖~~~
下一篇
DataWorks