编程模型

以保护数据安全和考虑架构合理性为出发点,我们对基于直播云服务如何进行开发提供了一些设计和编码建议。希望开发者在使用直播云服务之前详细阅读这些建议,并尽可能的符合这些原则,以免造成不必要的时间浪费和带来数据安全风险。

使用直播云构建视频直播类应用建议使用以下架构

从以上架构图中我们可以看到以下几个关键组件

  1. 直播云服务,完成视频直播应用中核心的视频处理、分发、存储等服务,同时提供一系列API给业务服务器查询、中止、创建直播/转码任务。
  2. 各类直播源, 包括集成了直播云客户端SDK的各类直播手机APP, PC上的视频采集应用,支持标准视频传输协议的监控摄像头,支持RTMP输出的编码器等。
  3. 业务服务器,一个直播类应用除了完成直播功能外,还有许多业务功能,在一个典型的直播类应用中,业务服务器可能需要给客户端提供以下接口。
    • 认证回调接口,客户一般都希望自己来管理用户数据,所以要提供一个登录认证接口,直播云在接受到直播请求时会转发认证请求给业务服务器以完成认证。当然业务服务器提供了认证接口被直播云回调当然需要有机制防止拒绝来自非直播云的调用请求,因此直播云的回调也是有签名的,业务接口服务器可以通过验证签名来判断回调是否合法。

      在一些特别简单的应用中,客户不想自己实现用户管理与认证接口,则可以借助直播云提供的用户管理功能来完成认证。客户可以登录到直播云控制台点击用户管理菜单来进行新建、删除用户和修改密码等简单的用户管理功能。

    • 通知回调接口 通知回调接口也是由业务服务器提供,并由直播云回调,在以下事件发生时会产生回调:直播开始、直播结束、视频存档、缩略图生成。
    • 直播列表接口 直播列表接口一般由业务服务器提供当前正在进行的直播列表给播放客户端,以在客户端呈现。
    • 历史视频点播列表接口 点播列表也是由业务服务器提供给播放客户端呈现。
  4. 播放端, 在移动互联网时代,直播视频一般都要求能在Android, iOS平台的移动终端上,以及PC网页上播放。根据业务的需要,我们提供不同平台的播放器以及不同的输出协议来满足在不同平台上的直播播放的需求。我们在不同平台上提供的播放器SDK包括:

    • Android 播放器,包含在SDK中
    • iOS平台播放器 包含在SDK中
    • 网页播放器

    以上播放器都支持支持HTTP+flv直播和点播, HTTP+m3u8直播和点播, rtmp直播和点播, 其中网页播放器暂不支持mp4点播。同时,Android和iOS平台上的播放器还支持Flv和rtmp的短延迟直播播放模式。

    如果需要将直播云的直播视频分享到微信上,则需要在直播云上配置输出m3u8格式。因为微信上不允许调用外部的播放器,只能使用系统内置播放器,在iOS平台上以及Android4.0以下平台, m3u8是被平台内置播放器支持的直播流格式。如果还需要支持Android 4.0以下平台上的微信,则在分享网页上判断平台版本,在低版本的Android平台上调用沃安提供的网页播放器来播放m3u8.

    综上的所述,直播云提供以下组件来简化客户开发直播应用的过程:

    • Android iOS平台上的直播录制和播放器SDK
    • 网页直播的Flash插件
    • 网页播放的Flash插件
    • 直播云的API服务接口和回调机制
    • 直播云接受推流输入的服务
    • 直播云的直播/点播分发服务(直播CDN)

从基本架构中可以看出,业务服务器如果要维护直播列表有两种方式 1.接收直播云的直播回调,将直播开始通知中的直播播放地址存到业务数据库中的直播数据表中,接收直播云的直播结束回调,将直播地址从业务数据库的直播数据表中删除。 2.访问直播云的API,获取当前最新的任务列表,从任务列表中解析每个任务的直播地址,更新业务数据库中的直播数据表。

以上两种方式看上去都可行,并且方式2看上去更简单些。实际上两种方式实现的效果有些细微的差别

  • 方式1(回调方式),存在漏洞,如果直播结束回调发出时,刚好直播云和业务服务器之间的网络发生异常时,或者业务服务器重启,则这个通知就会被业务服务器遗漏。这样会导致在业务数据库中存在一条直播记录永远处于直播状态。

    直播云有尝试机制,如果网络不可达则会尝试重新回调,但如果网络异常持续时间较长,在多次尝试后会放弃。

  • 方式2 的主要问题在于需要业务服务器不断重复请求以刷新最新数据,且刷新的间隔决定了业务服务器建立的直播列表的延迟。另外如果在转码应用中,某个转码任务执行得特别快,1秒钟就结束了,而业务服务器的请求刷新间隔为2秒钟,则业务服务器可能会遗漏这条任务信息,因为在请求间隔中任务已经开始并结束了。

所以要建立一个可靠的,实时性较高的直播列表,需要方式1和方式2结合使用,方式1建立实时的直播列表,然后通过方式2定时刷新来精确同步列表。

直播云主要解决应用中和视频相关的问题,其设计原则是尽可能与业务隔离,以满足在不同场景下的灵活应用。但是在有的业务场景中,应用层希望能通过直播云直接在直播采集端与业务服务器之间传输一些数据,并且这些数据需要和当前视频绑定起来。

考虑以下业务场景:

  • 直播一段视频,同时记录此视频拍摄的地理位置
  • 客户端在直播视频前设定一个视频类别,在直播和点播时按照类别分类。

要简单实现上面的业务功能,就需要了解opaque字段的概念。

如上图所示:

  • 在移动终端直播时,调用sdk的开始直播方法,如Android平台sdk的 startRecord 方法,传入opaque参数,此参数为文本,将文本以JSON形式定义,如 {"longitude": 102.32121, "latitude": 37.420123, "category": "news"} 这样,在直播开始、结束、存档通知中业务服务器的接口会收到本次直播相应的opaque数据,这样在保存相关视频播放地址和id至数据库时,可以关联保存opaque中所带来的信息。
  • 同样在用编码器,或者网页flash插件以rtmp形式推流时,在推流的地址上也可以加上opaque参数,以达到同样的目的。需要注意的是,对于硬件编码器,配置rtmp的推送地址时,这个opaque参数的内容需要填写经过url encode 计算的字符串,以防止保留字符引起的问题。
  • 在以创建任务的形式拉流直播时,可以在任务描述中加入opaque字段,在这个直播任务中关联业务数据,以达到同样的目的。这样的任务描述xml如下形式:

    <root>
      <task>
        ...
        <opaque>hello</opaque>
        ...
        <input>
         ...
        </input>
        <output>
         ....
        </output>
      </task>
    </root>