云端混流转码

最近更新时间:2019-08-06 19:46:26

内容介绍

如果一个音视频房间里只有一路音视频流,这时是不需要混流的。当一个音视频房间中同时有多路音视频流时,就需要混流转码,把多条音视频流转成一路,这样既便于录制存储,也便于旁路推流到直播 CDN 上。

您也可以通过 TRTCCloud 中提供的 setMixTranscodingConfig 接口,启动云端的混流转码,这样就可以将多路画面混合到一路直播流上,如下图所示:

支持的平台

iOS Android Mac OS Windows 微信小程序 Chrome 浏览器

注意:

微信小程序和 H5 上暂时还不支持移动和 PC 端的混流接口(setMixTranscodingConfig),不过您可以使用云直播的 REST API 实现该功能。

混流的原理

混流转码过程中,云端会把记录画面都进行解码,然后对画面进行混合拼接,之后再对拼接后的画面进行编码,从而生成新的音视频流。

由于混流和转码都需要对原来的音视频数据进行解码和二次编码,所以需要更长的处理时间。因此,混合画面的实际观看时延要比独立画面的多出1 - 2秒。

参考代码

调用 TRTCCloud 的 setMixTranscodingConfig 接口可以通知云端启动混流转码。
由于画面的拼接是需要您来指定各个画面的相对位置的,所以需要您在启动混流前设置 TRTCTranscodingConfig 参数。

  • Objective-C
//云端混流转码的示例代码
- (void)enableTranscoding
{
    TRTCTranscodingConfig *config = [[TRTCTranscodingConfig alloc] init];
    // 设置分辨率为1280 × 720, 码率为1500kbps
    config.videoWidth      = 1280;
    config.videoHeight     = 720;
    config.videoBitrate    = 1500;
    config.videoFramerate  = 20;
    config.videoGOP        = 2;
    config.audioSampleRate = 48000;
    config.audioBitrate    = 64;
    config.audioChannels   = 2;

    // 设置混流后主播的画面位置
    TRTCMixUser *broadCaster = [[TRTCMixUser alloc] init];
    broadCaster.userId = @"broadcaster"; // 以主播 userId 为 broadcaster 为例
    broadCaster.zOrder = 0; // 铺满屏幕并放到最下面
    broadCaster.rect = CGRectMake(0, 0, 1080, 720);

    // 设置观众位置, 以一个观众放到左下角为例, 左下角边距10个象素
    TRTCMixUser *audience = [[TRTCMixUser alloc] init];
    audience.userId = @"audience"; // 以观众 userId 为 audience 为例
    audience.zOrder = 1;    // 置于主播画面之上
    audience.rect = CGRectMake(10, 470, 360, 240); //放到左下角

    config.mixUsers = @[broadcaster, audience];
    [trtcCloud setMixTranscodingConfig:config];
}
  • Java
//开启云端混流转码
public void enableTranscoding() {
    TRTCCloudDef.TRTCTranscodingConfig config = new TRTCCloudDef.TRTCTranscodingConfig();
    // 设置分辨率为1280 × 720, 码率为1500kbps
    config.videoWidth = 1080;
    config.videoHeight = 720;
    config.videoBitrate = 1500;
    config.audioSampleRate = 48000;
    config.audioBitrate = 64;
    config.audioChannels = 2;

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

    TRTCCloudDef.TRTCMixUser audience = new TRTCCloudDef.TRTCMixUser();
    audience.userId = "audience"; // 以观众 userId 为 audience 为例
    // 放到左下角,置于主播画面之上
    audience.zOrder = 1;
    audience.x = 10;
    audience.y = 470;
    audience.width = 360;
    audience.height = 240;

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

    trtcCloud.setMixTranscodingConfig(config);
}
  • C++
// 开启云端混流转码
void enableTranscoding()
{
    TRTCTranscodingConfig config;
    // 设置分辨率为1280 × 720, 码率为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"; // 以主播 userId 为 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"; // 以观众 userId 为 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);
}
  • C#
// 开启云端混流转码
private void enableTranscoding()
{
    TRTCTranscodingConfig config = new TRTCTranscodingConfig();
    // 设置分辨率为1280 × 720, 码率为1500kbps
    config.videoWidth = 1080;   
    config.videoHeight = 720;
    config.videoBitrate = 1500; 
    config.audioSampleRate = 48000;
    config.audioBitrate = 64;
    config.audioChannels = 2;

    TRTCMixUser[] mixUsers = new TRTCMixUser[2];  // 长度由混流画面个数而定

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

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

    mixUsers[0] = broadCaster;
    mixUsers[1] = audience;

    config.mixUsersArray = mixUsers; // 要求 mixUsers 非空
    config.mixUsersArraySize = mixUsers.Count;

    mTRTCCloud.setMixTranscodingConfig(config);
}