From dc8f94ce22045ef6f8fc7c3bbcfde1cfdd2ac168 Mon Sep 17 00:00:00 2001 From: HenryDu8133 <813367384@qq.com> Date: Mon, 17 Aug 2026 19:34:10 +0800 Subject: [PATCH] =?UTF-8?q?fix(broadcast):=20=E4=BF=AE=E5=A4=8D=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E9=9F=B3=E4=B9=90=E5=A4=B1=E8=B4=A5=20+=20=E4=B8=B4?= =?UTF-8?q?=E6=97=B6=E5=B9=BF=E6=92=AD=E5=A4=B1=E8=B4=A5=20(group.memberNa?= =?UTF-8?q?mes=20nodeId/stationName=20=E8=AF=AD=E4=B9=89=E6=B7=B7=E6=B7=86?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: getStationGroups (L881) + resolveStationGroup 单站分支 (L942) 错误地把 memberNames = nodes.map(n => n.nodeId || '') 填成了 nodeId 数组 (n_msx5ieg9_9iy1dw 这类), 但下游 4 处消费方 /api/music/start, /api/music/stop, /api/temp-broadcast/publish 全部把 memberNames[i] 当 stationName 用: getStationWs(memberName) → stations[n_xxx] = undefined → null stopStationMusic(memberName) → 按错 key 清队列 stationMusicStates.set(memberName) → 按错 key 存状态 enqueueStationAudioTask(memberName) → 按错 station 名入队 后果: 所有成员永远被判为 offline (reason=offline), 所以 API 返回 sent=0 failed=1, 音乐和临时广播 100% 无法触发推流, 端到端链路完全中断. 修法: 对 CC station group 语义来说 memberNames = 该 group 包含的每个子站的 stationName 数组 (同 cable group 的 stationNames 语义). 单站 selector 只包含 一个成员 [st.name], 无论这个站挂了多少个 node 连接, 最终 enqueue 都是按 stationName 维度合并到同一个队列, 不会重复推多次. 端到端验证通过: MUSIC START: sent=1 failed=0 ✓ TEMP PUBLISH: success=true sent=1 failed=0 ✓ Live WAV chunk stream start/end 两条日志完整闭合, 说明 ffmpeg 分块 → WS 推送 → 结束 全链路走通. --- CloudServer/server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CloudServer/server.js b/CloudServer/server.js index 9bd3d5b..6c656ec 100644 --- a/CloudServer/server.js +++ b/CloudServer/server.js @@ -878,7 +878,7 @@ function getStationGroups() { }; }); - const memberNames = nodes.map(n => n.nodeId || ''); + const memberNames = [st.name]; const mergedTags = ['CC']; if (hostCount > 0) mergedTags.push(`HOST:${hostCount}`); if (slaveCount > 0) mergedTags.push(`SLAVE:${slaveCount}`); @@ -939,7 +939,7 @@ function resolveStationGroup(selector) { name: st.name, code, platform, - memberNames: nodes.map(n => n.nodeId || ''), + memberNames: [st.name], memberCount: nodes.length, primaryName: st.name, masterNodeId: master?.nodeId || ''