跳到正文

JIT Queue 即时队列 API ​

提供面向网络流媒体与动态播放场景的即时动态队列(Just-In-Time Queue)调度能力。

JIT Queue API(流媒体即时队列) ​

JIT Queue(Just-In-Time Queue)是专为流媒体设计的双层队列架构。与原生 Queue API 不同,采用"前端负责逻辑,后端负责执行"的模式,解决了流媒体 URL 时效性问题。

架构说明 ​

text
┌─────────────────────────────────────────────────┐
│  Frontend (Web/Vue3)                            │
│  ┌────────────────────────────────────────────┐ │
│  │  逻辑队列 (Pinia Store)                     │ │
│  │  tracks: Track[] / playMode / currentIndex │ │
│  └────────────────────────────────────────────┘ │
│                    ↓ fb2k.invoke()              │
├─────────────────────────────────────────────────┤
│  C++ Backend                                    │
│  ┌────────────────────────────────────────────┐ │
│  │  QueueManager (影子播放列表)                 │ │
│  │  只维护 2-3 首歌的缓冲区,URL 即时解析      │ │
│  └────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘

后端只驻留 2-3 首曲目的缓冲并在播放前才解析 URL,完整的队列逻辑留在前端。

jitQueue.playNow ​

基于指定曲目开启全新 JIT 会话(清空当前缓冲并立即起播;宿主自动识别 URL 协议与本地文件路径;原生播放队列保留并在本会话结束后接续播放)

参数类型必填说明
trackIdstring是调用方分配的曲目唯一标识符 trackId(在状态查询与事件中回显)不能为空。
titlestring否用于界面展示的曲目标题默认 ""。
urlstring是音频流 URL 或本地文件物理路径(最多 2048 字符)不能为空。

返回值

字段类型说明
trackIdstring传入的曲目标识符 trackId
shadowPlaylistinteger影子播放列表在播放列表管理器中的索引(不存在时由宿主自动创建接管,创建失败返回 -1)

成功时 success 为 true;失败时返回 { success: false, error, code },code 见错误码。

立即播放指定曲目。清空缓冲区并开始新的播放会话。

URL 类型自动检测: http:///https:// → 流媒体模式;Windows 绝对路径/UNC → 本地文件模式。

javascript
const url = await fetchRealUrl(track.id);
await fb2k.invoke('jitQueue.playNow', {
    trackId: 'netease_12345',
    title: '让我留在你身边',
    url: url
});

jitQueue.enqueueNext ​

将下一首曲目预载进播放缓冲(用于响应 jitQueue:needNext 事件;仅在存在活跃会话播放或等待下一首时受理,否则返回 NO_ACTIVE_ITEM)

参数类型必填说明
trackIdstring是调用方分配的曲目唯一标识符 trackId不能为空。
titlestring否用于界面展示的曲目标题默认 ""。
urlstring是音频流 URL 或本地文件物理路径(最多 2048 字符)不能为空。

返回值

字段类型说明
trackIdstring传入的曲目标识符 trackId
bufferSizeinteger预载完成后缓冲内的曲目总数

成功时 success 为 true;失败时返回 { success: false, error, code },code 见错误码。

预加载下一首曲目到缓冲区。响应 jitQueue:needNext 事件时调用。

jitQueue.skip ​

跳过当前曲目并播放缓冲中的下一首(若缓冲存在后续曲目则直接播放且不改动原生队列;否则执行原生下一首逻辑;无活跃会话时返回 NO_ACTIVE_ITEM)

无参数。

返回值

字段类型说明
currentTrackIdstring调用返回时会话记录的曲目标识符(此时新曲目尚未起播,仍为被跳过的曲目 ID,起播后由 jitQueue:trackChanged 通知)

成功时 success 为 true;失败时返回 { success: false, error, code },code 见错误码。

跳到缓冲区中的下一首曲目。

jitQueue.stop ​

停止当前播放(支持选择是否保留已缓冲内容)

参数类型必填说明
clearBufferboolean否停止播放时是否同步清空已缓冲的曲目默认 true。

返回值

成功时 success 为 true;失败时返回 { success: false, error, code },code 见错误码。

