服务端推流到CDN

最近更新时间:2022-09-20 05:17:40

功能描述

旁路直播(服务端推流到CDN)指将正在进行音视频互动的音视频流推流给第三方CDN(Content Delivery Network),支持直接推送源流和推送混合流,观看用户无需集成 APP 即可通过 Web 浏览器的方式观看直播。

同房间或不同房间的多个主播通过 RTC 将媒体数据推送到 RTN 实时通信网络,后台经过转码和布局设置将多个主播流混合成单个流(即多个视频画面混合成一个视频画面,或是多路音频合成一路音频),并设置这个流的音视频属性。

CDN推流 推流到 CDN

前提条件

开通 CDN 旁路推流功能,步骤如下:

  1. 登录控制台,点击左侧导航栏用量统计 按钮进入用量统计页面。
  2. 在页面左上角展开下拉列表选择需要开通 CDN 旁路推流的项目,然后点击旁路推流下的分钟数

3. 点击开启旁路推流。 4. 确定开通旁路推流服务。

开通成功后,你可以在用量页面看到旁路推流的使用情况。

实现方法

在实现推流到 CDN 功能前,请确保你已在项目中完成基本的音视频功能。

操作步骤

  1. 频道内主播可以调用 setLiveTranscoding 方法设置音视频流的直播参数 (LiveTranscoding),如分辨率、码率、帧率、水印和背景色位置。如果你需要多主播转码合图,请在 TranscodingUser 类中设置每个主播的参数,详见示例代码

  2. 频道内主播可以调用 addPublishStreamUrl 方法向 CDN 推流直播中增加指定的一路媒体流。推流地址可以在推流后动态增删。

    请通过 transcodingEnabled 设置是否转码推流。

  3. (可选)频道内主播再次调用 setLiveTranscoding 方法更新音视频流的直播参数 (LiveTranscoding)。

    直播参数(LiveTranscoding)更新时,onTranscodingUpdated 回调会被触发并向主播报告更新信息。

  4. 频道内主播可以调用 removePublishStreamUrl 方法向 CDN 推流直播中删除指定的一路媒体流。

推流状态改变时,SDK 会触发 onRtmpStreamingStateChanged 回调向主播报告当前推流状态。请确保收到该回调后再调用 API 进行下一步操作。如果增加或删除一个推流地址失败,请通过错误码排查问题。更多问题请参考注意事项

示例代码

// C++
// CDN 推流参数设置。
LiveTranscoding config;
config.audioSampleRate = TYPE_44100;
config.audioChannels = 2;
config.audioBitrate = 48;
// 用于旁路推流的输出视频流的总宽度 (px)。360 为默认值。
config.width = 360;
// 用于旁路推流的输出视频流的总高度 (px)。640 为默认值。
config.height = 640;
// 设置推流输出视频的码率 (Kbps),默认值为 400。
cofig.videoBitrate = 400;
// 用于旁路推流的输出视频的帧率 (fps)。默认值为 15。取值范围为 [1,30],anyRTC 服务器会将高于 30 的帧率设置改为 30。
config.videoFramerate = 15;
// 如果 userCount > 1,则需要为每个 transcodingUser 分别设置布局。
config.userCount = 1; 
// 推流输出视频的编码规格。可以设置为 Baseline (66)、Main (77) 或 High (100)。如果设置其他值,anyRTC 会统一设为默认值 High (100)。
config.videoCodecProfile = HIGH;

// 分配用户视窗的合图布局。
config.transcodingUser = new TranscodingUser[config.userCount];
// 下面的 uid 应和 joinChannel() 输入的 uid 保持一致。
config.transcodingUser[0].uid = 123456; 
config.transcodingUser[0].x = 0;
config.transcodingUser[0].audioChannel = 0;
config.transcodingUser[0].y = 0;
config.transcodingUser[0].width = 640;
config.transcodingUser[0].height = 720;

// CDN 推流参数设置。注意:调用这个接口前提是需要转码;否则,就不要调用这个接口。
m_rtcEngine->setLiveTranscoding(config);

// 添加一个推流地址。transcodingEnabled 设置为 true,表示开启转码。如开启,则必须通过 setLiveTranscoding 接口配置 LiveTranscoding 类。单主播模式下,我们不建议使用转码。
m_rtcEngine->addPublishStreamUrl(url, true);

 if (config.transcodingUsers)
   {
      delete[] config.transcodingUsers;
   }

// 删除一个推流地址。
m_rtcEngine->removePublishStreamUrl(url);

合图示例1:两人横向平铺

Canvas:
     width: 640
     height: 360
     backgroundColor: #FFFFFF

User0:
      userId: 123
      x: 0
      y: 0
      width: 320
      height: 360
      zOrder: 1
      alpha: 1.0

User1:
      userId: 456
      x: 320
      y: 0
      width: 320
      height: 360
      zOrder: 1
      alpha: 1.0

合图示例2:三人纵向平铺

Canvas:
      width: 360
      height: 640
      backgroundColor: #FFFFFF

   User0:
      userId: 123
      x: 0
      y: 0
      width: 360
      height: 640
      zOrder: 1
      alpha: 1.0

   User1:
       userId: 456
       x: 0
       y: 320
       width: 180
       height: 320
       zOrder: 2
       alpha: 1.0

   User2:
       userId: 789
       x: 180
       y: 320
       width: 180
       height: 320
       zOrder: 2
       alpha: 1.0

合图示例3:1 人全屏 + N 人悬浮小窗

Canvas:
   width: 360
   height: 640
   backgroundColor: #FFFFFF

User0:
   userId: 123
   x: 0
   y: 0
   width: 360
   height: 640
   zOrder: 1
   alpha: 1.0

User1:
    userId: 456
    x: 45
    y: 390
    width: 110
    height: 213
    zOrder: 2
    alpha: 1.0

User2:
    userId: 789
    x: 185
    y: 390
    width: 110
    height: 213
    zOrder: 2
    alpha: 1.0

API 参考

注意事项

  • 同一频道内最多支持 50 位主播。
  • 推流转码时,anyRTC 会收取转码费用。
  • 如果对单主播不经过转码直接推流,请略过步骤 1,直接调用 addPublishStreamUrl 方法并将 transcodingEnabled 参数设置为 false
  • 你可以参考视频分辨率表格设置 videoBitrate 的值。如果设置的码率超出合理范围,anyRTC 服务器会在合理区间内自动调整码率值。
  • 请确保转码推流和非转码推流中使用的流地址不同。