三、场景玩法
1V1音视频通话场景不仅只有最基础的类微信通话应用,在其基础上还可以衍生出多种不同玩法,下面简要介绍几种常见的场景玩法。
四、游戏社交
在游戏领域,音视频通话可以让玩家之间进行实时互动,增强游戏体验。玩家可以在游戏中与好友进行语音或视频聊天,分享游戏心得、技巧,或者一起制定游戏策略。如今,音视频通话被广泛应用于连麦开黑等游戏社交玩法中。
五、在线客服
1V1 音视频通话可以让客户与客服人员进行实时沟通,解决问题。相比于传统的文字客服,音视频通话可以让客户更直观地描述问题,客服人员也可以更清晰地了解客户需求,提高解决问题的效率。例如,纠纷处理、保险咨询等都是很好的应用场景。
六、在线问诊
在医疗领域,1V1音视频通话可以让患者与医生进行远程问诊。患者可以通过音视频通话向医生描述症状,医生也可以根据患者的描述进行初步诊断。这种方式不仅节省了患者的时间和精力,还可以让医生为更多患者提供服务,提高医疗资源的利用率。
七、实现方案
通常实现一个基本的 1V1音视频通话场景需要涉及到多个功能模块,我们可以将实现方案大致分为三个部分:通话信令控制、音视频通话、通话功能控制。每个部分的关键动作及功能点如下表所示。
| 功能模块 | 关键动作及功能点 |
| 通话信令控制 | 呼叫、接听、拒接、挂断 |
| 音视频通话 | 语音通话、视频通话 |
| 通话功能控制 | 打开关闭麦克风/摄像头/扬声器、听筒免提切换、摄像头切换、大小窗口切换、网络状态提示、通话时长统计 |
音视频通话场景的完整实现通常需要依赖实时音视频和即时通信的组合能力。实时音视频模块负责音视频通信及设备状态控制,即时通信模块负责信令传输及消息推送。音视频通话场景的主要架构如下:
八、通话信令控制
根据一个完整的通话流程,通话信令可以分为 呼叫、接听、拒接、挂断 几个部分。以 即时通信 IM 为例,下面介绍用户完成 登录操作 后的通话信令控制部分的具体实现逻辑。
九、呼叫
呼叫信令可以细分为发起呼叫、取消呼叫、呼叫超时几个部分,其调用时序如下:
·发起呼叫:主叫端向被叫端发起呼叫邀请,同时展示呼叫页面并播放铃声;被叫端收到邀请通知,同时展示呼叫页面并播放铃声。
·取消呼叫:主叫端可以中途取消呼叫邀请,同时销毁呼叫页面并停止铃声;被叫端收到取消通知,同时销毁呼叫页面并停止铃声。
·呼叫超时:当超过 invite 预设的超时时间 timeout 未响应,主叫端和被叫端均会收到超时通知,同时销毁呼叫页面并停止铃声。
十、接听
被叫端接收到来自主叫端的呼叫邀请后,可以选择接听操作,开始音视频通话。
通话接听后,双方即开始进行音视频互动通信,具体实现逻辑详见 音视频通话。
十一、拒接
拒接信令可以细分为主动拒接、忙线拒接两个部分,其调用时序如下:
·主动拒接:被叫端收到呼叫邀请后拒绝邀请,同时销毁呼叫页面并停止铃声;主叫端收到拒绝通知,同时销毁呼叫页面并停止铃声。
·忙线拒接:被叫端收到呼叫邀请后,本地判断正在通话中,则直接拒绝邀请;主叫端收到拒绝通知,同时销毁呼叫页面并停止铃声。
注意:主动拒接和忙线拒接都是使用 reject 信令实现的,但需注意通过信令的自定义数据 data 字段加以区分。
十二、挂断
在通话过程中,主叫和被叫任意一端均可随时选择挂断操作,结束音视频通话。
以主叫端挂断为例,主叫端执行退房操作,被叫端收到远端退房通知,同时执行退房操作,双方通话结束。
注意:说明:
注意:挂断操作没有使用到 IM 信令通知,而是使用 TRTC 远端用户退房回调通知实现。
十三、音视频通话
音视频通话部分主要依赖 实时音视频 TRTC 的能力实现,可以分为 语音通话、视频通话 两个部分,下面分别介绍这两部分的具体实现逻辑。
十四、语音通话
通话接通后,通话双方需要进入同一个 TRTC 房间,并开启本地音频采集和推流,同时互相拉取对方音频流,实现语音通话。
关于开始通话和结束通话的音视频相关接口的调用时序如下:
十五、视频通话
呼叫通话阶段,通话双方均需设置视频编码参数,同时开启本地视频预览。通话接通后,通话双方需要进入同一个 TRTC 房间,并开启本地音频采集和推流,同时互相拉取对方音频流和视频流,实现音视频通话。
关于呼叫通话、开始通话、结束通话的音视频相关接口的调用时序如下:
十六、通话功能控制
音视频通话过程中,可能会涉及系列功能控制,例如:打开关闭麦克风、打开关闭扬声器、打开关闭摄像头、听筒免提切换、摄像头切换、大小窗口切换、网络状态提示、通话时长统计,这些功能控制及状态提示大多通过 TRTC SDK 完成,下面逐项介绍其具体实现。
十七、打开关闭麦克风
AndroidiOS// 打开麦克风mTRTCCloud.muteLocalAudio(false);// 关闭麦克风mTRTCCloud.muteLocalAudio(true);// 打开麦克风[self.trtcCloud muteLocalAudio:NO];// 关闭麦克风[self.trtcCloud muteLocalAudio:YES];
十八、打开关闭扬声器
AndroidiOS// 打开扬声器mTRTCCloud.muteAllRemoteAudio(false);// 关闭扬声器mTRTCCloud.muteAllRemoteAudio(true);// 打开扬声器[self.trtcCloud muteAllRemoteAudio:NO];// 关闭扬声器[self.trtcCloud muteAllRemoteAudio:YES];
十九、打开关闭摄像头
AndroidiOS// 打开摄像头, 指定前置或后置摄像头及渲染控件mTRTCCloud.startLocalPreview(isFrontCamera, videoView);// 关闭摄像头mTRTCCloud.stopLocalPreview();// 打开摄像头, 指定前置或后置摄像头及渲染控件[self.trtcCloud startLocalPreview:self.isFrontCamera view:self.videoView];// 关闭摄像头[self.trtcCloud stopLocalPreview];
20、听筒免提切换
AndroidiOS// 切换听筒mTRTCCloud.getDeviceManager().setAudioRoute(TXDeviceManager.TXAudioRoute.TXAudioRouteEarpiece);// 切换免提mTRTCCloud.getDeviceManager().setAudioRoute(TXDeviceManager.TXAudioRoute.TXAudioRouteSpeakerphone);// 切换听筒[[self.trtcCloud getDeviceManager] setAudioRoute:TXAudioRouteEarpiece];// 切换免提[[self.trtcCloud getDeviceManager] setAudioRoute:TXAudioRouteSpeakerphone];
21、摄像头切换
AndroidiOS// 判断当前是否为前置摄像头boolean isFrontCamera = mTRTCCloud.getDeviceManager().isFrontCamera();// 切换前置或后置摄像头, true: 切换为前置; false: 切换为后置mTRTCCloud.getDeviceManager().switchCamera(!isFrontCamera);// 判断当前是否为前置摄像头BOOL isFrontCamera = [[self.trtcCloud getDeviceManager] isFrontCamera];// 切换前置或后置摄像头, true: 切换为前置; false: 切换为后置[[self.trtcCloud getDeviceManager] switchCamera:!isFrontCamera];
22、大小窗口切换
AndroidiOS// 更新本地预览画面渲染控件mTRTCCloud.updateLocalView(previewView);// 更新远端用户视频渲染控件mTRTCCloud.updateRemoteView(userId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, previewView);// 更新本地预览画面渲染控件[self.trtcCloud updateLocalView:self.previewView];// 更新远端用户视频渲染控件[self.trtcCloud updateRemoteView:self.previewView streamType:TRTCVideoStreamTypeBig forUser:self.userId];
23、网络状态提示
AndroidiOS@Overridepublic void onNetworkQuality(TRTCCloudDef.TRTCQuality localQuality, ArrayList<TRTCCloudDef.TRTCQuality> remoteQuality) { if (remoteQuality.size() > 0) { switch (remoteQuality.get(0).quality) { case TRTCCloudDef.TRTC_QUALITY_Excellent: Log.i(TAG, "对方网络非常好"); break; case TRTCCloudDef.TRTC_QUALITY_Good: Log.i(TAG, "对方网络比较好"); break; case TRTCCloudDef.TRTC_QUALITY_Poor: Log.i(TAG, "对方网络一般"); break; case TRTCCloudDef.TRTC_QUALITY_Bad: Log.i(TAG, "对方网络较差"); break; case TRTCCloudDef.TRTC_QUALITY_Vbad: Log.i(TAG, "对方网络很差"); break; case TRTCCloudDef.TRTC_QUALITY_Down: Log.i(TAG, "对方网络极差"); break; default: Log.i(TAG, "未定义"); break; } }}#pragma mark – TRTCCloudDelegate- (void)onNetworkQuality:(TRTCQualityInfo *)localQuality remoteQuality:(NSArray<TRTCQualityInfo *> *)remoteQuality { if (remoteQuality.count > 0) { switch(remoteQuality[0].quality) { case TRTCQuality_Unknown: NSLog(@"未定义"); break; case TRTCQuality_Excellent: NSLog(@"对方网络非常好"); break; case TRTCQuality_Good: NSLog(@"对方网络比较好"); break; case TRTCQuality_Poor: NSLog(@"对方网络一般"); break; case TRTCQuality_Bad: NSLog(@"对方网络较差"); break; case TRTCQuality_Vbad: NSLog(@"对方网络很差"); break; case TRTCQuality_Down: NSLog(@"对方网络极差"); break; default: break; } }}
24、通话时长统计
推荐使用 TRTC 远端用户进房时间作为统计通话时长的开始时间,本地用户退房时间作为统计通话时长的结束时间。
AndroidiOS// 开始通话时间long callStartTime = 0;// 结束通话时间long callFinishTime = 0;// 通话持续时长(秒)long callDuration = 0;// 远端用户进房回调@Override
public void onRemoteUserEnterRoom(String userId) {
callStartTime = System.currentTimeMillis();
}// 本地用户退房回调@Override
public void onExitRoom(int reason) {
callFinishTime = System.currentTimeMillis(); callDuration = (callFinishTime – callStartTime) / 1000;
}// 开始通话时间@property (nonatomic, assign) NSTimeInterval callStartTime;// 结束通话时间@property (nonatomic, assign) NSTimeInterval callFinishTime;// 通话持续时长(秒)@property (nonatomic, assign) NSInteger callDuration;// 远端用户进房回调- (void)onRemoteUserEnterRoom:(NSString *)userId { self.callStartTime = [[NSDate date] timeIntervalSince1970];}// 本地用户退房回调- (void)onExitRoom:(NSInteger)reason { self.callFinishTime = [[NSDate date] timeIntervalSince1970]; self.callDuration = (NSInteger)(self.callFinishTime – self.callStartTime);}
注意:若出现强杀、网络断开等异常结束情形,客户端可能无法统计到相关时间,可通过 服务端事件回调 监听进退房事件统计本次通话时长。
26、录制与内容理解
1V1音视频通话场景很多情况下需要录制及存储通话内容,以便备案及后期审查。
27、TRTC 云端录制
TRTC 最新升级的云端录制,不依赖云直播的能力,无需旁路转推云直播,使用 TRTC 内部的实时录制集群进行音视频录制,拥有更完整统一的录制体验。
·单流录制:通过 TRTC 的云端录制功能,你可以将房间中通话双方的音视频流都录制成独立的文件。
·混流录制:将同一个房间中的所有音视频媒体流混流录制成一个文件。
28、内容理解
音视频流可使用 AI 内容理解 能力,支持手动或全局自动进行音视频内容的识别和告警。具体请参考 内容理解模式。
29、视频美颜特效
视频通话场景中,美颜是一个被高频使用的功能。美颜不但能提升用户的颜值,也能通过一些贴纸特效增加通话互通的趣味性。TRTC 支持 腾讯美颜特效 的集成,同时也支持市面上主流第三方美颜产品的接入,例如火山美颜、相芯美颜等。
32、美颜产品对比
| 美颜类型 | 美颜效果 | 接入成本 | 费用成本 | 虚拟数字人 | 支持终端 |
| 腾讯特效 SDK | 基础效果好,高级效果大眼/瘦脸等效果显著 | 较低 | 适中 | 支持 | Android/iOS/PC/Flutter/Web/小程序 |
| 相芯特效 SDK | 基础效果好,高级效果大眼/瘦脸等效果一般 | 较高 | 适中 | 支持 | Android/iOS/PC/Untiy |
| 火山特效 SDK | 基础效果好,高级效果大眼/瘦脸等效果较好 | 较高 | 偏高 | 支持 | Android/iOS/PC/Linux |
33、离线消息推送
音视频通话场景通常需要用到离线消息推送,被叫用户 App 不在线时也能收到新的来电消息。即时通信 IM 提供了两种集成方式:自集成推送 和 推送插件。推送插件(TIMPush)为你提供稳定、及时、多样化的推送服务。相比自集成推送,推送插件只需进行简单配置,即可一键式集成接入多个厂商的推送服务。
34、步骤1:开通推送插件
进入 IM 控制台 > 插件市场,单击立即购买或免费试用 。(每个应用可免费试用一次,有效期7天)
35、步骤2:集成推送插件
1. 注册应用到厂商推送平台。
离线推送需要将你自己的应用注册到各个厂商的推送平台,得到 AppID 和 AppKey 等参数,用于实现离线推送功能。目前国内支持的手机厂商有:小米、华为、荣耀、OPPO、VIVO、魅族,境外支持 Google FCM。iOS 需要向 Apple 申请 APNs 推送证书,详见 申请 APNs 证书。
2. IM 控制台配置厂商推送证书。
登录腾讯云 即时通信 IM 控制台,在推送管理 > 接入设置功能栏添加各个厂商推送证书,并将你在之前步骤获取到各厂商的 AppId、AppKey、AppSecret 等参数配置给添加的推送证书。iOS 配置方式详见 上传证书到控制台。
小米华为OPPOVIVO魅族荣耀Google FCM
·厂商推送平台:
·IM 控制台配置:
·厂商推送平台:
·IM 控制台配置:
注意:说明:
注意:Client ID 对应 AppID,Client Secret 对应 AppSecret。
·厂商推送平台:
·IM 控制台配置:
·厂商推送平台:
·IM 控制台配置:
注意:说明:
注意:回执配置请参考 消息触达统计配置-vivo。
·厂商推送平台:
·IM 控制台配置:
注意:说明:
注意:回执配置请参考 消息触达统计配置-魅族。
·厂商推送平台:
·IM 控制台配置:
·厂商推送平台:
·IM 控制台配置:
3. 下载并添加配置文件。
完成控制台厂商推送信息填写后,下载并添加配置文件到工程。将下载的 timpush-configs.json 文件添加到应用模块的 assets 目录下:
3.1 选择下载配置文件 timpush-configs.json
3.2 添加到工程。
4. 集成 TIMPush 插件。
AndroidiOS
// 推送主包必须要集成implementation 'com.tencent.timpush:timpush:7.7.5283'// 按照需要集成对应厂商implementation 'com.tencent.timpush:huawei:7.7.5283'implementation 'com.tencent.timpush:xiaomi:7.7.5283'implementation 'com.tencent.timpush:oppo:7.7.5283'implementation 'com.tencent.timpush:vivo:7.7.5283'implementation 'com.tencent.timpush:honor:7.7.5283'implementation 'com.tencent.timpush:meizu:7.7.5283'implementation 'com.tencent.timpush:fcm:7.7.5283'
注意:说明:
注意:def projects = this.rootProject.getAllprojects().stream().map { project -> project.name }.collect()
api projects.contains("tuicore") ? project(':tuicore') : "com.tencent.timpush:tuicore:7.7.5286"
·TIMPush 组件支持 cocoapods 集成,你需要在 Podfile 中添加组件依赖。
target 'YourAppName' do # Uncommment the next line if you're using Swift or would like to use dynamic frameworks use_frameworks! use_modular_headers! # Pods for Example pod 'TIMPush', '7.7.5283'end
·执行以下命令,安装 TIMPush 组件。
pod install
# 如果无法安装 TUIKit 最新版本,执行以下命令更新本地的 CocoaPods 仓库列表。
pod repo update
36、步骤3:使用离线消息推送
AndroidiOSV2TIMOfflinePushInfo v2TIMOfflinePushInfo = new V2TIMOfflinePushInfo();v2TIMOfflinePushInfo.setTitle("推送标题");v2TIMOfflinePushInfo.setDesc("推送内容");// OPPO必须设置ChannelID才可以收到推送消息,这个channelID需要和控制台一致v2TIMOfflinePushInfo.setAndroidOPPOChannelID("tuikit");v2TIMOfflinePushInfo.setAndroidHuaWeiCategory("IM");v2TIMOfflinePushInfo.setAndroidVIVOCategory("IM");// 设置自定义铃声v2TIMOfflinePushInfo.setIOSSound("phone_ringing.mp3");v2TIMOfflinePushInfo.setAndroidSound("phone_ringing");// 发送通话邀请信令V2TIMManager.getSignalingManager().invite(userId, data, false, v2TIMOfflinePushInfo, timeout, new V2TIMCallback() { @Override public void onError(int code, String desc) { // 发送邀请信令失败 } @Override public void onSuccess() { // 发送邀请信令成功 }});TUIOfflinePushInfo *pushInfo = [TUIOfflinePushInfo new];pushInfo.title = @"推送标题";pushInfo.desc = @"推送内容";// OPPO必须设置ChannelID才可以收到推送消息,这个channelID需要和控制台一致pushInfo.AndroidOPPOChannelID = @"tuikit";pushInfo.AndroidHuaWeiCategory = @"IM";pushInfo.AndroidVIVOCategory = @"IM";// 设置自定义铃声pushInfo.iOSSound = @"phone_ringing.mp3";pushInfo.AndroidSound = @"phone_ringing";// 发送通话邀请信令[[V2TIMManager sharedInstance] invite:userId data:data onlineUserOnly:NO offlinePushInfo:pushInfo timeout:30 succ:^{ NSLog(@"sendInvitation success");} fail:^(int code, NSString *desc) { NSLog(@"sendInvitation error %d", code);}];
37、方案配套产品
| 系统层级 | 产品名称 | 场景用途 |
| 接入层 | 实时音视频 TRTC | 提供低延时、高品质的音视频实时互动解决方案,是音视频通话场景的基础底座能力。 |
| 接入层 | 即时通信 IM | 提供高可靠且稳定的信令传输、自定义消息收发,实现音视频通话场景的通话信令控制。 |
| 接入层 | 腾讯特效 SDK | 提供美颜、滤镜、美妆、趣味贴纸、Moji 表情、虚拟形象等实时特效处理能力。 |
| 云端服务 | 云点播 VOD | 面向音视频媒体,提供制作上传、存储、转码、媒体处理、媒体 AI、加速分发播放、版权保护等一体化的高品质媒体服务。 |
| 数据存储 | 对象存储 COS | 提供音视频录制文件、音视频切片文件的存储服务。 |