在使用第三方直播 SDK 时,选择的平台比较多,目前国内常见的有腾讯云、阿里云、百度云、七牛云、网易云信、声网等等。
这里我主要选取了使用比较多的腾讯云、阿里云和七牛云做一个对比。
功能特性
腾讯云 | 阿里云 | 七牛云 | |
---|---|---|---|
推流协议 | RTMP | RTMP | RTMP、QUIC、HTTP |
推流方式 | 阿里云直播SDK、常见的第三方OBS/XSplit/FMLE等推流软件 | 七牛直播云SDK、常见的第三方OBS/XSplit/FMLE等推流软件 | |
推流设备 | 常见的基于RTMP推流协议的第三方编解码器或盒子 | 常见的基于RTMP推流协议的第三方编解码器或盒子 | |
播放协议 | 支持RTMP、FLV 及 HLS 三种播放协议 | 支持RTMP、FLV 及 HLS 三种播放协议 | 支持RTMP、FLV 及 HLS 三种播放协议 |
播放方式 | 腾讯云直播SDK、常见的第三方 FLV、RTMP、HLS 播放器 | 阿里云直播SDK、常见的第三方 FLV、RTMP、HLS 播放器 | 七牛直播云SDK、常见的第三方 FLV、RTMP、HLS 播放器 |
从推流和拉流的相关特性来看,三者没有区别。
价格
腾讯云
腾讯云移动直播 SDK 的费用由两部分产生:
- 一部分是 SDK 的使用授权费用。
- 一部分是使用 SDK 对接腾讯云直播服务时产生的直播费用。
在腾讯云购买云直播指定的流量资源包时会赠送移动直播 SDK License(一年使用授权),资源包与 SDK 版本对应关系如下:
云直播流量资源包规格 | 移动直播 SDK License | 价格(元) |
---|---|---|
无 | 基础版 SDK(28天) | 0 |
10TB直播流量资源包 | 基础版 SDK(1年) | 2172 |
50TB直播流量资源包 | 基础版 SDK(1年) | 8972 |
200TB直播流量资源包 | 基础版 SDK(1年) | 30198 |
1PB直播流量资源包 | 基础版 SDK(1年) | 149589 |
联系商务人员购买 | 商业版 SDK(1年) | 500000 |
除了移动直播 SDK License 授权费用外,在使用移动直播 SDK 的过程中,还可能产生其他产品的费用,例如云直播服务。
标准直播基础计费项如下所示:
计费项 | 计费模式 | 付费方式 |
---|---|---|
流量 | 按流量消耗 | 日结后付费 |
带宽 | 按带宽峰值 | 日结后付费 |
阿里云
视频直播服务的计费项包括:
流量带宽(包括按日峰值带宽、按月结95峰值带宽和按流量计费)、智能审核(包括智能鉴黄、广告识别、暴恐涉政识别、二维码识别和无意义直播识别)、海外链路加速(原全球加速)、直播转码、直播截图和云导播。
可以先使用,后付费。所需费用按照不同的计费方式产生。
直播的计费方式包括:
- 按日峰值带宽
- 计费规则:以当日直播观看所在区域节点加速服务分别产生的带宽最高值(单位:Mbps)为结算标准。使用日峰值带宽计费价格详情,参见 视频直播详细价格信息。
- 计费周期:按直播服务节点的峰值带宽阶梯价格计费,以自然日为一个累计周期。每日零点后出前一日账单并扣费,具体出账时间以系统为准。
- 计费规则:以当日直播观看所在区域节点加速服务分别产生的带宽最高值(单位:Mbps)为结算标准。使用日峰值带宽计费价格详情,参见 视频直播详细价格信息。
- 按月结95峰值带宽:为月消费金额大于 10 万的用户提供了更为灵活的月度 95 带宽峰值计费方式。
- 按流量计费。
- 计费规则:按不同区域流量阶梯价格计费,流量累积到自然月底,下月自动清零重新累积。使用流量计费价格详情,参见 视频直播详细价格信息。
- 计费周期:按小时出账,实时扣费,具体出账时间以系统为准。
- 计费规则:按不同区域流量阶梯价格计费,流量累积到自然月底,下月自动清零重新累积。使用流量计费价格详情,参见 视频直播详细价格信息。
目前我还没有在七牛云的文档中看到服务价格。
SDK 功能
阿里云 | 腾讯云 | 七牛云 | |
---|---|---|---|
视频 h.264 编码,音频 AAC 编码 | ✅ | ✅ | ✅ |
支持软编和硬编 | ✅ | ✅ | ✅ |
支持多分辨率编码 | ✅ | ✅ | ✅ |
支持推流时可改变码率 | ✅ | ✅ | ✅ |
支持动态帧率功能 | ✅ | ✅ | ✅ |
内置自适应码率功能 | ✅ | ✅ | ✅ |
支持弱网丢帧功能 | ✅ | ✅ | ✅ |
发送自定义视频、音频数据 | ✅ | ✅ | ✅ |
从 SDK 提供的主要功能来看,三者也都没有区别。在我们进行图传直播时主要用到了自定义视频数据 的功能。三者都提供了支持。其相应的接口如下:
腾讯云:
- (void)sendVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer;
- (void)sendCustomPCMData:(unsigned char *)data len:(unsigned int)len;
阿里云:
- (void)sendVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer;
// 发送自定义的audio SampleBuffer。 只限于replaykit录屏直播使用
- (void)sendAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType;
- (void)sendVideoData:(char *)data width:(int)width height:(int)height size:(int)size pts:(uint64_t)pts rotation:(int)rotation;
- (void)sendPCMData:(char *)data size:(int)size sampleRate:(int)sampleRate channel:(int)channel pts:(uint64_t)pts;
七牛云:
- (void)pushVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer;
- (void)pushAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer;
在获取到图传时,我们会在 DJIVideoFeedListener
的回调方法里获取到数据:
- (void)videoFeed:(nonnull DJIVideoFeed *)videoFeed didUpdateVideoData:(nonnull NSData *)videoData;
我们在这里对获取到的 NSData
类型的videoData
进行编码处理,并提供给上面的接口。
所以在 SDK 的接入成本上是没有区别的。
直播视频播放
在直播视频播放方式上,三者都支持直播 SDK、常见的第三方 FLV、RTMP、HLS 播放器的播放方式。
三者都提供了 Web 端播放 SDK,其中七牛云还提供了 Windows 播放器端 SDK。
Web 端 SDK 的使用几乎没有区别,详细的集成过程可以从这里查看:腾讯云, 阿里云,七牛云。
推拉流 URL
腾讯云
推流 URL
支持手动生成。首先登录腾讯云直播控制台,选择左上角【云产品】>【云直播】>【域名管理】,选择添加过的推流域名,在【管理】中选择【推流配置】 ,在“推流地址生成器”中单击【生成推流地址】来生成一个推流地址。
实际产品中,您不可能为每一个主播手工创建推流和播放 URL,而是要由您的服务器自行拼装,只要符合腾讯云标准规范的 URL 就可以用来推流,如下是一条标准的推流 URL,它由四个部分组成:
- StreamName(流 ID):推荐用随机数字或者用户 ID。
- txTime(地址有效期):何时该 URL 会过期,格式支持十六进制的 UNIX 时间戳。
例如5867D600
代表2017年01月01日00时00点00分
过期,我们的客户一般会将 txTime 设置为当前时间24小时以后过期。过期时间不要太短,因为当主播在直播过程中遭遇网络闪断时,SDK 会自动重新推流,如果 txTime 的过期时间太短,主播会因为推流 URL 过期而无法恢复推流。 - txSecret(防盗链签名):防止攻击者伪造您的后台生成推流 URL,计算方法参见 最佳实践 - 防盗链计算。
播放 URL
腾讯云播放地址主要由播放前缀、播放域名(domain)、应用名称(AppName)、流名称(StreamName)、播放协议后缀、鉴权参数以及其他自定义参数组成。例如:
http://domain/AppName/StreamName.flv?txSecret=xxxxxxxx&txTime=xxxxxx
rtmp://domain/AppName/StreamName?txSecret=xxxxxxxx&txTime=xxxxxx
http://domain/AppName/StreamName.m3u8?txSecret=xxxxxxxx&txTime=xxxxxx
https://domain/AppName/StreamName.m3u8?txSecret=xxxxxxxx&txTime=xxxxxx
https://domain/AppName/StreamName.flv?txSecret=xxxxxxxx&txTime=xxxxxx
- 应用名称(AppName)
应用名称指的是直播流媒体文件存放路径,云直播默认会分配一个路径:
live
。 - 流名称(StreamName)
流名称(StreamName)是指每路直播流的唯一标识符。
- 鉴权参数(非必需)
鉴权参数:
txSecret=xxxxxxxx&txTime=xxxxxx
。 - 播放前缀
- RTMP 播放协议:
rtmp://
。 - HTTP - FLV 播放协议:
http://
或者https://
。 - HLS(m3u8) 播放协议:
http://
或者https://
。
- RTMP 播放协议:
阿里云
阿里云推流和播放 URL 生成规则跟腾讯云类似:
例如,播流域名为 pull.aliyunlive.com, 推流域名为 push.aliyunlive.com, Appname为 live, StreamName为 0000。 生成的地址结果如下:
推流地址: rtmp://push.aliyunlive.com/live/0000?auth_key={鉴权串}
播流地址:
RTMP 格式:rtmp://pull.aliyunlive.com/live/0000?auth_key={鉴权串}
FLV 格式:http://pull.aliyunlive.com/live/0000.flv?auth_key={鉴权串}
M3U8 格式:http://pull.aliyunlive.com/live/0000.m3u8?auth_key={鉴权串}
七牛云
七牛云的推流和拉流 URL 采用的是服务端授权的方式。其工作流模型如下:
Client (iOS/Android/PC/Camera) 向 Server (业务逻辑服务器) 请求推流授权
- Server 颁发带授权信息的 Stream 给 Client
- Client 通过 RTMP 推流 给 Pili Streaming Cloud
- Client 向 Server 请求播放授权
- Server 向 Client 颁发播放地址
- Client 调用 播放器 SDK 打开播放地址进行播放
DJI
在 DJI Android SDK 中提供了一个 LiveStreamManager
来进行无人机图传的直播。在 iOS 的 DJIWidget 中也提供了 DJIRtmpMuxer
来对图传进行直播。代码如下:
DJIRtmpMuxer.sharedInstance()?.serverURL = url
DJIRtmpMuxer.sharedInstance()?.enabled = true
DJIRtmpMuxer.sharedInstance()?.delegate = self
DJIRtmpMuxer.sharedInstance()?.setupVideoPreviewer(KWVideoPreviewer.instance())
DJIRtmpMuxer.sharedInstance()?.start()
总结
在整个直播 SDK 集成过程中,客户端的工作量是完全一样的。 SDK 引入、配置推流、自定义视频数据,推流,播放等步骤,不管使用哪个平台都是一样的。区别主要在定价以及视频流地址生成上。视频流地址的生成可以参考七牛云的方案,让后台生成。
在进行推流前必须先开通云直播服务、添加自有域名、域名 CNAME 三个步骤。目前腾讯云在开通云直播服务时会提供一个测试用的域名,而阿里云和七牛云在开通服务时没有提供,需要自己添加已备案的域名。目前我在测试时使用的是腾讯云直播 SDK。
图传直播 demo 地址:http://dev.kiwiinc.net/kiwi-team/DJILib/tree/feature/live