停止播放并可选清空缓冲区。

jitQueue.clear ​

清空当前播放缓冲并使会话恢复空闲状态

无参数。

返回值

成功时 success 为 true;失败时返回 { success: false, error, code },code 见错误码。

清空影子播放列表缓冲区。

jitQueue.getState ​

查询 JIT 会话当前运行状态

无参数。

返回值

字段类型说明
isActiveboolean当前是否存在活跃运行的 JIT 会话
state"Idle" | "Active" | "WaitingNext" | "Exhausted" | "Unknown"会话当前运行状态
currentTrackIdstring当前正在播放的曲目标识符 trackId(缺省时为空字符串)
nextTrackIdstring已预载到缓冲的下一首曲目标识符(缺省时为空字符串)
bufferSizeinteger当前缓冲队列中待播放的曲目总数
shadowPlaylistinteger影子播放列表索引(被外部删除时重置为 -1 并终止会话;停止或清空操作会保留空列表的索引)

成功时 success 为 true;失败时返回 { success: false, error, code },code 见错误码。

获取 JIT 队列状态。

state 可能的值:"Idle" / "Active" / "WaitingNext" / "Exhausted"

jitQueue.notifyEmpty ​

通知宿主当前会话无更多后续曲目(会话进入 Exhausted 状态并派发 jitQueue:listExhausted 事件)

无参数。

返回值

成功时 success 为 true;失败时返回 { success: false, error, code },code 见错误码。

显式通知后端前端已无更多曲目。

jitQueue.preloadBatch ​

将一组曲目批量写入影子播放列表(若会话尚未播放则自动从 startIndex 处开始起播)

参数类型必填说明
urlsstring[]否待批量预载的音频 URL 或「path|subsong:N」条目列表(超出 2048 字符的条目将被丢弃并计入 invalidCount;单次最多支持 10000 条)
startIndexinteger否批量插入后起始起播的曲目索引 startIndex不小于 0。默认 0。
replaceboolean否插入前是否清空影子播放列表(false 为追加到末尾)默认 true。

返回值

字段类型说明
tracksAddedinteger实际成功追加或写入的曲目数量
invalidCountinteger因长度超出限制等原因被丢弃的无效条目数

成功时 success 为 true;失败时返回 { success: false, error, code },code 见错误码。

批量预加载曲目到 shadow playlist。使用 handle_create() 纯内存创建句柄,零 I/O 开销。

replace 默认为 true,插入前会清空 shadow playlist;如需在不打扰已入队内容的前提下追加,请显式传 false。非字符串条目以 INVALID_PARAMS 拒绝;长度超过 2048 的条目会被丢弃并计入 invalidCount,不会导致整次调用失败。

10000 上限是在丢弃上述无效条目之后才判断的,因此只统计有效条目。超限会整批失败而非截断,以 INVALID_PARAMS 报 Batch exceeds maximum size (10000) 且不含 tracksAdded。urls 为空数组或 startIndex 越界同样是 INVALID_PARAMS,附带 tracksAdded: 0 与 invalidCount;宿主插入失败是 OPERATION_FAILED。

js
// 替换模式
await fb2k.invoke('jitQueue.preloadBatch', {
  urls: ['C:\\Music\\a.flac', 'C:\\Music\\b.flac'],
  startIndex: 0,
  replace: true
});

// 追加模式(不中断当前播放)
await fb2k.invoke('jitQueue.preloadBatch', {
  urls: moreUrls,
  replace: false
});

JIT Queue 事件 ​

维护 JIT shadow playlist 期间会发出以下事件。若前端需要补充或观察缓冲区,请在调用操作前订阅。

事件含义Payload keys
jitQueue:needNext管理器需要下一个逻辑曲目。{ currentTrackId, reason }
jitQueue:trackChangedJIT 当前曲目发生变化。{ trackId, title }
jitQueue:listExhausted前端报告没有更多可用曲目。{ lastTrackId }
jitQueue:preloadComplete批量预加载完成。{ count, startIndex, replace }
jitQueue:error某首曲目的 JIT 操作失败。URL 分支为 { trackId, error, url },本地路径分支为 { trackId, error, path }。