声网 SDK 提供旁路推流的功能,能将主播的音视频流由声网私有协议转换为标准协议(RTMP 和 RTMPS),然后推到 CDN。CDN 观众点击对应的 URL 即可观看直播。该功能可以丰富直播媒体流的分发渠道,利于推广直播。
第一次使用旁路推流,需要开通服务,步骤如下:
登录控制台,在项目管理页面,选择需要开通输入旁路推流服务的项目,点击配置。
在项目配置页面选择服务配置,在旁路推流模块点击启用。
启用客户端 SDK API。启用后不能关闭。
仔细阅读弹窗提示,点击保存。成功开启旁路推流服务后,启用按钮会切换为配置按钮,用于配置旁路推流。
开通成功后你可以在用量页面看到旁路推流的使用情况。
为降低旁路推流集成难度,自 3.6.0 版起,声网优化了推流 API 设计,并改善了推流客户端和服务端内部对网络问题的处理机制,详见发版说明。本节介绍如何使用 3.6.0 和之后版 SDK 实现推流。如需使用早于 3.6.0 版 SDK 实现推流,请参考更早版本的实现方法。
你可以根据直播场景实现不同的推流方式:转码推流、非转码推流。转码功能本质是一个编解码的功能,用于将多路音视频流合成一路音视频流,可以保障观众看到的多位主播直播的同步性。因此,一般来说,多人连麦直播的场景下,旁路推流时需要开启转码功能;单主播直播时,只向 CDN 推送一路媒体流,不用开启转码功能。
你可以参考转码推流 API 调用时序图和如下步骤实现转码推流。
调用 startRtmpStreamWithTranscoding
并传入来自 CDN 厂商的旁路推流地址和你设置的转码属性,从而开始向一个 CDN 地址进行转码推流。
userCount
和 transcodingUsers
为必填,其余属性你可以自定义或使用默认值。start
方法。start
后,请确保在收到 onRtmpStreamingStateChanged
回调报告推流状态为 RUNNING(2)
后再执行其他操作。如果你收到其他推流状态,请参考旁路推流异常处理的最佳实践。你可以根据场景变化,调用 updateRtmpTranscoding
动态更新转码属性,如调整主播人数、主播的画面布局。转码属性更新成功后,SDK 会触发 onTranscodingUpdated
回调。
调用 stopRtmpStream
并传入待结束推流的 CDN 地址,从而结束当前推流。
stop
并填入对应的推流地址。onRtmpStreamingStateChanged
回调报告推流状态为 IDLE(0)
。如果收到其他推流状态,请参考旁路推流异常处理的最佳实践。你可以参考非转码推流 API 调用时序图和如下步骤实现非转码推流。
参考实现视频直播或实现音频直播实现基本的音视频功能。其中,joinChannel
方法的 uid
参数不能留空或传 0,否则频道内主播无法推送出媒体流。
调用 startRtmpStreamWithoutTranscoding
并传入来自 CDN 厂商的旁路推流地址,从而开始向一个 CDN 地址进行非转码推流。
start
方法。start
后,请确保在收到 onRtmpStreamingStateChanged
回调报告推流状态为 RUNNING(2)
后再执行其他操作。如果你收到其他推流状态,请参考旁路推流异常处理的最佳实践。
调用 stopRtmpStream
并传入待结束推流的 CDN 地址,从而结束当前推流。
stop
并填入对应的推流地址。onRtmpStreamingStateChanged
回调报告推流状态为 IDLE(0)
。如果收到其他推流状态,请参考旁路推流异常处理的最佳实践。为展示开始推流、动态更新推流转码属性、异常情况下重试推流的代码逻辑,声网在 GitHub 提供开源示例项目,详见 RTMPStream。
声网推荐你根据转码输出的实际视频效果控制参与转码的主播人数,且同一频道内不得超出 17 人。
一次推流代表一个推流任务。最大并发任务数(PCW)默认为 200,表示允许你在一个声网项目下最多同时运行 200 个推流任务。如需更高配额,请联系技术支持。
客户端推流支持的视频属性上限为:分辨率 1920 × 1080,帧率 30 fps。
客户端推流支持的最大推流路数详见下表:
服务类型 | 中国大陆 | 欧洲 | 美洲 | 亚洲(除中国大陆) |
---|---|---|---|---|
客户端推流 | SD:200,HD:50,FHD:20 | SD:50,HD:20,FHD:5 | SD:50,HD:20,FHD:5 | SD:50,HD:20,FHD:5 |
分辨率说明:
声网支持向 CDN 推送 RTMP 和 RTMPS 协议的媒体流。
你可以从 CDN 厂商获取推流地址。
为避免代码逻辑出错,请确保转码推流和非转码推流中使用的流地址不同。
本节提供使用旁路推流功能时常用的参考信息。
设置转码输出媒体流的视频分辨率、帧率和码率时,声网推荐你使用默认值。你也可以参考下表设值。如果设置的码率超出合理范围,声网服务器会在合理区间内自动调整码率。
分辨率 | 帧率 (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
方法设置音视频流的转码属性,如分辨率、码率、帧率、水印。如果你需要多主播转码合图,请在 TranscodingUser
类中设置每个主播的参数。
addPublishStreamUrl
方法并设置 transcodingEnabled (false)
。频道内主播可以调用 addPublishStreamUrl
方法向旁路推流直播中增加指定的一路媒体流。推流地址可以在推流后动态增删。
transcodingEnabled
设置是否转码推流。(可选)频道内主播再次调用 setLiveTranscoding
方法更新音视频流的转码属性。
onTranscodingUpdated
回调会被触发并向主播报告更新信息。频道内主播可以调用 removePublishStreamUrl
方法向旁路推流直播中删除指定的一路媒体流。
推流状态改变时,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],声网服务器会将高于 30 的帧率设置改为 30。
config.videoFramerate = 15;
// 如果 userCount > 1,则需要为每个 transcodingUser 分别设置布局。
config.userCount = 1;
// 推流输出视频的编码规格。可以设置为 Baseline (66)、Main (77) 或 High (100)。如果设置其他值,声网会统一设为默认值 High (100)。
config.videoCodecProfile = HIGH;
// 分配主播的画面布局。
config.transcodingUser = new TranscodingUser[config.userCount];
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);
实现推流功能时,声网推荐使用的 API:
startRtmpStreamWithoutTranscoding
startRtmpStreamWithTranscoding
updateRtmpTranscoding
stopRtmpStream
onTranscodingUpdated
onRtmpStreamingStateChanged
onRtmpStreamingEvent
实现推流功能时,依然可用但声网不推荐的 API:
使用旁路推流功能时,你可能还需参考如下文档: