TRTCCloud 混流接口 setMixTranscodingConfig 使用指引

场景

当一个音视频房间中同时有多路音视频流时,可能就需要用到混流转码,把多条音视频流转成一路,这样既便于录制存储,也便于旁路推流到直播 CDN 上。目前TXLiteAVSDK_TRTC的方案是:

1、在控制台实时音视频服务下功能配置启用自动旁路直播,如果混流画面需要录制存储还需要启用旁路直播自动录制,参考:https://cloud.tencent.com/document/product/647/16826#.E5.A6.82.E4.BD.95.E5.BC.80.E5.90.AF.E6.97.81.E8.B7.AF.E6.9C.8D.E5.8A.A1

2、当需要混流的时候客户端直接调用setMixTranscodingConfig,并传入对应参数,这个时候SDK内部会组装请求并请求腾讯云后台;

3、混流成功后可以通过获取旁路地址播放:https://cloud.tencent.com/document/product/647/16826#.E5.A6.82.E4.BD.95.E8.8E.B7.E5.8F.96.E6.92.AD.E6.94.BE.E5.9C.B0.E5.9D.80

流程图

代码示例

  • 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出于降低复杂度做了这一层处理。混流接口文档参考:https://cloud.tencent.com/document/product/267/8832#.E6.8E.A5.E5.8F.A3.E6.8F.8F.E8.BF.B0

{
    "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,"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}
  • 旁路播放效果
混流效果示例
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354