TRTC v2混流接口setMixTranscodingConfig使用指引

场景

当一个音视频房间中同时有多路音视频流时,可能就需要用到混流转码,把多条音视频流转成一路,这样既便于录制存储,也便于旁路推流到直播 CDN 上。目前TXLiteAVSDK_TRTC的方案是: 1、在控制台实时音视频服务下功能配置启用自动旁路直播,如果混流画面需要录制存储还需要启用旁路直播自动录制,参考:CDN旁路推流 2、当需要混流的时候客户端直接调用setMixTranscodingConfig,并传入对应参数,这个时候SDK内部会组装请求并请求腾讯云后台; 3、混流成功后可以通过获取旁路地址播放

代码示例

  • Objective-C
//云端混流转码的示例代码
- (void)enableTranscoding
{
    TRTCTranscodingConfig *config = [[TRTCTranscodingConfig alloc] init];
    config.appId = xxxxxxxxxx;      //appid和bizid可以在腾讯云控制台账号信息里面查到
    config.bizId = xxxx;
    config.videoWidth      = 540;
    config.videoHeight     = 960;
    config.videoBitrate    = 1200;
    config.videoFramerate  = 20;
    config.videoGOP        = 2;
    config.audioSampleRate = 48000;
    config.audioBitrate    = 64;
    config.audioChannels   = 2;

    TRTCMixUser *user1 = [[TRTCMixUser alloc] init];
    user1.userId = @"Web_trtc_03";
    user1.zOrder = 0;
    user1.rect = CGRectMake(0, 0, 540, 960);
//    user1.streamType = TRTCVideoStreamTypeBig;

    TRTCMixUser *user2 = [[TRTCMixUser alloc] init];
    user2.userId = @"Web_trtc_04";
    user2.zOrder = 1;
    user2.rect = CGRectMake(380, 630, 160, 240);
//    user2.streamType = TRTCVideoStreamTypeBig;
    config.mixUsers = @[user1,user2];

    [_trtc setMixTranscodingConfig:config];      //启动混流
}
  • Android
//开启云端混流转码
public void enableTranscoding() {
    TRTCCloudDef.TRTCTranscodingConfig config = new TRTCCloudDef.TRTCTranscodingConfig();
        // 设置分辨率为 1280x720, 码率为 1500kbps
        config.appId = xxxxxxxxxx;
        config.bizId = xxxx;
        config.videoWidth = 368;
        config.videoHeight = 640;
        config.videoBitrate = 1500;
        config.videoGOP = 2;
        config.videoFramerate = 30;
        config.audioSampleRate = 48000;
        config.audioBitrate = 64;
        config.audioChannels = 2;

        // 设置混流后主播的画面位置
        TRTCCloudDef.TRTCMixUser broadCaster = new TRTCCloudDef.TRTCMixUser();
        broadCaster.userId = "Web_trtc_01"; // 以主播uid为broadcaster为例
        // 铺满屏幕并放到最下面
        broadCaster.zOrder = 0;
        broadCaster.x = 0;
        broadCaster.y = 0;
        broadCaster.width = 368;
        broadCaster.height = 640;

        TRTCCloudDef.TRTCMixUser audience = new TRTCCloudDef.TRTCMixUser();
        audience.userId = "Web_trtc_02"; // 以观众uid为audience为例
        // 放到左下角,置于主播画面之上
        audience.zOrder = 1;
        audience.x = 178;
        audience.y = 310;
        audience.width = 180;
        audience.height = 320;

        config.mixUsers = new ArrayList<>();
        config.mixUsers.add(broadCaster);
        config.mixUsers.add(audience);

        trtcCloud.setMixTranscodingConfig(config);
}

  • C++
// 开启云端混流转码
void enableTranscoding()
{
    TRTCTranscodingConfig config;
    config.appId = xxxxxxxxxx;      //appid和bizid可以在腾讯云控制台账号信息里面查到
    config.bizId = xxxx;
    // 设置分辨率为 1280x720, 码率为 1500kbps
    config.videoWidth = 1080;   
    config.videoHeight = 720;
    config.videoBitrate = 1500; 
    config.audioSampleRate = 48000;
    config.audioBitrate = 64;
    config.audioChannels = 2;

    std::vector<TRTCMixUser> mixUsers;

    // 设置混流后主播的画面位置
    TRTCMixUser broadCaster;
    broadCaster.userId = "broadcaster"; // 以主播uid为broadcaster为例
    broadCaster.zOrder = 0; // 铺满屏幕并放到最下面
    broadCaster.rect.left = 0;
    broadCaster.rect.top = 0;
    broadCaster.rect.right = 1280;
    broadCaster.rect.bottom = 720;

    // 设置观众位置, 以一个观众放到左下角为例, 左下角边距10个象素
    TRTCMixUser audience;
    audience.userId = "audience"; // 以观众uid为audience为例
    audience.zOrder = 1;    // 放到左下角,置于主播画面之上
    audience.rect.left = 920;
    audience.rect.top = 480;
    audience.rect.right = 1080;
    audience.rect.bottom = 720;

    mixUsers.push_back(std::move(broadCaster));
    mixUsers.push_back(std::move(audience));

    config.mixUsersArray = &mixUsers[0]; // 要求 mixUsers 非空
    config.mixUsersArraySize = mixUsers.size();

    trtcCloud->setMixTranscodingConfig(config);
}


 

