Livestream 直播流
Livestream 是 oak-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,核心字段包括:
accessKeyhubliveHostpublishDomainplayDomainTypeplayDomainplayBackDomainpublishSecuritypublishKeyplayKey
也就是说,这组公共组件当前更适合做“七牛直播配置页”,而不是泛化的直播厂商配置页。
这里还有一个很值得直接写出来的实现边界:Config.Live 在类型上虽然是一个对象容器,但公共组件目前只渲染了 qiniu 这一项,并没有腾讯云、阿里云等平行配置表单。
config/upsert/live 的真实组件参数
这个组件本身不是直接操作 systemId 的业务页,而是一个被更大配置页包进去的“配置片段组件”。从源码看,它真正接受的参数只有两个:
livesetValue(path, value)
也就是说:
live代表当前已经读出来的System.config.LivesetValue负责把局部字段写回上层配置表单
它内部再把所有字段路径都统一收敛成:
qiniu.accessKeyqiniu.hubqiniu.liveHostqiniu.publishDomainqiniu.playDomainTypeqiniu.playDomainqiniu.playBackDomainqiniu.publishSecurityqiniu.publishKeyqiniu.playKey
这意味着项目层如果不是复用更上层的 config/upsert 体系,而是想单独把直播配置嵌进自己的系统后台,也最好保持同样的 setValue('qiniu.xxx', value) 约定。
playDomainType / publishSecurity 当前有哪些可选值
这组下拉值在源码里其实已经写死,文档里最好直接列出来。
playDomainType 当前支持:
rtmphlsflv
publishSecurity 当前支持:
nonestaticexpiryexpiry_sk
这里必须以 src/types/Config.ts 的 QiniuLiveConfig 合同为准。当前 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实体。
这也符合它当前在公共包里的定位:提供统一模型和工具函数,项目层决定具体业务流程。
当前项目里的实际情况
这次对 taicang、haina-busi 的定点比对里,没有看到它们直接复用公共 config/upsert/live 页面壳的现成落点。
更接近现状的事实是:
taicang自己有qiniuLive、qiniuLiveStream这一层业务模型和 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提供了一套统一的直播资源数据结构;而当前公共包真正打通的直播云实现,主要还是七牛。
这样理解会更贴近源码现状:
- 数据层已经有稳定表达;
- 七牛直播配置页和工具函数已经可直接复用;
- 其它直播平台接入仍主要留给项目层实现。