将直播媒体流发布到 CDN (Content Delivery Network) 的过程称为 CDN 直播推流。用户无需安装 App 即可通过 Web 浏览器观看直播。
在推流到 CDN 过程中,当频道中有多个主播时,通常会涉及到转码,将多个直播流组合成单个流,并设置这个流的音视频属性和合图布局。
请确保已开通 CDN 旁路推流功能,步骤如下:
开通成功后,你可以在用量页面看到旁路推流的使用情况。
在实现推流到 CDN 功能前,请确保你已在项目中完成基本的音视频功能。详见开始互动直播。
参考如下步骤,在你的项目中实现推流到 CDN:
频道内主播可以调用 setLiveTranscoding
方法设置音视频流的直播参数 (AgoraLiveTranscoding
),如分辨率、码率、帧率、水印和背景色位置。如果你需要多主播转码合图,请在 transcodingUsers
类中设置每个主播的视频参数,详见示例代码。
频道内主播可以调用 addPublishStreamUrl
方法向 CDN 推流直播中增加指定的一路媒体流。推流地址可以在推流后动态增删。
请通过
transcodingEnabled
设置是否转码推流。
(可选)频道内主播再次调用 setLiveTranscoding
方法更新音视频流的直播参数 (AgoraLiveTranscoding
)。
直播参数(
AgoraLiveTranscoding
)更新时,rtcEngineTranscodingUpdated
回调会被触发并向主播报告更新信息。
频道内主播可以调用 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:两人横向平铺
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
同时,我们在 GitHub 提供一个开源的 Live-Streaming 示例项目。
setLiveTranscoding
addPublishStreamUrl
removePublishStreamUrl
rtcEngineTranscodingUpdated
rtmpStreamingStateChangedtoState