实时音视频开发学习9 - 进房权限和画质

进房权限保护

基础内容

开启进房权限的目的是为了避免非会员模式能够进入高级房间,同时解决客户端限制被破解的问题。目前进房权限在iOS、Android、Windows、Electron、微信小程序和Chrome 浏览器都支持。

privateMapKey 是 TRTCParamEnc 中的一个可选字段,它的作用是让腾讯云检查用户是否拥有进入指定房间的权限。

privateMapKey和UserSig

UserSig是TRTCParamEnc的必选项,作用是检查当前用户是否有权使用 TRTC 云服务,用于防止攻击者盗用您的 sdkappid 账号内的流量。

它主要由SDKAppID,UserID 和 UserSig 三个关键信息,通过HMAC SHA256 加密算法计算得出,只要攻击者不能伪造 UserSig,就无法盗用您的云服务流量。

计算方式:

1.您的 App 在调用 SDK 的初始化函数之前,首先要向您的服务器请求 UserSig。

2.您的服务器根据 SDKAppID 和 UserID 计算 UserSig,计算源码见文档前半部分。

3.服务器将计算好的 UserSig 返回给您的 App。

4.您的 App 将获得的 UserSig 通过特定 API 传递给 SDK。

5.SDK 将 SDKAppID + UserID + UserSig 提交给腾讯云服务器进行校验。

6.腾讯云校验 UserSig,确认合法性。

7.校验通过后,会向 TRTCSDK 提供实时音视频服务。

实现流程图

代码生成

生成方法支持多种语言版本,包括Java、GO、PHP、Node.js、Python等,这里以node进行了解。

通过访问https://cloud.tencent.com/document/product/647/17275网站可以获取到对应的代码。

可以通过npm集成tls-sig-api包来调用对应的api。

导入tls-sig-api模块,调用其sig函数,并以new的形式创建一个类,该类包含一个参数,参数内容为skd_appid、expire_after、private_key和public_key。

相应的源码见demo9。

privateMapKey

TRTCParamEnc 的非必选项,作用是检查当前用户是否有权进入指定roomid的房间,当您的业务需要对用户进行身份区分的时候才有必要开启。

而且,您在 App 端直接判定当前用户是否有权进入指定房间也是可以的,privateMapKey 的作用仅仅是做的更安全,它可以避免客户端被破解后,出现“非会员也能进高等级房间”的破解版本。

它的创建流程和UserSig相似,只有几点不同:

1.在客户服务器端计算出UserSig+privateMapKey并返回这两个值

2.通过SDK向腾讯视频云发送内容增加了一个privateMapKey

3.在腾讯云内部需要一次检验UserSig和privateMapKey,并最终判断是否允许进房。

开启方式

打开腾讯云实时音视频控制台导航栏的应用管理,然后打开对应应用的“应用信息”,最后启动“启动权限密钥”。完成之后,后台进入房间、权限变更接口强制校验需用该密钥加密的权限加密串,如果没有该加密串的请求会被拒绝。

计算方式

由于 privateMapKey 的价值就是为了防止客户端被逆向破解,从而出现“非会员也能进高等级房间”的破解版本,所以它只适合在您的后台服务器计算再返回客户端。官方提供了java、php和nodejs三个版本,这里以node为例。

1.下载WebRTCSigApi.js文件,我这demo9已经提供或打开下面链接: https://github.com/TencentVideoCloudMLVBDev/usersig_server_source/tree/master/nodejs

2.获取公私钥private_key和public_key值

3.修改WebRTCSigApi.js文件中的sdkappid、roomid、userid为腾讯云通信的sdkappid,指定房间号,指定用户名

4.最后运行node指令生成userSig和privateMapKey值。

获取公私钥文件方式

打开实时音视频控制台,找到应用管理,并打开“应用信息”,然后切换到“快速上手”

切换到老版本,即点击“非对称式加密”

最后获取到对应的公钥PublicKey和私钥PrivateKey

这里需要注意的问题是,房间一旦权限控制开启,当前 sdkappid 下的房间就需要在 TRTCParamEnc 中设置 privateMapKey 才能进入,所以如果您线上业务正在运营中,并且线上版本并没有加入 privateMapKey 的相关逻辑,请不要开启此开关。

设定画面质量

画面质量的设置也支持IOS、MacOS、桌面浏览器、微信小程序等,桌面浏览器设定画面质量通过Stream对象的setVideoProfile()方法进行设定,这个在demo5中进行了展示。以下是对TRTCCloud调整画质的介绍。

TRTCCloud调整画质主要是通过修改TRTCAppScene、setVideoEncoderParam和setNetworkQosParam,分别为场景值、编码参数和网络调控策略。

TRTCAppScene可以设定为VideoCall,对应视频通话场景,设定LIVE对应直播场景。

TRTCVideoEncParam为一个对象,主要用于配置videoResolution编码分辨率、resMode横竖屏分辨率、videoFps帧率和videoBitrate视频码率。视频的清晰度并不会因为分辨率越大或者帧率越大而变得更加清晰,而是需要恰当的映射关系才能呈现更好的是怕你效果。以下是对应的映射关系。

由于很多硬件编解码器只支持能被 16 整除的像素宽度,所以 SDK 实际编码出的分辨率并不一定完全按照参数自定,而是会自动进行 16 整除修正。例如 640 x 360 的分辨率,在 SDK 内部有可能会适配为 640 x 368。

TRTCNetworkQosParam主要参数为QosPreference,它能够在网络带宽充裕的情况下,兼顾清晰和流畅,当网络不好时优先保证流畅或者清晰,分别通过设置TRTCNetworkQosParam 中的 preference 参数来做出选择。

小程序设置方法

在小程序中主要是通过设置视频画面的宽高来衡量视频画面的质量,可以通过给trtc-room组件中设置相关的配置信息config便能实现打开视频的画质好坏。通过videoHeight和videoWidth设置视频的宽高,minBitrate和maxBitrate设置视频的最小和最大码率。参数如下:

通常在实际业务中,如一对一的视频聊天,就能让接收远端流的一方将远端流的视频呈现位置放于视频的左上角,并通过触屏事件能够随时修改视频呈现的位置。

web端设置方法

通过本地音视频流 Stream 对象的 setVideoProfile() 方法设置视频属性,接收一个参数profile,每个 Profile 对应着一套推荐的分辨率、帧率和码率,帧率码率对应表

由于设备和浏览器的限制,视频分辨率不一定能够完全匹配,在这种情况下,浏览器会自动调整分辨率使其接近 Profile 对应的分辨率。

如果上述的指定格式满足不了业务要求,我们还可以通过自定义的形式设置属于自己业务内容的帧率和码率。

注:更多内容请关注腾讯云的实时音视频