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); });