diff --git a/server.js b/server.js index 1fe4359..9ac3d8d 100644 --- a/server.js +++ b/server.js @@ -586,6 +586,39 @@ app.get('/api/hls/segment.ts', async (req, res) => { console.error('HLS FFmpeg Error:', err.message); }); + ffmpegCommand.on('progress', (progress) => { + const timemarkSeconds = parseTimemarkToSeconds(progress.timemark || '0'); + const absoluteSeconds = startTime + (isFinite(timemarkSeconds) ? timemarkSeconds : 0); + const totalDuration = parseFloat(sourceMetadata?.format?.duration || 0); + + let percent = 0; + if (totalDuration > 0) { + percent = Math.min(Math.max(Math.round((absoluteSeconds / totalDuration) * 100), 0), 100); + } + + const progressState = { + status: 'transcoding', + percent, + frame: progress.frames || null, + fps: progress.currentFps || null, + bitrate: progress.currentKbps || null, + timemark: progress.timemark || null, + absoluteSeconds, + duration: totalDuration || null, + startSeconds: startTime, + details: `处理进度 ${percent}%`, + mp4Url: null + }; + progressMap[progressKey] = progressState; + broadcastWs(progressKey, { type: 'progress', key, progress: progressState }); + + console.log(`[FFmpeg] ${progressKey} | ${progress.timemark} | ${progress.currentFps}fps | ${progress.currentKbps}kbps | ${percent}%`); + }); + + ffmpegCommand.on('end', () => { + console.log(`[FFmpeg] ${progressKey} HLS transcode completed.`); + }); + ffmpegCommand.run(); currentProcess = { command: ffmpegCommand, currentSeg: seg }; hlsProcesses.set(progressKey, currentProcess);