在使用第三方直播 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)为结算标准。使用日峰值带宽计费价格详情,参见 视频直播详细价格信息
    • 计费周期:按直播服务节点的峰值带宽阶梯价格计费,以自然日为一个累计周期。每日零点后出前一日账单并扣费,具体出账时间以系统为准。
  • 按月结95峰值带宽:为月消费金额大于 10 万的用户提供了更为灵活的月度 95 带宽峰值计费方式。
  • 按流量计费。
    • 计费规则:按不同区域流量阶梯价格计费,流量累积到自然月底,下月自动清零重新累积。使用流量计费价格详情,参见 视频直播详细价格信息
    • 计费周期:按小时出账,实时扣费,具体出账时间以系统为准。

目前我还没有在七牛云的文档中看到服务价格。

SDK 功能

阿里云 腾讯云 七牛云
视频 h.264 编码,音频 AAC 编码
支持软编和硬编
支持多分辨率编码
支持推流时可改变码率
支持动态帧率功能
内置自适应码率功能
支持弱网丢帧功能
发送自定义视频、音频数据

从 SDK 提供的主要功能来看,三者也都没有区别。在我们进行图传直播时主要用到了自定义视频数据 的功能。三者都提供了支持。其相应的接口如下:

腾讯云:
  1. - (void)sendVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer;
  2. - (void)sendCustomPCMData:(unsigned char *)data len:(unsigned int)len;

阿里云:
  1. - (void)sendVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer;
  2. // 发送自定义的audio SampleBuffer。 只限于replaykit录屏直播使用
  3. - (void)sendAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType;
  4. - (void)sendVideoData:(char *)data width:(int)width height:(int)height size:(int)size pts:(uint64_t)pts rotation:(int)rotation;
  5. - (void)sendPCMData:(char *)data size:(int)size sampleRate:(int)sampleRate channel:(int)channel pts:(uint64_t)pts;

七牛云:
  1. - (void)pushVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer;
  2. - (void)pushAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer;

在获取到图传时,我们会在 DJIVideoFeedListener 的回调方法里获取到数据:

  1. - (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,它由四个部分组成:

第三方直播 SDK 调研 - 图1

  • StreamName(流 ID):推荐用随机数字或者用户 ID。
  • txTime(地址有效期):何时该 URL 会过期,格式支持十六进制的 UNIX 时间戳。
    例如5867D600代表2017年01月01日00时00点00分过期,我们的客户一般会将 txTime 设置为当前时间24小时以后过期。过期时间不要太短,因为当主播在直播过程中遭遇网络闪断时,SDK 会自动重新推流,如果 txTime 的过期时间太短,主播会因为推流 URL 过期而无法恢复推流。
  • txSecret(防盗链签名):防止攻击者伪造您的后台生成推流 URL,计算方法参见 最佳实践 - 防盗链计算

播放 URL

腾讯云播放地址主要由播放前缀播放域名(domain)、应用名称(AppName)、流名称(StreamName)播放协议后缀鉴权参数以及其他自定义参数组成。例如:

  1. http://domain/AppName/StreamName.flv?txSecret=xxxxxxxx&txTime=xxxxxx
  2. rtmp://domain/AppName/StreamName?txSecret=xxxxxxxx&txTime=xxxxxx
  3. http://domain/AppName/StreamName.m3u8?txSecret=xxxxxxxx&txTime=xxxxxx
  4. https://domain/AppName/StreamName.m3u8?txSecret=xxxxxxxx&txTime=xxxxxx
  5. 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://

阿里云

阿里云推流和播放 URL 生成规则跟腾讯云类似:
a.png

例如,播流域名为 pull.aliyunlive.com, 推流域名为 push.aliyunlive.com, Appname为 live, StreamName为 0000。 生成的地址结果如下:

  1. 推流地址: rtmp://push.aliyunlive.com/live/0000?auth_key={鉴权串}
  2. 播流地址:
  3. RTMP 格式:rtmp://pull.aliyunlive.com/live/0000?auth_key={鉴权串}
  4. FLV 格式:http://pull.aliyunlive.com/live/0000.flv?auth_key={鉴权串}
  5. 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 打开播放地址进行播放

第三方直播 SDK 调研 - 图3

DJI

在 DJI Android SDK 中提供了一个 LiveStreamManager 来进行无人机图传的直播。在 iOS 的 DJIWidget 中也提供了 DJIRtmpMuxer 来对图传进行直播。代码如下:

  1. DJIRtmpMuxer.sharedInstance()?.serverURL = url
  2. DJIRtmpMuxer.sharedInstance()?.enabled = true
  3. DJIRtmpMuxer.sharedInstance()?.delegate = self
  4. DJIRtmpMuxer.sharedInstance()?.setupVideoPreviewer(KWVideoPreviewer.instance())
  5. DJIRtmpMuxer.sharedInstance()?.start()

总结

在整个直播 SDK 集成过程中,客户端的工作量是完全一样的。 SDK 引入、配置推流、自定义视频数据,推流,播放等步骤,不管使用哪个平台都是一样的。区别主要在定价以及视频流地址生成上。视频流地址的生成可以参考七牛云的方案,让后台生成。

在进行推流前必须先开通云直播服务、添加自有域名、域名 CNAME 三个步骤。目前腾讯云在开通云直播服务时会提供一个测试用的域名,而阿里云和七牛云在开通服务时没有提供,需要自己添加已备案的域名。目前我在测试时使用的是腾讯云直播 SDK。

图传直播 demo 地址:http://dev.kiwiinc.net/kiwi-team/DJILib/tree/feature/live