腾讯云实时音视频客户端实现A+B->A和A+B->C混流方式

2022-11-28 00:10:20 浏览数 (2)

上一篇文章介绍了腾讯云实时音视频的两种混流方式分别是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代码为例

准备进房的视频编码参数:

代码语言:javascript复制
// 视频编码参数
TRTCVideoEncParam * videoEncParam = [[TRTCVideoEncParamalloc] init];
videoEncParam.resMode = TRTCVideoResolutionModePortrait;
videoEncParam.videoResolution = TRTCVideoResolution_960_720;
videoEncParam.videoBitrate = 1200;
videoEncParam.videoFps = 15;
videoEncParam.enableAdjustRes = NO;
[self.trtcCloudsetVideoEncoderParam:videoEncParam];

网络相关参数:

代码语言:javascript复制
// 网络流控相关参数
TRTCNetworkQosParam * networkQosParam = [[TRTCNetworkQosParam alloc] init];
networkQosParam.preference = TRTCVideoQosPreferenceClear; // 保清晰
[self.trtcCloud setNetworkQosParam:networkQosParam];
画面渲染参数(经常出现的画面显示不完整、被裁减、有黑边等):
代码语言:javascript复制
//画面渲染参数
TRTCRenderParams *renderParams = [[TRTCRenderParams alloc] init];
/*
TRTCVideoFillMode_Fill = 0, ///< 图像铺满屏幕,超出显示视窗的视频部分将被裁剪
TRTCVideoFillMode_Fit = 1, ///< 图像长边填满屏幕,短边区域会被填充黑色
*/
renderParams.fillMode = TRTCVideoFillMode_Fit;
[self.trtcCloud setLocalRenderParams:renderParams];

进房参数:

代码语言:javascript复制
[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 废话不多说,先上代码,然后再代码详细讲解:

混流编码参数设置:

代码语言:javascript复制
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也是非常重要的一个参数,这个是指定混流排版的模式,后续会详细介绍。

设置了混流参数后,我们就得进行排版和布局了:

代码语言:javascript复制
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混流方式!!!

0 人点赞