上一篇文章介绍了腾讯云实时音视频的两种混流方式分别是A+B->A和A+B->C,本文重点介绍,客户端如何实现这两种混流的方式,代码附上
一、知识点梳理 首先,我们先来介绍一下进入TRTC房间时,我们每一路流的流id和默认混流的方式。
我们都知道进入房间进行推流需要的必备条件:
sdkappid:TRTC的应用id
roomid:房间号
userid:用户id
role:角色,角色分为主播和观众,其中主播用于上行数据的能力(即推音视频数据的能力),观众却没有上行数据的能力。就算调用推流的方法,也无法推流成功,请知晓。
比如:sdkappid = 123456789;roomid = 12345;userid = 123;role必须是主播(TRTCRoleAnchor)
那么这个用户的默认推流的流id是多少呢?答案:123456789_roomid_123_main
这个是怎么来的?腾讯云TRTC房间内的推流id默认的拼接方式为:sdkappid_roomid_userid_main
注意:这个是默认的,当然是可以修改的。如何修改?继续往下看......
二、进房推流参数准备 上一篇文章介绍的很清楚A+B->A的混流原理,那么代码到底要如何实现?下面以iOS代码为例
准备进房的视频编码参数:
// 视频编码参数
TRTCVideoEncParam * videoEncParam = [[TRTCVideoEncParamalloc] init];
videoEncParam.resMode = TRTCVideoResolutionModePortrait;
videoEncParam.videoResolution = TRTCVideoResolution_960_720;
videoEncParam.videoBitrate = 1200;
videoEncParam.videoFps = 15;
videoEncParam.enableAdjustRes = NO;
[self.trtcCloudsetVideoEncoderParam:videoEncParam];
网络相关参数:
// 网络流控相关参数
TRTCNetworkQosParam * networkQosParam = [[TRTCNetworkQosParam alloc] init];
networkQosParam.preference = TRTCVideoQosPreferenceClear; // 保清晰
[self.trtcCloud setNetworkQosParam:networkQosParam];
画面渲染参数(经常出现的画面显示不完整、被裁减、有黑边等):
//画面渲染参数
TRTCRenderParams *renderParams = [[TRTCRenderParams alloc] init];
/*
TRTCVideoFillMode_Fill = 0, ///< 图像铺满屏幕,超出显示视窗的视频部分将被裁剪
TRTCVideoFillMode_Fit = 1, ///< 图像长边填满屏幕,短边区域会被填充黑色
*/
renderParams.fillMode = TRTCVideoFillMode_Fit;
[self.trtcCloud setLocalRenderParams:renderParams];
进房参数:
[self.trtcCloud startLocalPreview:YES view:self.view];//开启摄像头,本地预览
TRTCParams * param = [[TRTCParams alloc] init];
param.sdkAppId = SDKAPPID;
param.userId = _roomInfo.userID;
param.strRoomId = _roomInfo.roomID;
param.role = TRTCRoleAnchor;//进房角色
param.userSig = [GenerateTestUserSig genTestUserSig:_roomInfo.userID];
param.streamId = @"streamIdChange";//修改流id
[self.trtcCloud enterRoom:param appScene:TRTCAppSceneLIVE];
[self.trtcCloud startLocalAudiTRTCAudioQualityDefault];//音频上行采集
startLocalPreview的调用可以在enterRoom之前或之后:
前者:当调用enterRoom时自动开启上行(推流)
后者:进房后(enterRoom)再调用(startLocalPreview)才开始上行(推流)
这里的param.role的角色必须是TRTCRoleAnchor才有上行能力
上面提到的修改当前用户的默认推流的流id就是通过:param.streamId来修改的
三、实现混流A+B->A和A+B->C 废话不多说,先上代码,然后再代码详细讲解:
混流编码参数设置:
TRTCTranscodingConfig *config = [[TRTCTranscodingConfig alloc] init];
// 设置分辨率为720 × 1280, 码率为1500kbps,帧率为20FPS
config.videoWidth = 720;
config.videoHeight = 1280;
config.videoBitrate = 1500;
config.videoFramerate = 20;
config.videoGOP = 2;
config.audioSampleRate = 48000;
config.audioBitrate = 64;
config.audioChannels = 2;
config.streamId = @"ABCStream";//混流后的流id
// 采用预排版模式
config.mode = TRTCTranscodingConfigMode_Template_PresetLayout;
TRTCTranscodingConfig
是混流编码设置的一个类,其中包含我们根据业务需求设置的分辨率、码率、帧率、关键帧间隔(又称GOP)、音频采样率、音频码率、混流后的流ID、排版模式等等。
我们重点来介绍一下config.streamId:
1、如果不设置改参数,SDK会执行默认逻辑,即房间里的多路流会混合到该接口调用者的视频流上(即是上面修改的:streamIdChange),也就是A+B->A
2、如果设置该参数,SDK会将房间里的多路流混合到您指定的直播流ID上(即:ABCStream),也就是A+B->C
还有config.mode也是非常重要的一个参数,这个是指定混流排版的模式,后续会详细介绍。
设置了混流参数后,我们就得进行排版和布局了:
NSMutableArray *users = [NSMutableArray new];
// 主播摄像头的画面位置
TRTCMixUser* local = [TRTCMixUser new];
local.userId = @"$PLACE_HOLDER_LOCAL_MAIN$";
local.zOrder = 0; // zOrder 为0代表主播画面位于最底层
local.rect = CGRectMake(0, 0, 720, 1280);
local.roomID = nil; // 本地用户不用填写 roomID,远程需要
[users addObject:local];
// 连麦者的画面位置
TRTCMixUser* remote1 = [TRTCMixUser new];
remote1.userId = @"$PLACE_HOLDER_REMOTE$";
remote1.zOrder = 1;
remote1.rect = CGRectMake(720-180, 1280-500, 180, 240); //仅供参考
remote1.roomID = self.roomInfo.roomID; // 本地用户不用填写 roomID,远程需要
[users addObject:remote1];
// 连麦者的画面位置
TRTCMixUser* remote2 = [TRTCMixUser new];
remote2.userId = @"$PLACE_HOLDER_REMOTE$";
remote2.zOrder = 1;
remote2.rect = CGRectMake(400, 500, 180, 240); //仅供参考
remote2.roomID = self.roomInfo.roomID; // 本地用户不用填写 roomID,远程需要
[users addObject:remote2];
config.mixUsers = users;
// 发起云端混流
[self.trtcCloud setMixTranscodingConfig:config];
这里我使用了预排版TRTCTranscodingConfigMode_Template_PresetLayout的模式:
注意主画面local.userId的位置必须是$PLACE_HOLDER_LOCAL_MAIN$,远端画面可以使用$PLACE_HOLDER_REMOTE$或者用户id。
所有参数布局都配置好后,调用setMixTranscodingConfig方法开始混流。
四、如何判断混流的方式是否成功呢? 1、云直播控制台,查看流管理,在线流当前混流的画面的流id是哪一个
2、根据混流后的流id,使用播放域名,拼接拉流地址,使用拉流工具查看,该流id获取的画面是否为混流的画面。
至此,A+B->A和A+B->C混流方式介绍完。后续介绍服务端的实现A+B->A和A+B->C混流方式!!!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。