WebRTC 通话的挂起与恢复
作者:追风剑情 发布于:2024-2-19 10:55 分类:Unity3d
通话挂起是指在通话过程中一方临时暂停对话,并通过友好的方式提示对方进行等待; 通话恢复是指由通话挂起恢复正常通话。
这两项技术经常用于电话客服或者电话转接的场景,比如当电话客服需要时间进行某项操作时,会提示客户进行等待,而为了让客户保持耐心,在等待期间会播放一段轻松的音乐。
将 RTCRtpTransceiver.direction 属性和 RTCRtpSender.replaceTrack() 方法相结合,可以实现通话挂起与恢复功能。
通话挂起
我们来设想一个场景,一位客户正在与客服通话,客户提出了一项业务请求,客服表示可以满足但是需要一段时间处理,此时客服将通话挂起,提示客户进行等待。
客服方将从话简采集到的语音替换为一段音乐,并停止播放从客户端发送过来的语音,将收发器的方向设置为只发送(sendonly)。
通过本章对RTP媒体API的介绍,我们已经知道,调用replaceTrack替换媒体轨道不需要进行重新协商,而对收发器方向的修改则需要重新进行ICE协商,在doOffer流程中生成了本地提案,并通过信令服务器发送给客户方。客服端代码逻辑如下所示。
async function playMusicOnHold() {
try {
// audio是RTP收发器,musicTrack是播放音乐的音频轨道
await audio.sender.replaceTrack(musicTrack);
// 使接收到的音频静音
audio.receiver.track.enabled = false;
// 将direction设为只发送(sendonly),此时需要重新协商
audio.direction = 'sendonly';
// 生成提案并发送给对等方
await doOffer();
} catch (err) {
console.error(err);
}
}
客户方也会进行相应处理,按照业务逻辑,客户方此时不应再发送语音数据,同时应该能够收听到等待音乐。
当客户方接收到客服方通过信令服务器传输过来的包含了sendonly的提案后,首先调用setRemoteDescription应用提案,然后调用replaceTrack()方法传人参数null移除音轨这会导致停止发送音频数据。
客户方相应地将direction调整为只接收(recvonly),与客服方的sendonly 保持一致这避免了方向不一致导致反复协商。最后在doAnswer中生成自己的会话描述信息并发送给客服方,完成重新协商的过程。
async function handleSendonlyOffer() {
try {
// 首先应用sendonly提案
await pc.setRemoteDescription(sendonlyOffer);
// 停止发送音频
await audio.sender.replaceTrack(null);
// 相应地将direction调整为只接收
audio.direction = 'recvonly';
// 回应提案
await doAnswer();
} catch (err) {
// 错误处理
}
}
通话恢复
客服办理完业务,停止挂起状态,恢复通话,代码逻辑如代码清单所示。首先使用从话筒采集到的音频轨道替换挂起状态播放的音乐,这个步骤可以马上生效,不需要进行重新协商。然后取消接收音频静音,这样就可以听到客户那边的语音了。将direction改为收发(sendrecv),这一步需要进行重新协商,在doOffer流程中生成了本地提案,并通过信令服务器发送给客户方。
async function stopOnHoldMusic() {
// audio是RTP收发器,micTrack是从话简采集的音频轨道
await audio.sender.replaceTrack(micTrack);
// 取消接收音频静音
audio.receiver.track.enabled = true;
// 将方向设为收发(sendrecv)
audio.direction = 'sendrecv';
// 生成提案并发送给对等方
await doOffer();
}
客户方的音乐播放停止了,而且应该能够听到客服的语音信息,但是因为收发器方向 还是只接收的状态,所以无法对话。
如下面的代码清单所示,对客服方取消挂起操作进行回应,客户方收到了从信令服务器发送过来的提案SDP信息,调用setRemoteDescription()方法进行设置,随后使用replaceTrack加入话简音频轨道并将接收器方向改为收发(sendrecv),最后在doAnswer 流程中生成自己的会话描述信息并发送给客服方,完成ICE重新协商过程。至此,客户方可以正常发送自己的语音了,双方通话恢复正常。
async function onOffHold() {
try {
// 首先应用sendrecv提案
await pc.setRemoteDescription(sendrecvOffer);
// 开始发送话简音轨
await audio.sender.replaceTrack(micTrack);
// 将收发方向设为sendrecv
audio.direction = 'sendrecv';
// 生成本地SDP应答,回复给对方
await doAnswer();
} catch (err) {
// 错误处理
}
}
标签: Unity3d
日历
最新文章
随机文章
热门文章
分类
存档
- 2024年11月(3)
- 2024年10月(5)
- 2024年9月(3)
- 2024年8月(3)
- 2024年7月(11)
- 2024年6月(3)
- 2024年5月(9)
- 2024年4月(10)
- 2024年3月(11)
- 2024年2月(24)
- 2024年1月(12)
- 2023年12月(3)
- 2023年11月(9)
- 2023年10月(7)
- 2023年9月(2)
- 2023年8月(7)
- 2023年7月(9)
- 2023年6月(6)
- 2023年5月(7)
- 2023年4月(11)
- 2023年3月(6)
- 2023年2月(11)
- 2023年1月(8)
- 2022年12月(2)
- 2022年11月(4)
- 2022年10月(10)
- 2022年9月(2)
- 2022年8月(13)
- 2022年7月(7)
- 2022年6月(11)
- 2022年5月(18)
- 2022年4月(29)
- 2022年3月(5)
- 2022年2月(6)
- 2022年1月(8)
- 2021年12月(5)
- 2021年11月(3)
- 2021年10月(4)
- 2021年9月(9)
- 2021年8月(14)
- 2021年7月(8)
- 2021年6月(5)
- 2021年5月(2)
- 2021年4月(3)
- 2021年3月(7)
- 2021年2月(2)
- 2021年1月(8)
- 2020年12月(7)
- 2020年11月(2)
- 2020年10月(6)
- 2020年9月(9)
- 2020年8月(10)
- 2020年7月(9)
- 2020年6月(18)
- 2020年5月(4)
- 2020年4月(25)
- 2020年3月(38)
- 2020年1月(21)
- 2019年12月(13)
- 2019年11月(29)
- 2019年10月(44)
- 2019年9月(17)
- 2019年8月(18)
- 2019年7月(25)
- 2019年6月(25)
- 2019年5月(17)
- 2019年4月(10)
- 2019年3月(36)
- 2019年2月(35)
- 2019年1月(28)
- 2018年12月(30)
- 2018年11月(22)
- 2018年10月(4)
- 2018年9月(7)
- 2018年8月(13)
- 2018年7月(13)
- 2018年6月(6)
- 2018年5月(5)
- 2018年4月(13)
- 2018年3月(5)
- 2018年2月(3)
- 2018年1月(8)
- 2017年12月(35)
- 2017年11月(17)
- 2017年10月(16)
- 2017年9月(17)
- 2017年8月(20)
- 2017年7月(34)
- 2017年6月(17)
- 2017年5月(15)
- 2017年4月(32)
- 2017年3月(8)
- 2017年2月(2)
- 2017年1月(5)
- 2016年12月(14)
- 2016年11月(26)
- 2016年10月(12)
- 2016年9月(25)
- 2016年8月(32)
- 2016年7月(14)
- 2016年6月(21)
- 2016年5月(17)
- 2016年4月(13)
- 2016年3月(8)
- 2016年2月(8)
- 2016年1月(18)
- 2015年12月(13)
- 2015年11月(15)
- 2015年10月(12)
- 2015年9月(18)
- 2015年8月(21)
- 2015年7月(35)
- 2015年6月(13)
- 2015年5月(9)
- 2015年4月(4)
- 2015年3月(5)
- 2015年2月(4)
- 2015年1月(13)
- 2014年12月(7)
- 2014年11月(5)
- 2014年10月(4)
- 2014年9月(8)
- 2014年8月(16)
- 2014年7月(26)
- 2014年6月(22)
- 2014年5月(28)
- 2014年4月(15)
友情链接
- Unity官网
- Unity圣典
- Unity在线手册
- Unity中文手册(圣典)
- Unity官方中文论坛
- Unity游戏蛮牛用户文档
- Unity下载存档
- Unity引擎源码下载
- Unity服务
- Unity Ads
- wiki.unity3d
- Visual Studio Code官网
- SenseAR开发文档
- MSDN
- C# 参考
- C# 编程指南
- .NET Framework类库
- .NET 文档
- .NET 开发
- WPF官方文档
- uLua
- xLua
- SharpZipLib
- Protobuf-net
- Protobuf.js
- OpenSSL
- OPEN CASCADE
- JSON
- MessagePack
- C在线工具
- 游戏蛮牛
- GreenVPN
- 聚合数据
- 热云
- 融云
- 腾讯云
- 腾讯开放平台
- 腾讯游戏服务
- 腾讯游戏开发者平台
- 腾讯课堂
- 微信开放平台
- 腾讯实时音视频
- 腾讯即时通信IM
- 微信公众平台技术文档
- 白鹭引擎官网
- 白鹭引擎开放平台
- 白鹭引擎开发文档
- FairyGUI编辑器
- PureMVC-TypeScript
- 讯飞开放平台
- 亲加通讯云
- Cygwin
- Mono开发者联盟
- Scut游戏服务器引擎
- KBEngine游戏服务器引擎
- Photon游戏服务器引擎
- 码云
- SharpSvn
- 腾讯bugly
- 4399原创平台
- 开源中国
- Firebase
- Firebase-Admob-Unity
- google-services-unity
- Firebase SDK for Unity
- Google-Firebase-SDK
- AppsFlyer SDK
- android-repository
- CQASO
- Facebook开发者平台
- gradle下载
- GradleBuildTool下载
- Android Developers
- Google中国开发者
- AndroidDevTools
- Android社区
- Android开发工具
- Google Play Games Services
- Google商店
- Google APIs for Android
- 金钱豹VPN
- TouchSense SDK
- MakeHuman
- Online RSA Key Converter
- Windows UWP应用
- Visual Studio For Unity
- Open CASCADE Technology
- 慕课网
- 阿里云服务器ECS
- 在线免费文字转语音系统
- AI Studio
- 网云穿
- 百度网盘开放平台
- 迅捷画图
- 菜鸟工具
- [CSDN] 程序员研修院
- 华为人脸识别
- 百度AR导航导览SDK
- 海康威视官网
- 海康开放平台
- 海康SDK下载
- git download
交流QQ群
-
Flash游戏设计: 86184192
Unity游戏设计: 171855449
游戏设计订阅号