首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >腾讯云实时音视频客户端实现A+B->A和A+B->C混流方式

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

原创
作者头像
singleli
发布2022-11-28 00:10:20
1.4K0
发布2022-11-28 00:10:20
举报

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档