Agora SDK 提供旁路推流的功能,能将主播的音视频流由 Agora 私有协议转换为标准协议(RTMP 和 RTMPS),然后推到 CDN。CDN 观众点击对应的 URL 即可观看直播。该功能可以丰富直播媒体流的分发渠道,利于推广直播。
第一次使用旁路推流,需要开通服务,步骤如下:
登录控制台,在项目管理页面,选择需要开通输入旁路推流服务的项目,点击配置。
在编辑项目页面的实时互动拓展能力模块找到旁路推流,点击启用。
启用客户端 SDK API。启用后不能关闭。
仔细阅读弹窗提示,点击保存。成功开启旁路推流服务后,启用按钮会切换为配置按钮,用于配置旁路推流。
开通成功后你可以在用量页面看到旁路推流的使用情况。
为降低旁路推流集成难度,自 3.6.0 版起,Agora 优化了推流 API 设计,并改善了推流客户端和服务端内部对网络问题的处理机制,详见发版说明。本节介绍如何使用 3.6.0 和之后版 SDK 实现推流。如需使用早于 3.6.0 版 SDK 实现推流,请参考更早版本的实现方法。
你可以根据直播场景实现不同的推流方式:转码推流、非转码推流。转码功能本质是一个编解码的功能,用于将多路音视频流合成一路音视频流,可以保障观众看到的多位主播直播的同步性。因此,一般来说,多人连麦直播的场景下,旁路推流时需要开启转码功能;单主播直播时,只向 CDN 推送一路媒体流,不用开启转码功能。
你可以参考转码推流 API 调用时序图和如下步骤实现转码推流。
调用 startRtmpStreamWithTranscoding
并传入旁路推流地址和转码属性配置,从而开始向一个 CDN 地址进行转码推流。
transcodingUsers
为必填,其余属性你可以自定义或使用默认值。start
方法。start
后,请确保在收到 rtmpStreamingChangedToState
回调报告推流状态为 RUNNING(2)
后再执行其他操作。如果你收到其他推流状态,请参考旁路推流异常处理的最佳实践。你可以根据场景变化,调用 updateRtmpTranscoding
动态更新转码属性,如调整主播人数、主播的画面布局。转码属性更新成功后,SDK 会触发 rtcEngineTranscodingUpdated
回调。
调用 stopRtmpStream
并传入待结束推流的 CDN 地址,从而结束当前推流。
stop
并填入对应的推流地址。rtmpStreamingChangedToState
回调报告推流状态为 IDLE(0)
。如果收到其他推流状态,请参考旁路推流异常处理的最佳实践。你可以参考非转码推流 API 调用时序图和如下步骤实现非转码推流。
参考实现视频直播或实现音频直播实现基本的音视频功能。其中,joinChannelByToken
方法的 uid
参数不能留空或传 0,否则频道内主播无法推送出媒体流。
调用 startRtmpStreamWithoutTranscoding
并传入旁路推流地址,从而开始向一个 CDN 地址进行非转码推流。
start
方法。start
后,请确保在收到 rtmpStreamingChangedToState
回调报告推流状态为 RUNNING(2)
后再执行其他操作。如果你收到其他推流状态,请参考旁路推流异常处理的最佳实践。
调用 stopRtmpStream
并传入待结束推流的 CDN 地址,从而结束当前推流。
stop
并填入对应的推流地址。rtmpStreamingChangedToState
回调报告推流状态为 IDLE(0)
。如果收到其他推流状态,请参考旁路推流异常处理的最佳实践。为展示开始推流、动态更新推流转码属性、异常情况下重试推流的代码逻辑,Agora 在 GitHub 提供开源示例项目,详见 RTMPStreaming (iOS) 或 RTMPStreaming (macOS)。
本节提供使用旁路推流功能时常用的参考信息。
设置转码输出媒体流的视频分辨率、帧率和码率时,Agora 推荐你使用默认值。你也可以参考下表设值。如果设置的码率超出合理范围,Agora 服务器会在合理区间内自动调整码率。
分辨率 | 帧率 (fps) | 码率 (Kbps) |
---|---|---|
160 × 120 | 15 | 130 |
120 × 120 | 15 | 100 |
320 × 180 | 15 | 280 |
180 × 180 | 15 | 200 |
240 × 180 | 15 | 240 |
320 × 240 | 15 | 400 |
240 × 240 | 15 | 280 |
424 × 240 | 15 | 440 |
640 × 360 | 15 | 800 |
360 × 360 | 15 | 520 |
640 × 360 | 30 | 1200 |
360 × 360 | 30 | 800 |
480 × 360 | 15 | 640 |
480 × 360 | 30 | 980 |
640 × 480 | 15 | 1000 |
480 × 480 | 15 | 800 |
640 × 480 | 30 | 1500 |
480 × 480 | 30 | 1200 |
848 × 480 | 15 | 1220 |
848 × 480 | 30 | 1860 |
640 × 480 | 10 | 800 |
1280 × 720 | 15 | 2260 |
1280 × 720 | 30 | 3420 |
960 × 720 | 15 | 1820 |
960 × 720 | 30 | 2760 |
本节介绍如何使用早于 3.6.0 版的 SDK 实现推流:
频道内主播可以调用 setLiveTranscoding
方法设置音视频流的转码属性,如分辨率、码率、帧率、水印。如果你需要多主播转码合图,请在 transcodingUsers
类中设置每个主播的参数。
addPublishStreamUrl
方法并设置 transcodingEnabled (NO)
。频道内主播可以调用 addPublishStreamUrl
方法向旁路推流直播中增加指定的一路媒体流。推流地址可以在推流后动态增删。
transcodingEnabled
设置是否转码推流。(可选)频道内主播再次调用 setLiveTranscoding
方法更新音视频流的转码属性。
rtcEngineTranscodingUpdated
回调会被触发并向主播报告更新信息。频道内主播可以调用 removePublishStreamUrl
方法向旁路推流直播中删除指定的一路媒体流。
推流状态改变时,SDK 会触发 rtmpStreamingChangedtoState
回调向主播报告当前推流状态。请确保收到该回调后再调用 API 进行下一步操作。如果增加或删除一个推流地址失败,请参考旁路推流异常处理的最佳实践。
// Objective-C
// 分配主播的画面布局。
AgoraLiveTranscodingUser *user = [[AgoraLiveTranscodingUser alloc] init];
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 × 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];
实现推流功能时,Agora 推荐使用的 API:
startRtmpStreamWithoutTranscoding
startRtmpStreamWithTranscoding
updateRtmpTranscoding
stopRtmpStream
rtcEngineTranscodingUpdated
rtmpStreamingChangedtoState
rtmpStreamingEventWithUrl
实现推流功能时,依然可用但 Agora 不推荐的 API:
setLiveTranscoding
addPublishStreamUrl
removePublishStreamUrl
streamPublishedWithUrl
streamUnpublishedWithUrl
使用旁路推流功能时,你可能还需参考如下文档: