Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Livestream 直播流

Livestreamoak-general-business 里最“轻”的一个模块之一。当前公共包为它提供的,主要还是对象模型本身,而不是一整套直播平台集成。

这一点非常重要,因为很多人看到“直播”两个字,会下意识以为这里已经封装好了推流、鉴权、回调、聊天室等完整能力。实际上目前并不是这样。

主要对象

这一章的核心实体是:

  • Livestream

它保存了直播流最基础的一组信息:

  • 直播标题;
  • 直播流名称;
  • 是否在线;
  • 所属直播空间;
  • 串流密钥;
  • 推流地址、播放地址和 OBS 地址;
  • 地址过期时间;
  • 它归属于哪个业务对象。

从这个结构也能看出来,它更像“直播资源记录”,而不是“直播平台 SDK 封装”。

组件 / aspect / endpoint / feature

当前 oak-general-business 里:

  • 没有现成的 livestream 组件;
  • 没有独立的 livestream feature
  • 没有专门的 aspect;
  • 也没有 endpoint。

但这里有一个容易忽略的事实:虽然没有 livestream 实体自己的页面组件,系统配置里已经有 src/components/config/upsert/live,可以直接拿来维护 System.config.Live

这说明公共包在这里提供的是“统一数据模型 + 配置编辑入口 + 后端工具函数”,而不是成品业务模块。

config/upsert/live 当前真实支持什么

这组配置组件现在不是“多平台直播配置中心”,而是一个明确偏向七牛直播云的配置页。oak-general-business/src/components/config/upsert/live/index.tsx 当前真正维护的是 System.config.Live.qiniu,核心字段包括:

  • accessKey
  • hub
  • liveHost
  • publishDomain
  • playDomainType
  • playDomain
  • playBackDomain
  • publishSecurity
  • publishKey
  • playKey

也就是说,这组公共组件当前更适合做“七牛直播配置页”,而不是泛化的直播厂商配置页。

这里还有一个很值得直接写出来的实现边界:Config.Live 在类型上虽然是一个对象容器,但公共组件目前只渲染了 qiniu 这一项,并没有腾讯云、阿里云等平行配置表单。

config/upsert/live 的真实组件参数

这个组件本身不是直接操作 systemId 的业务页,而是一个被更大配置页包进去的“配置片段组件”。从源码看,它真正接受的参数只有两个:

  • live
  • setValue(path, value)

也就是说:

  • live 代表当前已经读出来的 System.config.Live
  • setValue 负责把局部字段写回上层配置表单

它内部再把所有字段路径都统一收敛成:

  • qiniu.accessKey
  • qiniu.hub
  • qiniu.liveHost
  • qiniu.publishDomain
  • qiniu.playDomainType
  • qiniu.playDomain
  • qiniu.playBackDomain
  • qiniu.publishSecurity
  • qiniu.publishKey
  • qiniu.playKey

这意味着项目层如果不是复用更上层的 config/upsert 体系,而是想单独把直播配置嵌进自己的系统后台,也最好保持同样的 setValue('qiniu.xxx', value) 约定。

playDomainType / publishSecurity 当前有哪些可选值

这组下拉值在源码里其实已经写死,文档里最好直接列出来。

playDomainType 当前支持:

  • rtmp
  • hls
  • flv

publishSecurity 当前支持:

  • none
  • static
  • expiry
  • expiry_sk

这里必须以 src/types/Config.tsQiniuLiveConfig 合同为准。当前 config/upsert/live 的 Select 选项把前两个值误写成了 none: / static:,与类型和七牛 SDK 调用合同不一致;这不是可复用的新枚举。项目层自己包 UI 时应使用无冒号的 none / static,复用该组件前也应先确认公共包已经修正这一处实现。

后台规则与注入点

当前也没有为 Livestream 提供默认 trigger、checker、watcher 或 routine。

因此它的注入点非常直接:

  • 实体会跟随 oak-general-business 进入项目;
  • 具体的推流地址生成、有效期刷新、直播平台回调、上下线切换等逻辑,需要项目层自己补。

项目中如何接入

直播能力在项目里的正确接法,不是先写页面,而是先补系统配置和项目层 aspect / trigger:

  • 管理台可以直接复用 src/components/config/upsert/live 维护直播配置;
  • System.config.Live.qiniu 里配置直播空间;
  • 在项目自己的 aspect 或 trigger 里调用 src/utils/livestream.ts
  • 再把生成出的推拉流地址写回 Livestream 实体。

这也符合它当前在公共包里的定位:提供统一模型和工具函数,项目层决定具体业务流程。

当前项目里的实际情况

这次对 taicanghaina-busi 的定点比对里,没有看到它们直接复用公共 config/upsert/live 页面壳的现成落点。

更接近现状的事实是:

  • taicang 自己有 qiniuLiveqiniuLiveStream 这一层业务模型和 trigger
  • 公共包这边主要提供 Livestream 统一实体和七牛配置/工具函数

所以直播这章目前更准确的理解应该是:

  • 公共包负责基础直播资源模型
  • 项目层负责把“直播间、业务对象、供应商侧回调和状态流转”真正接起来

这里还要补一条非常关键的源码事实:src/utils/livestream.ts 里的三个核心方法

  • getLivestream(...)
  • getStreamObj(...)
  • getPlayBackUrl(...)

当前都会直接走七牛直播实现,而且前两个函数里明确有:

assert(origin === 'qiniu');

所以虽然 AccountOrigin 是更宽的联合类型,但在公共包当前版本里,直播工具函数真正稳定支持的只有 qiniu

如果项目层要接腾讯云、阿里云或别的直播平台,正确做法通常不是沿用这三个工具函数硬传别的 origin,而是:

  • 继续复用 Livestream 实体表达直播资源
  • 在项目层自己补对应平台的配置表单、工具函数、aspect 或 trigger
  • 必要时再把这些能力向公共包抽象回去

使用示例

1. 创建直播流并写回业务实体

src/utils/livestream.ts 已经提供了可直接复用的后端工具:

const stream = await getLivestream(
  {
    origin: 'qiniu',
    streamTitle: liveId,
    expireAt: Date.now() + 2 * 60 * 60 * 1000,
  },
  context
);

await context.operate('livestream', {
  id: await generateNewIdAsync(),
  action: 'create',
  data: {
    id: liveId,
    entity: 'course',
    entityId: courseId,
    ...stream,
  },
}, {});

2. 已有直播流时重新生成推拉流地址或回放地址

const streamObj = await getStreamObj(
  {
    origin: 'qiniu',
    streamTitle,
    expireAt,
  },
  context
);

const playbackUrl = await getPlayBackUrl(
  {
    origin: 'qiniu',
    streamTitle,
    start,
    end,
  },
  context
);

使用建议

如果你的项目要做直播相关能力,可以把这一章理解成:

Livestream 提供了一套统一的直播资源数据结构;而当前公共包真正打通的直播云实现,主要还是七牛。

这样理解会更贴近源码现状:

  • 数据层已经有稳定表达;
  • 七牛直播配置页和工具函数已经可直接复用;
  • 其它直播平台接入仍主要留给项目层实现。