原理解释

这里以iOS端为例,参考上述代码调用setMixTranscodingConfig接口后,SDK内部会转化成如下请求,实际上开发者也可以使用下面这种方式自己请求,这样更加灵活,SDK出于降低复杂度做了这一层处理。混流接口文档参考:云直播api 2017 -云端混流

  • 请求url:
http://fcgi.video.qcloud.com/common_access?appid=1252500000&interface=Mix_StreamV2&t=t&sign=sign
请求体
{
  "domain":"2157.live.push.com",
  "interface":"set_live_mix_transcoding",
  "session_id":"2157_bf49b24917d4f42543ef886f601134da",
  "event_id":1551428085,
  "output_param":{
      "output_audio_channels":2,
      "output_stream_gop":2,
      "output_sei":"{}",
      "output_stream_type":0,
      "output_stream_id":"2157_bf49b24917d4f42543ef886f601134da",
      "output_audio_sample_rate":48000,
      "output_audio_bitrate":64,
      "output_stream_frame_rate":20,
      "output_stream_bitrate":1200
  },
  "path":"live",
  "timestamp":1551428085,
  "appid":1251783440,
  "input_stream_list":[
      {
          "input_stream_id":"canvas1",
          "layout_params":{
              "image_layer":1,
              "color":"0x000000",
              "input_type":3,
              "image_width":540,
              "location_x":0,
              "image_height":960,
              "location_y":0
          }
      },
      {
          "input_stream_id":"2157_bf49b24917d4f42543ef886f601134da",
          "layout_params":{
              "location_y":0,
              "image_layer":2,
              "image_width":540,
              "image_height":960,
              "location_x":0
          }
      },
      {
          "input_stream_id":"2157_1ec16ae5326160affe9f6e3117e5b918",
          "layout_params":{
              "location_y":630,
              "image_layer":3,
              "image_width":160,
              "image_height":240,
              "location_x":380
          }
      }
  ]
}
  • 响应结果,code返回0代表成功,返回其它状态码说明混流失败,可以参考文档里面常见错误码说明

混流成功响应示例:

{"code":0,"event_id":"1551428085","message":"","timestamp":1551428085}

混流失败响应示例:

{"code":256,"event_id":"1551430294","message":"upload report get usr info failed, dal_config.GetLiveUserInfoByAppid ret: config no exist, appid: 1251783441","timestamp":1551430295}
  • 旁路播放效果

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏视频咖

腾讯视频云 LiteAVSDK 更新公告

腾讯视频云 LiteAVSDK 升级到 5.4.6097 SDK 内核优化 iOS&Android:优化网络协议算法,直播推流抗 30% 丢包无压力; iOS...

55450
来自专栏视频咖

腾讯云直播 新年新定价!

? ? 2018已经过去,新年越来越近。在过去的一年里,腾讯云直播不断地进行功能的迭代更新和技术的升级,竭力为客户提供更加优质、稳定、安全的直播服务。 感谢云...

29520
来自专栏视频咖

带你脱离视频测试的坑

小编这次分享主要是视频相关的专项测试,音频相关的暂不涉及。 我们直接切入正题,关于视频通话质量对比,需要一些对比项,这里是从以下5个方面进行数据对比:码率、帧...

23660
来自专栏直播系统开发

浅谈网络直播系统开发的“三步曲”

随着网络直播市场的日益规范,网络直播系统开发也受到了更多人的关注,有人说网络直播系统开发是有一定难度的,但如今视频直播的普及,使得很多技术难题被攻克,程序开发方...

22430
来自专栏短视频开发

直播平台建设过程中不可或缺的推送功能

要想运营好一个直播平台,需要各方各面的工作和技术相结合完成,而消息推送就是直播app中十分重要的一个部分。App内的消息推送不仅能够给用户提供通知信息,提高用户...

8800
来自专栏视频咖

微信公开课:解密小程序视频客服解决方案

? 就在前天(1月9日),为期两天的微信公开课PRO又一次如期而至。除了微信之父张小龙的4小时演说外,这次微信公开课PRO还带来了各行业中关于微信和微信小程序...

27630
来自专栏短视频开发

app直播源码“助力”直播架构,走上探索之路

对于直播app的开发来讲,app直播源码是一个非常重要的存在。直播架构在开发过程中也是一件非常重要的事情,如果架构的设立不能从根本上解决问题或防止问题的发生,那...

17210
来自专栏云市场·精选汇

行业 | 2018年,哪些行业在悄然进行数字化转型?

经历了2017年的快速升温,2018年电子合同市场发展可以用一个词来形容“迅猛”!在这一年,除了技术与用户习惯日趋成熟等因素外,《电子商务法》的出台,房地产行业...

26760
来自专栏直播系统开发

流媒体直播系统传输协议很重要,直播平台搭建该如何选择

2019年直播行业面临着来势汹汹的短视频挑战,但在垂直细分领域,网络直播平台依旧有着难以企及的位置。如今,直播平台搭建的势头依旧没有减弱,只是更多的人想要将直播...

19600
来自专栏视频咖

云端混流转码--直播连麦技术解决方案

? 春运来了,在各地车站码头的年味就是回家的味道。无论人潮多拥挤、路途多艰辛,为了回到温暖的目的地——家,对于在外漂泊的游子来说,路上辛苦点又算什么。小编为旅...

50930

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励