From cc40f1920c52e5f425cec0d4fb7b37cf49adeaca Mon Sep 17 00:00:00 2001 From: CN-JS-HuiBai Date: Fri, 10 Apr 2026 01:05:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=97=A0=E6=B3=95=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E8=BD=AC=E7=A0=81=E8=BF=9B=E5=BA=A6=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server.js | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/server.js b/server.js index 12bb6ba..a8ad4f2 100644 --- a/server.js +++ b/server.js @@ -997,8 +997,20 @@ const startHlsTranscode = async (bucket, key, seg, requestedEncoder, requestedDe ffmpegCommand.outputOptions(hlsOptions).output(m3u8Path); ffmpegCommand.on('error', (err) => { console.error(`[HLS] FFmpeg Error for ${progressKey}:`, err.message); + const broadcastRoomId = `${baseProgressKey}${subtitleSuffix}`; + const broadcastKey = subtitleIndex && subtitleIndex !== '-1' ? `${key}-sub${subtitleIndex}` : key; + const failedState = { + status: 'failed', + percent: 0, + details: `FFmpeg Error: ${err.message}`, + mp4Url: null + }; + progressMap[broadcastRoomId] = failedState; + broadcastWs(broadcastRoomId, { type: 'progress', key: broadcastKey, progress: failedState }); + hlsProcesses.delete(progressKey); }); + ffmpegCommand.on('progress', (progress) => { const timemarkSeconds = parseTimemarkToSeconds(progress.timemark || '0'); const absoluteSeconds = startTime + (isFinite(timemarkSeconds) ? timemarkSeconds : 0); @@ -1024,10 +1036,13 @@ const startHlsTranscode = async (bucket, key, seg, requestedEncoder, requestedDe }; const broadcastRoomId = `${baseProgressKey}${subtitleSuffix}`; const broadcastKey = subtitleIndex && subtitleIndex !== '-1' ? `${key}-sub${subtitleIndex}` : key; + + progressMap[broadcastRoomId] = progressState; broadcastWs(broadcastRoomId, { type: 'progress', key: broadcastKey, progress: progressState }); + if (!isPersistent) { console.log(`[FFmpeg] ${progressKey} | ${progress.timemark} | ${sanitizeNumber(progress.currentFps) ?? '-'}fps | ${sanitizeNumber(progress.currentKbps) ?? '-'}kbps | ${percent}%`); } @@ -1037,14 +1052,18 @@ const startHlsTranscode = async (bucket, key, seg, requestedEncoder, requestedDe console.log(`[FFmpeg] ${progressKey} HLS transcode completed.`); const broadcastRoomId = `${baseProgressKey}${subtitleSuffix}`; const broadcastKey = subtitleIndex && subtitleIndex !== '-1' ? `${key}-sub${subtitleIndex}` : key; + + const finishedState = { + status: 'finished', + percent: 100, + details: isPersistent ? '预切片完成' : '处理完成' + }; + progressMap[broadcastRoomId] = finishedState; + broadcastWs(broadcastRoomId, { type: 'progress', key: broadcastKey, - progress: { - status: 'finished', - percent: 100, - details: isPersistent ? '预切片完成' : '处理完成' - } + progress: finishedState }); hlsProcesses.delete(progressKey); });