功能描述

将直播媒体流发布到 CDN (Content Delivery Network) 的过程称为 CDN 直播推流。用户无需安装 App 即可通过 Web 浏览器观看直播。

在推流到 CDN 过程中,当频道中有多个主播时,通常会涉及到转码,将多个直播流组合成单个流,并设置这个流的音视频属性和合图布局。

前提条件

请确保已开通 CDN 旁路推流功能,步骤如下:

  1. 登录控制台,点击左侧导航栏 img 按钮进入产品用量页面。
  2. 在页面左上角展开下拉列表选择需要开通 CDN 旁路推流的项目,然后点击旁路推流下的分钟数
    旁路推流服务仅适用于 Native SDK 2.4.1 及以上版本和 Web SDK 2.9.0 及以上版本,若您使用的版本较低,建议升级至新版本。
  3. 点击开启旁路推流服务
  4. 点击应用 即可开通旁路推流服务,并得到 500 个最大并发频道数。
并发频道数 N,指用户可以同时使用 N 路流进行推流转码。

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

实现方法

在实现推流到 CDN 功能前,请确保你已在项目中完成基本的音视频功能。详见开始互动直播

参考如下步骤,在你的项目中实现推流到 CDN:

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

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

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

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

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

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

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

示例代码

// Objective-C
//分配用户视窗的合图布局。
AgoraLiveTranscodingUser *user = [[AgoraLiveTranscodingUser alloc] init];
// 下面的 uid 应和 joinChannel() 输入的 uid 保持一致。
user.uid = 12345;
user.rect = CGRectMake(0, 0, 640, 720);
user.audioChannel = 0;

AgoraRtcEngineKit *rtcEngine = [AgoraRtcEngineKit sharedEngineWithAppId:@"" delegate:nil];
// CDN 推流参数设置。
AgoraLiveTranscoding *transcoding = [[AgoraLiveTranscoding alloc] init];
transcoding.audioSampleRate = AgoraAudioSampleRateType44100;
transcoding.audioChannels = 2;
transcoding.audioBitrate = 48;
// 用于旁路推流的输出视频流的 width × height (px)。360 x 640 为默认值。
transcoding.size = CGSizeMake(360, 640);
// 设置推流输出视频的码率 (Kbps),默认值为 400。
transcoding.videoBitrate = 400;
// 用于旁路推流的输出视频的帧率 (fps)。默认值为 15。取值范围为 [1,30],Agora 服务器会将高于 30 的帧率设置改为 30。
transcoding.videoFramerate = 30;
// 推流输出视频的编码规格。可以设置为 Baseline (66)、Main (77) 或 High (100)。如果设置其他值,Agora 会统一设为默认值 High (100)。
transcoding.videoCodecProfile = AgoraVideoCodecProfileTypeHigh;
transcoding.transcodingUsers = @[user];

// CDN 推流参数设置。注意:调用这个接口前提是需要转码;否则,就不要调用这个接口。
[rtcEngine setLiveTranscoding:transcoding];

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

// 删除一个推流地址。
[rtcEngine removePublishStreamUrl:streamUrl];

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

../_images/sei_2host.png
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:三人纵向平铺

../_images/sei_3host.png
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 人悬浮小窗

../_images/sei_random.png
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

同时,我们在 GitHub 提供一个开源的 Live-Streaming 示例项目。

API 参考

开发注意事项

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