{"version":3,"file":"VideoExporter.cjs","sources":["../../../src/core/VideoExporter.js"],"sourcesContent":["import { FFmpegUtil } from '../utils/ffmpeg.js';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { Renderer } from './Renderer.js';\nimport { TransitionElement } from '../elements/TransitionElement.js';\nimport { TransitionRenderer } from '../utils/transition-renderer.js';\nimport { createCanvas } from '@napi-rs/canvas';\nimport { ElementLayer } from '../layers/ElementLayer.js';\nimport os from 'os';\nimport { Worker } from 'worker_threads';\nimport { fileURLToPath } from 'url';\n\n/**\n * 视频导出器\n */\nexport class VideoExporter {\n  constructor(config = {}) {\n    this.config = {\n      outputDir: config.outputDir || './output',\n      format: config.format || 'mp4',\n      fps: config.fps || 30,\n      quality: config.quality || 'high',\n      ...config,\n    };\n    this.ffmpeg = new FFmpegUtil(config.ffmpegConfig);\n    this.renderer = null;\n  }\n\n  /**\n   * 预先初始化所有 VideoElement（避免在 Worker 中重复初始化）\n   * @param {VideoMaker} composition - 合成对象\n   */\n  async preInitializeAllElements(composition) {\n    const allElements = new Set();\n    \n    // 收集所有 VideoElement\n    const collectVideoElements = (layers) => {\n      for (const layer of layers) {\n        if (layer.elements) {\n          for (const element of layer.elements) {\n              element.cacheDir=this.cacheDir\n              allElements.add(element);\n          }\n        }\n      }\n    };\n    \n    collectVideoElements(composition.layers || []);\n    \n    // 并行初始化所有 VideoElement\n    if (allElements.size > 0) {\n      console.log(`预先初始化 ${allElements.size} 个元素...`);\n      await Promise.all(Array.from(allElements).map(element => element.ready()));\n      console.log(`所有元素初始化完成`);\n    }\n  }\n\n  /**\n   * 重新初始化视频元素（用于分块渲染时重新缓冲）\n   * @param {VideoMaker} composition - 合成对象\n   * @param {number} chunkStartTime - 分块开始时间\n   */\n  async reInitializeVideoElements(composition, chunkStartTime) {\n    const allElements = new Set();\n\n    // 收集所有 VideoElement\n    const collectVideoElements = (layers) => {\n      for (const layer of layers) {\n        if (layer.elements) {\n          for (const element of layer.elements) {\n            if (element.type === 'video') {\n              allElements.add(element);\n            }\n          }\n        }\n      }\n    };\n\n    collectVideoElements(composition.layers || []);\n\n    if (allElements.size > 0) {\n      console.log(`[PipeChunked] 重新初始化 ${allElements.size} 个视频元素...`);\n      for (const element of allElements) {\n        try {\n          // 设置视频从 chunkStartTime 开始（seek）\n          element.setSeekTime?.(chunkStartTime);\n          // 只关闭视频进程，不销毁配置\n          await element.close?.();\n          // 重置初始化状态，让视频重新开始缓冲\n          element.initialized = false;\n          element._initializingPromise = null;\n          // 重新初始化\n          await element.ready();\n        } catch (e) {\n          console.warn(`[PipeChunked] 视频元素重新初始化失败:`, e.message);\n        }\n      }\n      console.log(`[PipeChunked] 视频元素重新初始化完成`);\n    }\n  }\n\n  /**\n   * 导出视频\n   * @param {VideoMaker} composition - 合成对象\n   * @param {string} outputPath - 输出路径\n   * @param {Object} options - 选项\n   */\n  async export(composition, outputPath, options = {}) {\n    const {\n      fps = this.config.fps,\n      format = this.config.format,\n      audioPath,\n      startTime = 0,\n      usePipe=true,\n      endTime = composition.timeline.duration,\n      parallel = false, // 是否使用 Worker 并行渲染\n      maxWorkers = 2, // 最大 Worker 数，默认根据 CPU 核心数\n    } = options;\n\n    // 确保输出目录存在\n    const outputDir = path.dirname(outputPath);\n    await fs.ensureDir(outputDir);\n    \n    // 预先初始化所有 VideoElement（避免在 Worker 中重复初始化）\n    \n\n\n\n      try {\n        this.cacheDir=path.join(outputDir, `cache_${Date.now()}`);\n        await fs.ensureDir(this.cacheDir);\n        let audioConfigs = [];\n        await this.preInitializeAllElements(composition);\n        // 使用 collectAllAudioElements 方法收集音频\n        audioConfigs = await composition.collectAllElements();\n        // 记录渲染开始时间\n        const renderStartTime = performance.now();\n\n        // 创建渲染器\n        this.renderer = new Renderer({\n          width: composition.width,\n          height: composition.height,\n          fps: fps,\n          quality: this.config.quality,\n        });\n        await this.renderer.init();\n\n        // 渲染所有帧\n        const totalFrames = Math.ceil((endTime - startTime) * fps);\n        const backgroundColor = composition.backgroundColor || '#000000';\n\n        console.log(`开始渲染 ${totalFrames} 帧...`);\n        \n        // 保存 tempDir 引用（用于文件模式）\n        let tempDir = null;\n        \n        // 判断是否使用 Worker 并行渲染\n        const hasTransitions = (composition.transitions || []).length > 0;\n        // 即使有转场，也可以使用 Worker 并行渲染（转场帧在主线程预处理）\n        const shouldUseWorkerParallel = parallel && totalFrames > 100;\n        \n        if (shouldUseWorkerParallel) {\n          // 使用 Worker 并行渲染\n          const numWorkers = maxWorkers || Math.min(os.cpus().length, 4);\n          console.log(`使用 Worker 并行渲染模式（${numWorkers} 个 Worker）...`);\n          \n          if (usePipe) {\n            // 管道模式 + Worker 并行渲染\n            await this.renderFramesWithPipeWorker(composition, totalFrames, startTime, fps, outputPath, backgroundColor, {\n              fps: fps,\n              width: composition.width,\n              height: composition.height,\n              numWorkers,\n            });\n          } else {\n            // 文件模式 + Worker 并行渲染\n            tempDir = path.join(this.cacheDir, `temp_frames_${Date.now()}`);\n            await fs.ensureDir(tempDir);\n            await this.renderFramesWithWorker(composition, totalFrames, startTime, fps, tempDir, backgroundColor, {\n              numWorkers,\n              useRaw:usePipe,\n            });\n            console.log('帧渲染完成，开始编码视频...');\n          }\n        } else if (usePipe) {\n          // 使用管道模式：直接写入 FFmpeg，不保存中间文件\n          // 长视频自动分块渲染，避免内存问题\n          const pipeChunkFrames = options.pipeChunkFrames || 1500;\n          if (totalFrames > pipeChunkFrames) {\n            console.log(`使用管道模式（分块渲染，每块 ${pipeChunkFrames} 帧）...`);\n            await this.renderFramesWithPipeChunked(composition, totalFrames, startTime, fps, outputPath, backgroundColor, {\n              fps: fps,\n              width: composition.width,\n              height: composition.height,\n              chunkFrames: pipeChunkFrames,\n            });\n          } else {\n            console.log('使用管道模式（不保存中间图片）...');\n            await this.renderFramesWithPipe(composition, totalFrames, startTime, fps, outputPath, backgroundColor, {\n              fps: fps,\n              width: composition.width,\n              height: composition.height,\n            });\n          }\n        } else {\n          // 使用文件模式：串行渲染\n          tempDir = path.join(this.cacheDir, `temp_frames_${Date.now()}`);\n          await fs.ensureDir(tempDir);\n          \n          // 渲染并保存到文件\n          await this.renderFramesSerial(composition, totalFrames, startTime, fps, tempDir, backgroundColor);\n          console.log('帧渲染完成，开始编码视频...');\n        }\n\n        // 记录渲染结束时间\n        const renderEndTime = performance.now();\n        const renderTotalTime = (renderEndTime - renderStartTime) / 1000; // 转换为秒\n\n        console.log('视频编码完成');\n        console.log(`总耗时: ${renderTotalTime.toFixed(2)} 秒`);\n\n        // 打印转场统计信息（可选）\n        TransitionElement.printTransitionStats();\n\n        // 收集所有音频元素（在渲染帧的同时可以提前准备）\n      \n      \n      // 去重：根据路径和开始时间去重\n      const uniqueAudioConfigs = [];\n      const seen = new Set();\n      for (const audio of audioConfigs) {\n        const key = `${audio.path}_${audio.startTime}_${audio.duration}`;\n        if (!seen.has(key)) {\n          seen.add(key);\n          uniqueAudioConfigs.push(audio);\n        }\n      }\n      audioConfigs = uniqueAudioConfigs;\n      \n      if (audioConfigs.length > 0) {\n        console.log(`收集到 ${audioConfigs.length} 个音频元素`);\n      }\n      \n      // 如果使用文件模式，需要编码视频（管道模式已经在渲染时完成编码）\n      let videoEncodingPromise = Promise.resolve();\n      if (!usePipe && tempDir) {\n        // 文件模式：需要编码视频\n        const framePattern = path.join(tempDir, 'frame_%04d.png');\n        videoEncodingPromise = this.ffmpeg.imagesToVideo(framePattern, outputPath, {\n          fps: fps,\n          width: composition.width,\n          height: composition.height,\n        }).then(() => {\n          // 清理临时文件\n          return fs.remove(tempDir).catch(() => {});\n        });\n      }\n\n      let audioProcessingPromise = Promise.resolve(null);\n      let hasAudio = false;\n      \n      // 如果有音频路径（旧方式）或音频元素，准备音频处理\n      if (audioPath && await fs.pathExists(audioPath)) {\n        // 旧方式：单个音频文件（不需要处理，直接使用）\n        hasAudio = true;\n        audioProcessingPromise = Promise.resolve(audioPath);\n      } else if (audioConfigs.length > 0) {\n        // 新方式：多个音频元素，需要合并\n        hasAudio = true;\n        //console.log('开始处理音频（与视频编码并行）...');\n        audioProcessingPromise = this.ffmpeg.mergeAudios(audioConfigs, {\n          outputDir: outputDir,\n          duration: endTime - startTime,\n          audioMode: options.audioMode || composition.config?.audioMode || 'standard',\n          loudnessNormalization: options.loudnessNormalization !== false,\n          loudnessPreset: options.loudnessPreset || 'shortvideo',\n        }).then(async mergedAudioPath => {\n          if (mergedAudioPath && await fs.pathExists(mergedAudioPath)) {\n            //console.log('音频处理完成');\n            return mergedAudioPath;\n          }\n          return null;\n        }).catch(async error => {\n          //console.warn('音频处理失败:', error.message);\n          // 如果合并失败，尝试使用第一个音频\n          const firstAudio = audioConfigs[0];\n          if (firstAudio && await fs.pathExists(firstAudio.path)) {\n            return firstAudio.path;\n          }\n          return null;\n        });\n      }\n\n      // 等待视频编码和音频处理都完成\n      const [_, processedAudioPath] = await Promise.all([\n        videoEncodingPromise,\n        audioProcessingPromise,\n      ]);\n\n      // 如果有音频，添加到视频\n      if (hasAudio) {\n        //console.log('将音频添加到视频...');\n        // 在管道模式下，视频已经编码完成，需要重命名\n        // 在文件模式下，视频编码在 videoEncodingPromise 中完成\n        const tempVideoPath = outputPath.replace(/\\.(mp4|webm)$/, '_temp.$1');\n        if (usePipe) {\n          // 管道模式：视频已经存在，直接重命名\n          await fs.move(outputPath, tempVideoPath);\n        } else {\n          // 文件模式：视频编码在 videoEncodingPromise 中完成，需要等待\n          // 如果视频文件不存在，说明编码还没完成，等待一下\n          let retries = 0;\n          while (!await fs.pathExists(outputPath) && retries < 10) {\n            await new Promise(resolve => setTimeout(resolve, 100));\n            retries++;\n          }\n          if (await fs.pathExists(outputPath)) {\n            await fs.move(outputPath, tempVideoPath);\n          } else {\n            throw new Error('视频文件未生成');\n          }\n        }\n        \n        // 优先使用原始音频路径（如果存在且有效）\n        if (audioPath && await fs.pathExists(audioPath)) {\n          // 旧方式：单个音频文件（直接使用，不删除原始文件）\n          await this.ffmpeg.addAudioToVideo(tempVideoPath, audioPath, outputPath, {\n            audioStartTime: startTime,\n          });\n        } else if (processedAudioPath && await fs.pathExists(processedAudioPath)) {\n          // 新方式：合并后的音频（临时文件，使用后删除）\n          await this.ffmpeg.addAudioToVideo(tempVideoPath, processedAudioPath, outputPath, {\n            audioStartTime: 0,\n          });\n          \n          // 清理临时音频文件（只删除临时合并的音频，不删除原始音频）\n          const mergedAudioDir = path.dirname(processedAudioPath);\n          if (mergedAudioDir.includes('temp_audio_')) {\n            await fs.remove(mergedAudioDir).catch(() => {});\n          } else if (processedAudioPath.includes('temp') || processedAudioPath.includes('merged')) {\n            // 只删除临时文件，不删除原始音频文件\n            await fs.remove(processedAudioPath).catch(() => {});\n          }\n        } else if (audioConfigs.length > 0) {\n          // 如果音频处理失败，尝试使用第一个音频（原始文件，不删除）\n          const firstAudio = audioConfigs[0];\n          if (firstAudio && firstAudio.path && await fs.pathExists(firstAudio.path)) {\n            //console.log('使用第一个音频文件...');\n            await this.ffmpeg.addAudioToVideo(tempVideoPath, firstAudio.path, outputPath, {\n              audioStartTime: firstAudio.startTime || 0,\n            });\n          }\n        }\n        \n        await fs.remove(tempVideoPath);\n      }\n\n      // 重置转场统计信息\n      TransitionElement.resetTransitionStats();\n\n      console.log(`视频导出完成: ${outputPath}`);\n      return outputPath;\n    } catch (error) {\n      console.error('视频导出失败:', error);\n      console.error('错误堆栈:', error.stack);\n      throw error;\n    } finally {\n      await fs.remove(this.cacheDir)\n      if (this.renderer) {\n        this.renderer.destroy();\n      }\n      try {\n        if (composition && typeof composition.destroy === 'function') {\n          composition.destroy();\n        }\n      } catch (_) {}\n    }\n  }\n\n  /**\n   * 使用管道模式渲染所有帧（直接写入 FFmpeg，不保存中间文件）\n   * 优化：使用原始视频数据格式（raw）和流式渲染，性能提升 5-10倍\n   */\n  async renderFramesWithPipe(composition, totalFrames, startTime, fps, outputPath, backgroundColor, ffmpegOptions) {\n    // 检查是否有转场（转场需要使用 PNG 格式）\n    const transitions = composition.transitions || [];\n    const hasTransitions = transitions.length > 0;\n    \n    // 启动 FFmpeg 管道进程\n    // 如果有转场，使用 PNG 格式（因为转场需要图片格式）\n    // 否则使用原始数据格式（性能更好）\n    const useRaw = !hasTransitions;\n    const pipe = await this.ffmpeg.imagesToVideoPipe(outputPath, {\n      ...ffmpegOptions,\n      useRaw, // 使用原始数据格式（如果没有转场）\n    });\n    \n    // 初始化转场渲染器（如果有转场）\n    const transitionRenderers = new Map();\n    const transitionFunctions = new Map(); // 缓存转场函数\n    let transitionCanvasCache = {}; // 缓存转场 Canvas\n    \n    // 预先渲染并保存所有转场的帧\n    const transitionFrames = new Map();\n    if (transitions.length > 0) {\n      console.log(`检测到 ${transitions.length} 个转场，预先渲染转场帧...`);\n      for (const transition of transitions) {\n        const transitionKey = `${transition.startTime}_${transition.endTime}_${transition.name}`;\n        const frames = await this.preRenderTransitionFrames(composition, transition, backgroundColor);\n        transitionFrames.set(transitionKey, frames);\n      }\n    }\n    \n    try {\n      for (let frame = 0; frame < totalFrames; frame++) {\n        try {\n          const time = startTime + frame / fps;\n\n          // 检查是否有转场\n          const activeTransition = transitions.find(t => \n            time >= t.startTime && time < t.endTime\n          );\n       \n          let buffer;\n          if (activeTransition) {\n            // 有转场，使用预渲染的帧进行转场混合\n            const transitionKey = `${activeTransition.startTime}_${activeTransition.endTime}_${activeTransition.name}`;\n            const frames = transitionFrames.get(transitionKey);\n            if (frames) {\n              buffer = await this.renderFrameWithTransition(\n                composition, \n                time, \n                activeTransition, \n                backgroundColor,\n                transitionRenderers,\n                frames,\n                transitionFunctions,\n                transitionCanvasCache\n              );\n            } else {\n              // 如果没有预渲染的帧，回退到原来的方法\n              buffer = await this.renderFrameWithTransition(\n                composition, \n                time, \n                activeTransition, \n                backgroundColor,\n                transitionRenderers,\n                null,\n                transitionFunctions,\n                transitionCanvasCache\n              );\n            }\n          } else {\n            // 正常渲染帧（转场期间或转场结束后）\n            await this.renderer.renderFrame(composition.timeline.getLayers(), time, backgroundColor);\n            // 如果有转场，使用 PNG 格式；否则使用原始数据格式（性能更好）\n            buffer = this.renderer.getCanvasBuffer(hasTransitions ? 'png' : 'raw');\n          }\n          \n          // 直接写入 FFmpeg 管道\n          try {\n            await pipe.writeFrame(buffer);\n          } catch (writeError) {\n            console.error(`写入第 ${frame + 1} 帧失败:`, writeError.message);\n            pipe.kill(); // 强制终止 FFmpeg，避免进程僵死\n            throw writeError;\n          }\n\n          // 显示进度\n          if (frame % 30 === 0 || frame === totalFrames - 1) {\n            const progress = ((frame + 1) / totalFrames * 100).toFixed(1);\n            console.log(`渲染进度: ${progress}% (${frame + 1}/${totalFrames})`);\n          }\n        } catch (error) {\n          console.error(`渲染第 ${frame + 1} 帧时出错:`, error);\n          console.error('错误堆栈:', error.stack);\n          // 终止 FFmpeg 进程\n          if (pipe && pipe.kill) {\n            pipe.kill();\n          }\n          throw error;\n        }\n      }\n      \n      // 所有帧写入完成，关闭管道\n      //console.log(`所有 ${totalFrames} 帧已写入，关闭 FFmpeg 输入管道...`);\n      \n      if (pipe && pipe.end) {\n        try {\n          pipe.end();\n        } catch (error) {\n          console.error('关闭管道时出错:', error.message);\n        }\n      }\n      \n      // 等待 FFmpeg 编码完成\n      //console.log('等待 FFmpeg 编码完成...');\n      try {\n        await pipe.finish;\n        //console.log('FFmpeg 编码完成');\n      } catch (error) {\n        console.error('FFmpeg 编码失败:', error.message);\n        throw error;\n      }\n    } catch (error) {\n      // 确保终止 FFmpeg 进程\n      try {\n        if (pipe && pipe.kill) {\n          pipe.kill();\n        }\n      } catch (e) {\n        // 忽略错误\n      }\n      throw error;\n    } finally {\n      // 清理转场缓存，释放内存\n      transitionRenderers.clear();\n      transitionFunctions.clear();\n      transitionCanvasCache = {};\n      transitionFrames.clear();\n    }\n  }\n\n  /**\n   * 使用管道模式分块渲染长视频（避免内存溢出）\n   * 每渲染一块后关闭 FFmpeg 进程，释放内存，再继续下一块\n   * @param {VideoMaker} composition - 合成对象\n   * @param {number} totalFrames - 总帧数\n   * @param {number} startTime - 开始时间\n   * @param {number} fps - 帧率\n   * @param {string} outputPath - 输出路径\n   * @param {string} backgroundColor - 背景颜色\n   * @param {Object} options - 选项\n   */\n  async renderFramesWithPipeChunked(composition, totalFrames, startTime, fps, outputPath, backgroundColor, options = {}) {\n    const { chunkFrames = 1500 } = options;\n    const numChunks = Math.ceil(totalFrames / chunkFrames);\n    const chunksDir = path.join(this.cacheDir, 'pipe_chunks');\n    await fs.ensureDir(chunksDir);\n\n    //console.log(`[PipeChunked] 总帧数: ${totalFrames}, 每块: ${chunkFrames}, 分块数: ${numChunks}`);\n\n    const chunkPaths = [];\n    const transitions = composition.transitions || [];\n    const hasTransitions = transitions.length > 0;\n\n    // 初始化转场渲染器（如果有转场）\n    const transitionRenderers = new Map();\n    const transitionFunctions = new Map();\n    let transitionCanvasCache = {};\n\n    // 预先渲染所有转场帧\n    const transitionFrames = new Map();\n    if (transitions.length > 0) {\n      //console.log(`检测到 ${transitions.length} 个转场，预先渲染转场帧...`);\n      for (const transition of transitions) {\n        const transitionKey = `${transition.startTime}_${transition.endTime}_${transition.name}`;\n        const frames = await this.preRenderTransitionFrames(composition, transition, backgroundColor);\n        transitionFrames.set(transitionKey, frames);\n      }\n    }\n\n    try {\n      for (let chunkIndex = 0; chunkIndex < numChunks; chunkIndex++) {\n        const chunkStartFrame = chunkIndex * chunkFrames;\n        const chunkEndFrame = Math.min(chunkStartFrame + chunkFrames, totalFrames);\n        const chunkStartTime = startTime + chunkStartFrame / fps;\n        const chunkFrameCount = chunkEndFrame - chunkStartFrame;\n\n        //console.log(`[PipeChunked] 渲染分块 ${chunkIndex + 1}/${numChunks}: 帧 [${chunkStartFrame}-${chunkEndFrame}), 时间 [${chunkStartTime.toFixed(2)}s)`);\n\n        // 重新初始化视频元素（因为视频需要从新时间点开始缓冲）\n        await this.reInitializeVideoElements(composition, chunkStartTime);\n\n        // 生成分块输出路径\n        const chunkOutputPath = path.join(chunksDir, `chunk_${chunkIndex.toString().padStart(3, '0')}.mp4`);\n        chunkPaths.push(chunkOutputPath);\n\n        // 启动 FFmpeg 管道进程\n        const useRaw = !hasTransitions;\n        const pipe = await this.ffmpeg.imagesToVideoPipe(chunkOutputPath, {\n          fps,\n          width: composition.width,\n          height: composition.height,\n          useRaw,\n        });\n\n        // 渲染这一块的帧\n        for (let frame = chunkStartFrame; frame < chunkEndFrame; frame++) {\n          const time = startTime + frame / fps;\n\n          // 检查是否有转场\n          const activeTransition = transitions.find(t =>\n            time >= t.startTime && time < t.endTime\n          );\n\n          let buffer;\n          if (activeTransition) {\n            const transitionKey = `${activeTransition.startTime}_${activeTransition.endTime}_${activeTransition.name}`;\n            const frames = transitionFrames.get(transitionKey);\n            if (frames) {\n              buffer = await this.renderFrameWithTransition(\n                composition, time, activeTransition, backgroundColor,\n                transitionRenderers, frames, transitionFunctions, transitionCanvasCache\n              );\n            } else {\n              buffer = await this.renderFrameWithTransition(\n                composition, time, activeTransition, backgroundColor,\n                transitionRenderers, null, transitionFunctions, transitionCanvasCache\n              );\n            }\n          } else {\n            await this.renderer.renderFrame(composition.timeline.getLayers(), time, backgroundColor);\n            buffer = this.renderer.getCanvasBuffer(hasTransitions ? 'png' : 'raw');\n          }\n\n          try {\n            await pipe.writeFrame(buffer);\n          } catch (writeError) {\n            console.error(`写入第 ${frame + 1} 帧失败:`, writeError.message);\n            pipe.kill();\n            throw writeError;\n          }\n\n          // 显示进度\n          if (frame % 30 === 0 || frame === totalFrames - 1) {\n            const progress = ((frame + 1) / totalFrames * 100).toFixed(1);\n            //console.log(`渲染进度: ${progress}% (${frame + 1}/${totalFrames})`);\n          }\n        }\n\n        // 关闭当前分块的 FFmpeg 进程\n        pipe.end();\n        await pipe.finish;\n        //console.log(`[PipeChunked] 分块 ${chunkIndex + 1} 完成，FFmpeg 进程已关闭`);\n\n        // 销毁渲染器并通知 GC 释放内存\n        if (this.renderer) {\n          this.renderer.destroy();\n          this.renderer = new Renderer({\n            width: composition.width,\n            height: composition.height,\n            fps: fps,\n            quality: this.config.quality,\n          });\n          await this.renderer.init();\n        }\n\n        if (global.gc) {\n          global.gc();\n        }\n      }\n\n      // 所有分块渲染完成，合并\n      //console.log('[PipeChunked] 所有分块渲染完成，开始合并...');\n      await this.ffmpeg.concatVideos(chunkPaths, outputPath, {\n        fps,\n        width: composition.width,\n        height: composition.height,\n      });\n\n      // 清理分块文件\n      for (const chunkPath of chunkPaths) {\n        await fs.remove(chunkPath).catch(() => {});\n      }\n      await fs.remove(chunksDir).catch(() => {});\n\n      //console.log('[PipeChunked] 视频导出完成');\n    } catch (error) {\n      console.error('[PipeChunked] 分块渲染失败:', error);\n      for (const chunkPath of chunkPaths) {\n        await fs.remove(chunkPath).catch(() => {});\n      }\n      await fs.remove(chunksDir).catch(() => {});\n      throw error;\n    } finally {\n      transitionRenderers.clear();\n      transitionFunctions.clear();\n      transitionCanvasCache = {};\n      transitionFrames.clear();\n    }\n  }\n\n  /**\n   * 预先渲染转场的 fromFrame 和 toFrame\n   * 转场居中在两个场景交界处：\n   * - transition.startTime = sceneEndTime - duration/2（转场开始）\n   * - transition.endTime = sceneEndTime + duration/2（转场结束）\n   * @param {VideoMaker} composition - 合成对象\n   * @param {Object} transition - 转场配置\n   * @param {string} backgroundColor - 背景色\n   * @returns {Promise<{fromFrame: Buffer, toFrame: Buffer}>} 预渲染的帧\n   */\n  async preRenderTransitionFrames(composition, transition, backgroundColor) {\n    // 渲染时间稍微偏离转场时间点，确保捕获正确的场景状态\n    // 因为 isActiveAtTime 使用 time < endTime，所以 atTime = transitionStartTime - epsilon 时 fromScene 仍可见\n    const fromScene = transition.fromScene;\n    const fromBackgroundColor = fromScene.backgroundLayer?.config?.backgroundColor || backgroundColor;\n    // 在转场开始时间稍微之前渲染 fromFrame，确保 fromScene 元素仍可见\n    const fromRenderTime = Math.max(0, transition.startTime - 0.001);\n    await this.renderer.renderFrame(composition.timeline.getLayers(), fromRenderTime, fromBackgroundColor);\n    // 转场帧使用原始 RGBA 数据（与转场函数兼容）\n    const fromBuffer = this.renderer.getCanvasBuffer('raw');\n\n    // 在转场结束时间稍微之后渲染 toFrame，确保 toScene 元素已可见\n    // toScene.startTime = transition.endTime，所以 atTime = transition.endTime 时 toScene 已可见\n    const toScene = transition.toScene;\n    const toBackgroundColor = toScene.backgroundLayer?.config?.backgroundColor || backgroundColor;\n    const toRenderTime = transition.endTime;\n    await this.renderer.renderFrame(composition.timeline.getLayers(), toRenderTime, toBackgroundColor);\n    // 转场帧使用原始 RGBA 数据（与转场函数兼容）\n    const toBuffer = this.renderer.getCanvasBuffer('raw');\n\n    return {\n      fromFrame: fromBuffer,\n      toFrame: toBuffer,\n    };\n  }\n\n  /**\n   * 渲染带转场效果的帧\n   * @param {VideoMaker} composition - 合成对象\n   * @param {number} time - 当前时间\n   * @param {Object} transition - 转场配置\n   * @param {string} backgroundColor - 背景色\n   * @param {Map} transitionRenderers - 转场渲染器缓存\n   * @param {Object} preRenderedFrames - 预渲染的帧 {fromFrame, toFrame}（可选）\n   * @param {Map} transitionFunctions - 转场函数缓存（可选）\n   * @param {Object} transitionCanvasCache - 转场 Canvas 缓存（可选）\n   * @returns {Promise<Buffer>} PNG buffer\n   */\n  async renderFrameWithTransition(composition, time, transition, backgroundColor, transitionRenderers, preRenderedFrames = null, transitionFunctions = null, transitionCanvasCache = null) {\n    // 计算转场进度（0-1）\n    const actualDuration = transition.endTime - transition.startTime;\n    const progress = Math.max(0, Math.min(1, (time - transition.startTime) / actualDuration));\n    \n    // 获取或创建转场渲染器\n    const rendererKey = `${transition.name}_${transition.easing || 'linear'}`;\n    let transitionRenderer = transitionRenderers.get(rendererKey);\n    if (!transitionRenderer) {\n      transitionRenderer = new TransitionRenderer({\n        name: transition.name,\n        easing: transition.easing,\n        params: transition.params,\n      });\n      transitionRenderers.set(rendererKey, transitionRenderer);\n    }\n    \n    // 缓存转场函数（基于 transition name + width + height + channels）\n    // 避免每次调用都创建新的 GL 上下文和资源\n    const functionKey = `${rendererKey}_${composition.width}_${composition.height}_4`;\n    let transitionFunction;\n    if (transitionFunctions && transitionFunctions.has(functionKey)) {\n      transitionFunction = transitionFunctions.get(functionKey);\n    } else {\n      transitionFunction = transitionRenderer.create({\n        width: composition.width,\n        height: composition.height,\n        channels: 4,\n      });\n      if (transitionFunctions) {\n        transitionFunctions.set(functionKey, transitionFunction);\n      }\n    }\n    \n    // 使用预渲染的帧（如果提供），否则实时渲染\n    let fromBuffer, toBuffer;\n    if (preRenderedFrames) {\n      fromBuffer = preRenderedFrames.fromFrame;\n      toBuffer = preRenderedFrames.toFrame;\n    } else {\n      // 回退到原来的实时渲染方法\n      const fromScene = transition.fromScene;\n      const fromBackgroundColor = fromScene.backgroundLayer?.config?.backgroundColor || backgroundColor;\n      // 在转场开始时间渲染 fromFrame\n      await this.renderer.renderFrame(composition.timeline.getLayers(), transition.startTime, fromBackgroundColor);\n      // 使用原始 RGBA 数据（与转场函数兼容）\n      fromBuffer = this.renderer.getCanvasBuffer('raw');\n      \n      const toScene = transition.toScene;\n      const toBackgroundColor = toScene.backgroundLayer?.config?.backgroundColor || backgroundColor;\n      // 在转场结束时间渲染 toFrame\n      await this.renderer.renderFrame(composition.timeline.getLayers(), transition.endTime, toBackgroundColor);\n      // 使用原始 RGBA 数据（与转场函数兼容）\n      toBuffer = this.renderer.getCanvasBuffer('raw');\n    }\n    \n// 使用转场函数混合两个场景\n    const resultBuffer = transitionFunction({\n      fromFrame: fromBuffer,\n      toFrame: toBuffer,\n      progress: progress,\n    });\n\n    // 复用 Canvas（避免每次创建新的 Canvas）\n    let resultCanvas;\n    if (transitionCanvasCache && transitionCanvasCache.canvas) {\n      resultCanvas = transitionCanvasCache.canvas;\n    } else {\n      resultCanvas = createCanvas(composition.width, composition.height);\n      if (transitionCanvasCache) {\n        transitionCanvasCache.canvas = resultCanvas;\n      }\n    }\n    \n    const ctx = resultCanvas.getContext('2d');\n    const imageData = ctx.createImageData(composition.width, composition.height);\n    // Buffer.from() 返回的是 Node.js Buffer，而 Uint8Array.from() 可以直接从 Buffer 创建\n    // imageData.data 是 Uint8ClampedArray，需要确保 resultBuffer 是兼容的格式\n    // 将 resultBuffer（可能是 Node.js Buffer）转换为 Uint8Array 再设置\n    const uint8Data = new Uint8Array(resultBuffer.buffer, resultBuffer.byteOffset, resultBuffer.byteLength);\n    imageData.data.set(uint8Data);\n    ctx.putImageData(imageData, 0, 0);\n    \n    // 转场帧使用 PNG 格式（因为转场期间 FFmpeg 使用 PNG 输入格式）\n    return resultCanvas.toBuffer('image/png');\n  }\n\n  /**\n   * 创建只包含指定场景元素的临时图层\n   * @param {VideoMaker} composition - 合成对象\n   * @param {Object} scene - 场景对象\n   * @param {number} time - 当前时间\n   * @param {boolean} isTransition - 是否在转场期间（如果是，会调整元素时间让它们在转场开始时间就可见）\n   * @returns {Array<ElementLayer>} 场景图层数组\n   */\n  _createSceneLayers(composition, scene, time, isTransition = false) {\n    // 获取场景的开始时间（绝对时间）\n    const sceneStartTime = scene.startTime !== undefined ? scene.startTime : 0;\n    const sceneEndTime = sceneStartTime + (scene.duration || 0);\n    \n    // 方法：从 composition.timeline 的所有图层中，筛选出属于指定场景的元素\n    // 这样可以避免重复构建场景，并且使用已经构建好的元素（时间已经是绝对时间）\n    const allLayers = composition.timeline.getLayers();\n    const sceneLayers = [];\n    \n    // 遍历所有图层，筛选出属于该场景的元素\n    for (const layer of allLayers) {\n      if (layer.elements && layer.elements.length > 0) {\n        // 筛选出属于该场景的元素\n        // 元素的时间已经是绝对时间（在 Track.build 中转换的）\n        const sceneElements = layer.elements.filter(element => {\n          if (!element) return false;\n          \n          // 检查元素的时间范围是否与场景重叠\n          const elementStartTime = element.startTime !== undefined ? element.startTime : 0;\n          const elementEndTime = element.endTime !== undefined ? element.endTime : Infinity;\n          \n          // 元素属于场景，如果：\n          // 1. 元素在场景时间范围内开始\n          // 2. 或者元素在场景时间范围内结束\n          // 3. 或者元素完全包含场景时间范围\n          // 4. 或者元素在场景时间范围内（即使开始时间在场景之前，结束时间在场景之后）\n          const elementStartsInScene = elementStartTime >= sceneStartTime && elementStartTime < sceneEndTime;\n          const elementEndsInScene = elementEndTime > sceneStartTime && elementEndTime <= sceneEndTime;\n          const elementContainsScene = elementStartTime <= sceneStartTime && elementEndTime >= sceneEndTime;\n          const elementActiveInScene = elementStartTime < sceneEndTime && elementEndTime > sceneStartTime;\n          \n          return elementStartsInScene || elementEndsInScene || elementContainsScene || elementActiveInScene;\n        });\n        \n        // 如果有属于该场景的元素，创建临时图层\n        if (sceneElements.length > 0) {\n          const sceneLayer = new ElementLayer({\n            zIndex: layer.zIndex,\n            startTime: sceneStartTime,\n            endTime: sceneEndTime,\n          });\n          \n          // 添加元素到临时图层（元素的时间已经是绝对时间，不需要转换）\n          for (const element of sceneElements) {\n            // 确保元素的 canvas 尺寸正确\n            element.canvasWidth = composition.width;\n            element.canvasHeight = composition.height;\n            \n            // 如果是转场期间，且元素在转场开始时间还没有开始，需要调整元素的时间\n            if (isTransition && element.startTime !== undefined && element.startTime > time) {\n              // 计算时间偏移\n              const timeOffset = element.startTime - time;\n              // 临时调整元素的时间，让它在转场开始时间就开始显示\n              const originalStartTime = element.startTime;\n              const originalEndTime = element.endTime;\n              element.startTime = time;\n              if (element.endTime !== undefined && element.endTime !== Infinity) {\n                element.endTime = element.endTime - timeOffset;\n              }\n              \n              // 如果是分割文本，也需要调整子元素的时间\n              if (element.type === 'text' && element.segments && element.segments.length > 0) {\n                for (const segment of element.segments) {\n                  if (segment.startTime !== undefined && segment.startTime > time) {\n                    const segmentTimeOffset = segment.startTime - time;\n                    segment.startTime = time;\n                    if (segment.endTime !== undefined && segment.endTime !== Infinity) {\n                      segment.endTime = segment.endTime - segmentTimeOffset;\n                    }\n                  }\n                }\n              }\n            }\n            \n            // 如果是分割文本，也需要设置子元素的 canvas 尺寸\n            if (element.type === 'text' && element.segments && element.segments.length > 0) {\n              for (const segment of element.segments) {\n                segment.canvasWidth = composition.width;\n                segment.canvasHeight = composition.height;\n              }\n            }\n            \n            sceneLayer.addElement(element);\n          }\n          \n          sceneLayers.push(sceneLayer);\n        }\n      }\n    }\n    \n    return sceneLayers;\n  }\n\n  /**\n   * 使用 Worker 并行渲染所有帧（保存到文件）\n   * @param {VideoMaker} composition - 合成对象\n   * @param {number} totalFrames - 总帧数\n   * @param {number} startTime - 开始时间\n   * @param {number} fps - 帧率\n   * @param {string} tempDir - 临时目录\n   * @param {string} backgroundColor - 背景颜色\n   * @param {Object} options - 选项\n   */\n  async renderFramesWithWorker(composition, totalFrames, startTime, fps, tempDir, backgroundColor, options = {}) {\n    const { numWorkers = 4 } = options;\n    \n    // 收集字体信息（用于在 Worker 中注册）\n    const { getRegisteredFonts } = await import('../utils/font-manager.js');\n    const fontInfo = getRegisteredFonts();\n    \n    // 序列化 composition（与转场预处理并行）\n    const compositionDataPromise = this._serializeComposition(composition);\n    \n    // 预处理转场帧（如果有转场）- 与序列化并行执行\n    const transitions = composition.transitions || [];\n    const transitionFrames = new Map(); // frameIndex -> buffer\n    const transitionRanges = []; // [{ startFrame, endFrame }]\n    \n    // 转场预处理任务（与序列化并行）\n    const transitionPreprocessTask = (async () => {\n      if (transitions.length > 0) {\n        //console.log(`检测到 ${transitions.length} 个转场，在主线程预处理转场帧（与 Worker 并行）...`);\n        \n        // 初始化转场渲染器\n        const transitionRenderers = new Map();\n        const transitionFunctions = new Map();\n        const transitionCanvasCache = {};\n        \n        for (const transition of transitions) {\n          const transitionStartFrame = Math.floor((transition.startTime - startTime) * fps);\n          const transitionEndFrame = Math.ceil((transition.endTime - startTime) * fps);\n          \n          //console.log(`转场 ${transition.name || 'unknown'}: 时间范围 [${transition.startTime.toFixed(2)}s, ${transition.endTime.toFixed(2)}s], 帧范围 [${transitionStartFrame}, ${transitionEndFrame})`);\n          \n          // 记录转场范围\n          transitionRanges.push({\n            startFrame: transitionStartFrame,\n            endFrame: transitionEndFrame,\n          });\n          \n          // 预先渲染转场的 fromFrame 和 toFrame\n          const preRenderedFrames = await this.preRenderTransitionFrames(composition, transition, backgroundColor);\n          \n          // 渲染转场期间的所有帧\n          let renderedCount = 0;\n          for (let frame = transitionStartFrame; frame < transitionEndFrame; frame++) {\n            if (frame >= 0 && frame < totalFrames) {\n              const time = startTime + frame / fps;\n              const buffer = await this.renderFrameWithTransition(\n                composition,\n                time,\n                transition,\n                backgroundColor,\n                transitionRenderers,\n                preRenderedFrames,\n                transitionFunctions,\n                transitionCanvasCache\n              );\n              transitionFrames.set(frame, buffer);\n              renderedCount++;\n            }\n          }\n          //console.log(`转场 ${transition.name || 'unknown'}: 渲染了 ${renderedCount} 帧 (帧范围 [${transitionStartFrame}, ${transitionEndFrame}))`);\n        }\n        \n        //console.log(`转场帧预处理完成，共 ${transitionFrames.size} 帧`);\n      }\n    })();\n    \n    // 等待序列化完成（转场预处理在后台继续）\n    const compositionData = await compositionDataPromise;\n    \n    // 将帧分成多个段（考虑转场范围，尽量让段边界避开转场）\n    const framesPerSegment = Math.ceil(totalFrames / numWorkers);\n    const segments = [];\n    \n    for (let i = 0; i < numWorkers; i++) {\n      const startFrame = i * framesPerSegment;\n      const endFrame = Math.min(startFrame + framesPerSegment, totalFrames);\n      if (startFrame < totalFrames) {\n        segments.push({\n          segmentIndex: i,\n          startFrame,\n          endFrame,\n          startTime: startTime + startFrame / fps,\n        });\n      }\n    }\n    \n    console.log(`将视频分成 ${segments.length} 个段进行并行渲染...`);\n    \n    // 创建 Worker 池（转场预处理在后台继续）\n    const workers = [];\n    const workerPromises = [];\n    \n    // 进度跟踪\n    const segmentProgress = new Map(); // segmentIndex -> { currentFrame, totalFrames }\n    let lastOverallProgress = -1;\n    let lastProgressTime = Date.now(); // 上次收到进度的时间\n    let lastProgressWorker = -1; // 上次收到进度的 Worker\n\n    // 信号处理：确保 Ctrl+C 能立即终止所有 Worker\n    let isCancelled = false;\n    const cleanup = () => {\n      if (isCancelled) return;\n      isCancelled = true;\n      //console.log('\\n收到中断信号，正在终止所有 Worker...');\n      workers.forEach(worker => {\n        try {\n          worker.terminate();\n        } catch (e) {\n          // 忽略终止错误\n        }\n      });\n      //console.log('所有 Worker 已终止');\n    };\n    \n    const signalHandler = () => {\n      cleanup();\n      process.exit(130); // 130 是 SIGINT 的标准退出码\n    };\n    \n    process.on('SIGINT', signalHandler);\n    process.on('SIGTERM', signalHandler);\n    \n    const __filename = fileURLToPath(import.meta.url);\n    // 检测是否在 CommonJS 环境中，如果是则使用 .cjs 扩展名\n    const isCommonJS = typeof require !== 'undefined' && typeof module !== 'undefined';\n    const workerFileName = isCommonJS ? 'worker.cjs' : 'worker.js';\n    const workerPath = path.resolve(path.dirname(__filename), 'workers', workerFileName);\n    \n    for (const segment of segments) {\n      segmentProgress.set(segment.segmentIndex, { currentFrame: 0, totalFrames: segment.endFrame - segment.startFrame });\n      \n      const worker = new Worker(workerPath, {\n        workerData: {\n          ...segment,\n          fps,\n          width: composition.width,\n          height: composition.height,\n          backgroundColor,\n          compositionData,\n          transitionRanges, // 传递转场范围，让 Worker 跳过转场帧\n          fontInfo, // 传递字体信息，让 Worker 注册字体\n          useRaw:options.useRaw, // 传递格式信息，让 Worker 知道应该返回什么格式\n        },\n      });\n      \n      workers.push(worker);\n      \n      const promise = new Promise((resolve, reject) => {\n        worker.on('message', (result) => {\n          if (result.type === 'progress') {\n            // 处理进度消息\n            const { segmentIndex, progress, currentFrame, totalFrames, frameIndex } = result;\n\n            // 更新该段的进度\n            segmentProgress.set(segmentIndex, { currentFrame, totalFrames });\n\n            // 更新最后进度时间（用于调试）\n            lastProgressTime = Date.now();\n            lastProgressWorker = segmentIndex;\n\n            // 计算总体进度（排除转场帧）\n            let totalCompletedFrames = 0;\n            let totalWorkerFrames = 0;\n            for (const [idx, seg] of segments.entries()) {\n              const segProgress = segmentProgress.get(idx) || { currentFrame: 0, totalFrames: seg.endFrame - seg.startFrame };\n              totalCompletedFrames += segProgress.currentFrame;\n              totalWorkerFrames += segProgress.totalFrames;\n            }\n\n            const overallProgress = totalWorkerFrames > 0 ? (totalCompletedFrames / totalWorkerFrames * 100) : 0;\n\n            // 只在总体进度变化超过 1% 时打印，避免输出过多\n            if (Math.abs(overallProgress - lastOverallProgress) >= 1 || overallProgress >= 100) {\n              //console.log(`\\r总体进度: ${overallProgress.toFixed(1)}% (${totalCompletedFrames}/${totalWorkerFrames} 帧) | [Worker ${segmentIndex}] ${progress}%                    `);\n              lastOverallProgress = overallProgress;\n            }\n\n            return; // 不 resolve，继续等待完成消息\n          }\n          \n          if (result.success) {\n            // 保存帧到文件（转场帧会被跳过，因为 Worker 已经跳过了转场帧）\n            for (const frameData of result.frames) {\n              // 检查是否是转场帧（转场帧不应该由 Worker 渲染）\n              const isTransitionFrame = transitionRanges.some(range => \n                frameData.frameIndex >= range.startFrame && frameData.frameIndex < range.endFrame\n              );\n              if (isTransitionFrame) {\n                continue; // 跳过转场帧\n              }\n              const framePath = path.join(tempDir, `frame_${(frameData.frameIndex + 1).toString().padStart(4, '0')}.png`);\n              fs.writeFileSync(framePath, frameData.buffer);\n            }\n            //console.log(`段 ${result.segmentIndex} 完成，共接收 ${result.frames.length} 帧`);\n            resolve(result);\n          } else {\n            reject(new Error(`段 ${result.segmentIndex} 渲染失败: ${result.error}`));\n          }\n          worker.terminate();\n        });\n        \n        worker.on('error', (error) => {\n          reject(new Error(`段 ${segment.segmentIndex} Worker 错误: ${error.message}`));\n          worker.terminate();\n        });\n      });\n      \n      workerPromises.push(promise);\n    }\n    \n    // 等待所有 Worker 完成和转场预处理完成（并行）\n    try {\n      await Promise.all([...workerPromises, transitionPreprocessTask]);\n      \n      if (isCancelled) {\n        return; // 如果已取消，直接返回\n      }\n      \n      //console.log('所有段渲染完成');\n      \n      // 保存转场帧到文件\n      if (transitionFrames.size > 0) {\n        //console.log(`保存 ${transitionFrames.size} 个转场帧到文件...`);\n        for (const [frameIndex, buffer] of transitionFrames) {\n          const framePath = path.join(tempDir, `frame_${(frameIndex + 1).toString().padStart(4, '0')}.png`);\n          await fs.writeFile(framePath, buffer);\n        }\n        //console.log('转场帧保存完成');\n      }\n    } catch (error) {\n      cleanup();\n      // 移除信号监听器\n      process.removeListener('SIGINT', signalHandler);\n      process.removeListener('SIGTERM', signalHandler);\n      throw error;\n    } finally {\n      // 移除信号监听器\n      process.removeListener('SIGINT', signalHandler);\n      process.removeListener('SIGTERM', signalHandler);\n    }\n  }\n\n  /**\n   * 使用 Worker 并行渲染 + 管道模式\n   * @param {VideoMaker} composition - 合成对象\n   * @param {number} totalFrames - 总帧数\n   * @param {number} startTime - 开始时间\n   * @param {number} fps - 帧率\n   * @param {string} outputPath - 输出路径\n   * @param {string} backgroundColor - 背景颜色\n   * @param {Object} options - 选项\n   */\n  async renderFramesWithPipeWorker(composition, totalFrames, startTime, fps, outputPath, backgroundColor, options = {}) {\n    const { numWorkers = 4 } = options;\n    \n    // 检查是否有转场（转场需要使用 PNG 格式）\n    const transitions = composition.transitions || [];\n    const hasTransitions = transitions.length > 0;\n    \n    // 启动 FFmpeg 管道进程\n    // 如果有转场，使用 PNG 格式；否则使用原始数据格式（性能更好）\n    const useRaw = !hasTransitions;\n    const pipe = await this.ffmpeg.imagesToVideoPipe(outputPath, {\n      fps: options.fps,\n      width: options.width,\n      height: options.height,\n      useRaw, // 使用原始数据格式（如果没有转场）\n    });\n    \n    // 收集字体信息（用于在 Worker 中注册）\n    const { getRegisteredFonts } = await import('../utils/font-manager.js');\n    const fontInfo = getRegisteredFonts();\n    \n    // 序列化 composition（与转场预处理并行）\n    const compositionDataPromise = this._serializeComposition(composition);\n    \n    // 预处理转场帧（如果有转场）- 与序列化并行执行\n    const transitionFrames = new Map(); // frameIndex -> buffer\n    const transitionRanges = []; // [{ startFrame, endFrame }]\n    \n    // 转场预处理任务（与序列化并行）\n    const transitionPreprocessTask = (async () => {\n      if (transitions.length > 0) {\n        //console.log(`检测到 ${transitions.length} 个转场，在主线程预处理转场帧（与 Worker 并行）...`);\n        \n        // 初始化转场渲染器\n        const transitionRenderers = new Map();\n        const transitionFunctions = new Map();\n        const transitionCanvasCache = {};\n        \n        for (const transition of transitions) {\n          const transitionStartFrame = Math.floor((transition.startTime - startTime) * fps);\n          const transitionEndFrame = Math.ceil((transition.endTime - startTime) * fps);\n          \n          //console.log(`转场 ${transition.name || 'unknown'}: 时间范围 [${transition.startTime.toFixed(2)}s, ${transition.endTime.toFixed(2)}s], 帧范围 [${transitionStartFrame}, ${transitionEndFrame})`);\n          \n          // 记录转场范围\n          transitionRanges.push({\n            startFrame: transitionStartFrame,\n            endFrame: transitionEndFrame,\n          });\n          \n          // 预先渲染转场的 fromFrame 和 toFrame\n          const preRenderedFrames = await this.preRenderTransitionFrames(composition, transition, backgroundColor);\n          \n          // 渲染转场期间的所有帧\n          let renderedCount = 0;\n          for (let frame = transitionStartFrame; frame < transitionEndFrame; frame++) {\n            if (frame >= 0 && frame < totalFrames) {\n              const time = startTime + frame / fps;\n              const buffer = await this.renderFrameWithTransition(\n                composition,\n                time,\n                transition,\n                backgroundColor,\n                transitionRenderers,\n                preRenderedFrames,\n                transitionFunctions,\n                transitionCanvasCache\n              );\n              transitionFrames.set(frame, buffer);\n              renderedCount++;\n            }\n          }\n          //console.log(`转场 ${transition.name || 'unknown'}: 渲染了 ${renderedCount} 帧 (帧范围 [${transitionStartFrame}, ${transitionEndFrame}))`);\n        }\n        \n        //console.log(`转场帧预处理完成，共 ${transitionFrames.size} 帧`);\n      }\n    })();\n    \n    // 等待序列化完成（转场预处理在后台继续）\n    const compositionData = await compositionDataPromise;\n    \n    // 将帧分成多个段\n    const framesPerSegment = Math.ceil(totalFrames / numWorkers);\n    const segments = [];\n    \n    for (let i = 0; i < numWorkers; i++) {\n      const startFrame = i * framesPerSegment;\n      const endFrame = Math.min(startFrame + framesPerSegment, totalFrames);\n      if (startFrame < totalFrames) {\n        segments.push({\n          segmentIndex: i,\n          startFrame,\n          endFrame,\n          startTime: startTime + startFrame / fps,\n        });\n      }\n    }\n    \n    console.log(`将视频分成 ${segments.length} 个段进行并行渲染...`);\n    \n    // 帧缓冲区管理器\n    class FrameBuffer {\n      constructor(totalFrames) {\n        this.buffer = new Map(); // frameIndex -> buffer\n        this.nextFrameIndex = 0;\n        this.totalFrames = totalFrames;\n      }\n      \n      addFrame(frameIndex, buffer) {\n        // 如果该帧已经存在，检查是否是转场帧（转场帧优先级更高）\n        // 转场帧应该在 Worker 帧之前添加，所以如果已经存在，说明是转场帧，不应该被覆盖\n        if (this.buffer.has(frameIndex)) {\n          return;\n        }\n        this.buffer.set(frameIndex, buffer);\n      }\n      \n      getNextFrames() {\n        const frames = [];\n        while (this.buffer.has(this.nextFrameIndex)) {\n          frames.push({\n            frameIndex: this.nextFrameIndex,\n            buffer: this.buffer.get(this.nextFrameIndex),\n          });\n          this.buffer.delete(this.nextFrameIndex);\n          this.nextFrameIndex++;\n        }\n        return frames;\n      }\n      \n      isComplete() {\n        return this.nextFrameIndex >= this.totalFrames;\n      }\n      \n      getBufferedCount() {\n        return this.buffer.size;\n      }\n    }\n    \n    const frameBuffer = new FrameBuffer(totalFrames);\n    let allWorkersCompleted = false;\n    let completedWorkers = 0;\n    \n    // 创建 Worker 池\n    const workers = [];\n    const workerPromises = [];\n    \n    // 进度跟踪\n    const segmentProgress = new Map(); // segmentIndex -> { currentFrame, totalFrames }\n    let lastOverallProgress = -1;\n    let lastProgressTime = Date.now(); // 上次收到进度的时间\n    let lastProgressWorker = -1; // 上次收到进度的 Worker\n\n    // 信号处理：确保 Ctrl+C 能立即终止所有 Worker\n    let isCancelled = false;\n    const cleanup = () => {\n      if (isCancelled) return;\n      isCancelled = true;\n      //  console.log('\\n收到中断信号，正在终止所有 Worker...');\n      workers.forEach(worker => {\n        try {\n          worker.terminate();\n        } catch (e) {\n          // 忽略终止错误\n        }\n      });\n      // 关闭管道\n      try {\n        pipe.end();\n      } catch (e) {\n        // 忽略关闭错误\n      }\n      //console.log('所有 Worker 已终止');\n    };\n    \n    const signalHandler = () => {\n      cleanup();\n      process.exit(130); // 130 是 SIGINT 的标准退出码\n    };\n    \n    process.on('SIGINT', signalHandler);\n    process.on('SIGTERM', signalHandler);\n    \n    const __filename = fileURLToPath(import.meta.url);\n    // 检测是否在 CommonJS 环境中，如果是则使用 .cjs 扩展名\n    const isCommonJS = typeof require !== 'undefined' && typeof module !== 'undefined';\n    const workerFileName = isCommonJS ? 'worker.cjs' : 'worker.js';\n    const workerPath = path.resolve(path.dirname(__filename), 'workers', workerFileName);\n    \n    // 转场预处理完成标志\n    let transitionPreprocessCompleted = false;\n    \n    // 监听转场预处理完成\n    transitionPreprocessTask.then(() => {\n      transitionPreprocessCompleted = true;\n    }).catch(() => {\n      transitionPreprocessCompleted = true; // 即使失败也标记为完成\n    });\n    \n    // 写入帧到管道的函数（转场帧会在预处理完成后自动添加）\n    const writeFramesToPipe = async () => {\n      let transitionFramesAdded = false; // 标记转场帧是否已添加\n      let framesWritten = 0; // 记录已写入的帧数\n      let loopCount = 0; // 调试：记录循环次数\n      let lastFramesWritten = 0; // 上次写入的帧数\n      let stallCount = 0; // 连续没有写入帧的次数\n      const maxLoopsWithoutProgress = 500; // 最多循环这么多次没进展就强制退出\n      const startTime = Date.now();\n\n      // 定期打印 Worker 状态\n      const printWorkerStatus = () => {\n        const now = Date.now();\n        const sinceLastProgress = ((now - lastProgressTime) / 1000).toFixed(1);\n        //console.log(`[WorkerStatus] 距离上次进度: ${sinceLastProgress}s, 上次Worker: ${lastProgressWorker}, completedWorkers: ${completedWorkers}/${segments.length}`);\n      };\n\n      while (!frameBuffer.isComplete() || frameBuffer.getBufferedCount() > 0 || !transitionPreprocessCompleted || (!transitionFramesAdded && transitionFrames.size > 0)) {\n        loopCount++;\n        const elapsedSeconds = (Date.now() - startTime) / 1000;\n\n        // 每 30 秒打印一次 Worker 状态\n        if (loopCount % 3000 === 0) {\n          printWorkerStatus();\n        }\n\n        if (loopCount % 100 === 0) {\n          //console.log(`[writeFramesToPipe] loop=${loopCount}, elapsed=${elapsedSeconds.toFixed(1)}s, isComplete=${frameBuffer.isComplete()}, buffered=${frameBuffer.getBufferedCount()}, transitionPreprocessCompleted=${transitionPreprocessCompleted}, transitionFramesAdded=${transitionFramesAdded}, transitionFrames.size=${transitionFrames.size}, allWorkersCompleted=${allWorkersCompleted}`);\n        }\n        // 检查是否已取消\n        if (isCancelled) {\n          break;\n        }\n\n        // 检测写入是否停滞（连续 50 次循环没有写入新帧）\n        if (framesWritten === lastFramesWritten) {\n          stallCount++;\n          if (stallCount > 50 && !allWorkersCompleted) {\n            //console.warn(`[writeFramesToPipe] 写入停滞！loop=${loopCount}, buffered=${frameBuffer.getBufferedCount()}, allWorkersCompleted=${allWorkersCompleted}, completedWorkers=${completedWorkers}`);\n            printWorkerStatus();\n          }\n          // 如果所有 Worker 都完成了但还在循环，强制退出\n          if (allWorkersCompleted && stallCount > maxLoopsWithoutProgress) {\n            //console.warn(`[writeFramesToPipe] 强制退出！所有 Worker 完成但循环停滞。framesWritten=${framesWritten}`);\n            break;\n          }\n        } else {\n          stallCount = 0;\n          lastFramesWritten = framesWritten;\n        }\n        \n        // 如果转场预处理已完成，添加转场帧到缓冲区（只添加一次）\n        if (transitionPreprocessCompleted && !transitionFramesAdded && transitionFrames.size > 0) {\n          console.log(`添加 ${transitionFrames.size} 个转场帧到缓冲区...`);\n          for (const [frameIndex, buffer] of transitionFrames) {\n            frameBuffer.addFrame(frameIndex, buffer);\n          }\n          transitionFramesAdded = true;\n          transitionFrames.clear(); // 清空，释放内存\n        }\n        \n        const framesToWrite = frameBuffer.getNextFrames();\n        if (framesToWrite.length > 0) {\n          for (const { buffer } of framesToWrite) {\n            if (isCancelled) {\n              break;\n            }\n            try {\n              await pipe.writeFrame(buffer);\n              framesWritten++;\n            } catch (error) {\n              console.error(`写入帧失败 (已写入 ${framesWritten} 帧):`, error.message);\n              throw error;\n            }\n          }\n        } else if (allWorkersCompleted && transitionPreprocessCompleted && transitionFramesAdded) {\n          // 所有 Worker 和转场预处理都已完成，转场帧已添加，检查是否还有帧\n          //console.log(`[writeFramesToPipe] allWorkersCompleted=${allWorkersCompleted}, transitionPreprocessCompleted=${transitionPreprocessCompleted}, transitionFramesAdded=${transitionFramesAdded}, frameBuffer.isComplete()=${frameBuffer.isComplete()}, bufferedCount=${frameBuffer.getBufferedCount()}`);\n          if (frameBuffer.isComplete() && frameBuffer.getBufferedCount() === 0) {\n            //console.log(`[writeFramesToPipe] 写入循环结束条件满足，退出循环`);\n            break;\n          }\n        } else {\n          // 等待更多帧或转场预处理完成\n          await new Promise(resolve => setTimeout(resolve, 10));\n        }\n      }\n      \n      console.log(`帧写入完成，共写入 ${framesWritten} 帧`);\n    };\n    \n    for (const segment of segments) {\n      segmentProgress.set(segment.segmentIndex, { currentFrame: 0, totalFrames: segment.endFrame - segment.startFrame });\n      \n      const worker = new Worker(workerPath, {\n        workerData: {\n          ...segment,\n          fps,\n          width: composition.width,\n          height: composition.height,\n          backgroundColor,\n          compositionData,\n          transitionRanges, // 传递转场范围，让 Worker 跳过转场帧\n          fontInfo, // 传递字体信息，让 Worker 注册字体\n          useRaw, // 传递格式信息，让 Worker 知道应该返回什么格式\n        },\n      });\n      \n      workers.push(worker);\n      //console.log(`[VideoExporter] Worker ${segment.segmentIndex} 已创建并加入 workers 数组`);\n\n      const promise = new Promise((resolve, reject) => {\n        worker.on('message', async (result) => {\n          //console.log(`[VideoExporter] Worker ${segment.segmentIndex} 收到消息: type=${result.type}, success=${result.success}`);\n          if (result.type === 'progress') {\n            // 处理进度消息\n            const { segmentIndex, progress, currentFrame, totalFrames, frameIndex } = result;\n\n            // 更新该段的进度\n            segmentProgress.set(segmentIndex, { currentFrame, totalFrames });\n\n            // 更新最后进度时间（用于调试）\n            lastProgressTime = Date.now();\n            lastProgressWorker = segmentIndex;\n\n            // 计算总体进度（排除转场帧）\n            let totalCompletedFrames = 0;\n            let totalWorkerFrames = 0;\n            for (const [idx, seg] of segments.entries()) {\n              const segProgress = segmentProgress.get(idx) || { currentFrame: 0, totalFrames: seg.endFrame - seg.startFrame };\n              totalCompletedFrames += segProgress.currentFrame;\n              totalWorkerFrames += segProgress.totalFrames;\n            }\n\n            const overallProgress = totalWorkerFrames > 0 ? (totalCompletedFrames / totalWorkerFrames * 100) : 0;\n\n            // 只在总体进度变化超过 1% 时打印，避免输出过多\n            if (Math.abs(overallProgress - lastOverallProgress) >= 1 || overallProgress >= 100) {\n              console.log(`\\r总体进度: ${overallProgress.toFixed(1)}% (${totalCompletedFrames}/${totalWorkerFrames} 帧) | [Worker ${segmentIndex}] ${progress}%                    `);\n              lastOverallProgress = overallProgress;\n            }\n\n            return; // 不 resolve，继续等待完成消息\n          }\n          \n          if (result.success) {\n            // 将帧存入缓冲区（转场帧会被跳过，因为 Worker 已经跳过了转场帧）\n            console.log(`[Worker ${segment.segmentIndex}] 完成，收到 ${result.frames.length} 帧`);\n            for (const frameData of result.frames) {\n              // 跳过转场帧（在 Worker 中已经跳过了，但以防万一）\n              const isTransitionFrame = transitionRanges.some(range => \n                frameData.frameIndex >= range.startFrame && frameData.frameIndex < range.endFrame\n              );\n              if (isTransitionFrame) {\n                continue; // 跳过转场帧\n              }\n              \n              // 确保 buffer 是 Buffer 类型\n              // 使用 transferList 后，Buffer 应该已经是正确的类型\n              let buffer = frameData.buffer;\n              if (!Buffer.isBuffer(buffer)) {\n                // 如果使用 transferList，Buffer 的底层 ArrayBuffer 会被转移\n                // 需要从 ArrayBuffer 重新创建 Buffer\n                if (buffer && buffer.buffer && buffer.buffer instanceof ArrayBuffer) {\n                  buffer = Buffer.from(buffer.buffer, buffer.byteOffset || 0, buffer.byteLength || buffer.length);\n                } else if (buffer && typeof buffer === 'object' && buffer.type === 'Buffer' && Array.isArray(buffer.data)) {\n                  // JSON 序列化的情况\n                  buffer = Buffer.from(buffer.data);\n                } else if (buffer && buffer.data && Buffer.isBuffer(buffer.data)) {\n                  buffer = buffer.data;\n                } else if (buffer && typeof buffer === 'object' && buffer.length !== undefined) {\n                  // 可能是类数组对象，尝试转换\n                  buffer = Buffer.from(buffer);\n                } else {\n                  console.error(`[VideoExporter] 无法转换 buffer 为 Buffer 类型: ${typeof buffer}`, buffer);\n                  continue; // 跳过无效的帧\n                }\n              }\n              \n              frameBuffer.addFrame(frameData.frameIndex, buffer);\n            }\n            \n            completedWorkers++;\n            console.log(`段 ${result.segmentIndex} 完成，共接收 ${result.frames.length} 帧，缓冲区: ${frameBuffer.getBufferedCount()} 帧`);\n\n            if (completedWorkers === segments.length) {\n              allWorkersCompleted = true;\n              console.log(`所有 Worker 完成！completedWorkers=${completedWorkers}, segments.length=${segments.length}`);\n            }\n\n            resolve(result);\n          } else {\n            reject(new Error(`段 ${result.segmentIndex} 渲染失败: ${result.error}`));\n          }\n          worker.terminate();\n        });\n\n        worker.on('error', (error) => {\n          console.error(`[VideoExporter] Worker ${segment.segmentIndex} 错误:`, error.message);\n          reject(new Error(`段 ${segment.segmentIndex} Worker 错误: ${error.message}`));\n          worker.terminate();\n        });\n\n        // Worker 退出监听器 - 处理 Worker 未发送完成消息就退出的情况\n        let workerExited = false;\n        worker.on('exit', (code) => {\n          console.log(`[VideoExporter] Worker ${segment.segmentIndex} 退出，退出码: ${code}`);\n          workerExited = true;\n          if (code !== 0) {\n            reject(new Error(`段 ${segment.segmentIndex} Worker 异常退出，退出码: ${code}`));\n          }\n        });\n      });\n\n      workerPromises.push(promise);\n    }\n\n    // 启动写入任务（在后台运行）\n    const writeTask = writeFramesToPipe();\n\n    // 等待所有 Worker 完成和转场预处理完成（并行）\n    // 添加超时机制，防止无限等待\n    const timeoutMs = 10 * 60 * 1000; // 10 分钟超时\n    const timeoutPromise = new Promise((_, reject) => {\n      setTimeout(() => reject(new Error('renderFramesWithPipeWorker 超时（10分钟）')), timeoutMs);\n    });\n\n    try {\n      // 竞争 Promise.all 和 timeout\n      await Promise.race([Promise.all([...workerPromises, transitionPreprocessTask]), timeoutPromise]);\n      \n      if (isCancelled) {\n        return; // 如果已取消，直接返回\n      }\n      \n      console.log('所有段渲染完成，转场预处理完成，等待写入管道...');\n      \n      // 注意：转场帧已经在 writeFramesToPipe 中自动添加到缓冲区了\n      // 这里不需要再次添加，因为 writeFramesToPipe 会在转场预处理完成后自动处理\n      \n      // 等待所有帧写入完成\n      await writeTask;\n      \n      if (isCancelled) {\n        return; // 如果已取消，直接返回\n      }\n      \n      // 确保所有帧都已写入\n      const remainingFrames = frameBuffer.getBufferedCount();\n      console.log(`所有帧写入完成，缓冲区剩余: ${remainingFrames} 帧`);\n      \n      // 如果还有未写入的帧，继续写入\n      if (remainingFrames > 0) {\n        console.log(`继续写入剩余的 ${remainingFrames} 帧...`);\n        while (frameBuffer.getBufferedCount() > 0) {\n          const framesToWrite = frameBuffer.getNextFrames();\n          if (framesToWrite.length > 0) {\n            for (const { buffer } of framesToWrite) {\n              await pipe.writeFrame(buffer);\n            }\n          } else {\n            break;\n          }\n        }\n      }\n      \n      // 验证所有帧都已写入\n      const finalRemaining = frameBuffer.getBufferedCount();\n      if (finalRemaining > 0) {\n        console.warn(`警告: 仍有 ${finalRemaining} 帧未写入`);\n      }\n      \n      console.log('关闭 FFmpeg 输入管道...');\n      \n      // 关闭管道\n      if (pipe && pipe.end) {\n        try {\n          pipe.end();\n        } catch (error) {\n          console.error('关闭管道时出错:', error.message);\n        }\n      } else {\n        console.warn('警告: pipe.end() 不可用');\n      }\n      \n      // 等待 FFmpeg 编码完成\n      console.log('等待 FFmpeg 编码完成...');\n      try {\n        await pipe.finish;\n        console.log('FFmpeg 编码完成');\n      } catch (error) {\n        console.error('FFmpeg 编码失败:', error.message);\n        throw error;\n      }\n    } catch (error) {\n      cleanup();\n      // 移除信号监听器\n      process.removeListener('SIGINT', signalHandler);\n      process.removeListener('SIGTERM', signalHandler);\n      throw error;\n    } finally {\n      // 移除信号监听器\n      process.removeListener('SIGINT', signalHandler);\n      process.removeListener('SIGTERM', signalHandler);\n\n      // 清理资源，避免内存泄漏\n      segmentProgress.clear();\n      workers.length = 0;\n    }\n  }\n\n  /**\n   * 串行渲染所有帧（保存到文件）\n   * @param {string|null} tempDir - 临时目录，如果为 null 则不保存文件（仅渲染）\n   */\n  async renderFramesSerial(composition, totalFrames, startTime, fps, tempDir, backgroundColor) {\n    // 初始化转场渲染器（如果有转场）\n    const transitions = composition.transitions || [];\n    const transitionRenderers = new Map();\n    const transitionFunctions = new Map(); // 缓存转场函数\n    let transitionCanvasCache = {}; // 缓存转场 Canvas\n    \n    // 预先渲染并保存所有转场的帧\n    const transitionFrames = new Map();\n    if (transitions.length > 0) {\n      console.log(`检测到 ${transitions.length} 个转场，预先渲染转场帧...`);\n      for (const transition of transitions) {\n        const transitionKey = `${transition.startTime}_${transition.endTime}_${transition.name}`;\n        const frames = await this.preRenderTransitionFrames(composition, transition, backgroundColor);\n        transitionFrames.set(transitionKey, frames);\n      }\n    }\n    \n    for (let frame = 0; frame < totalFrames; frame++) {\n      try {\n        const time = startTime + frame / fps;\n        const frameNumber = frame + 1;\n\n        // 检查是否有转场\n        const activeTransition = transitions.find(t => \n          time >= t.startTime && time < t.endTime\n        );\n        \n        let buffer;\n        if (activeTransition) {\n          // 有转场，使用预渲染的帧进行转场混合\n          const transitionKey = `${activeTransition.startTime}_${activeTransition.endTime}_${activeTransition.name}`;\n          const frames = transitionFrames.get(transitionKey);\n          if (frames) {\n            buffer = await this.renderFrameWithTransition(\n              composition, \n              time, \n              activeTransition, \n              backgroundColor,\n              transitionRenderers,\n              frames,\n              transitionFunctions,\n              transitionCanvasCache\n            );\n          } else {\n            // 如果没有预渲染的帧，回退到原来的方法\n            buffer = await this.renderFrameWithTransition(\n              composition, \n              time, \n              activeTransition, \n              backgroundColor,\n              transitionRenderers,\n              null,\n              transitionFunctions,\n              transitionCanvasCache\n            );\n          }\n        } else {\n          // 正常渲染帧（转场期间或转场结束后）\n          await this.renderer.renderFrame(composition.timeline.getLayers(), time, backgroundColor);\n          // 文件模式使用 PNG 格式（用于保存帧文件）\n          buffer = this.renderer.getCanvasBuffer('png');\n        }\n\n        // 如果提供了 tempDir，保存帧\n        if (tempDir) {\n          const framePath = path.join(tempDir, `frame_${frameNumber.toString().padStart(4, '0')}.png`);\n          await fs.writeFile(framePath, buffer);\n        }\n\n        // 显示进度\n        if (frame % 30 === 0 || frame === totalFrames - 1) {\n          const progress = ((frame + 1) / totalFrames * 100).toFixed(1);\n          console.log(`渲染进度: ${progress}% (${frame + 1}/${totalFrames})`);\n        }\n      } catch (error) {\n        console.error(`渲染第 ${frame + 1} 帧时出错:`, error);\n        console.error('错误堆栈:', error.stack);\n        throw error;\n      }\n    }\n\n    // 清理转场缓存，释放内存\n    transitionRenderers.clear();\n    transitionFunctions.clear();\n    transitionCanvasCache = {};\n    transitionFrames.clear();\n  }\n\n  /**\n   * 导出 GIF\n   */\n  async exportGIF(composition, outputPath, options = {}) {\n    // GIF 导出逻辑（可以调用 FFmpeg 或使用专门的 GIF 库）\n    // 这里先使用 FFmpeg\n    const tempVideoPath = outputPath.replace('.gif', '_temp.mp4');\n    await this.export(composition, tempVideoPath, { ...options, format: 'mp4' });\n\n    try {\n      // 使用 FFmpeg 将视频转换为 GIF\n      const execaModule = await import('execa');\n      const execa = execaModule.default || execaModule.execa || execaModule;\n      await execa('ffmpeg', [\n        '-y',\n        '-hide_banner', // 隐藏版本信息横幅\n        '-loglevel', 'error', // 只显示错误信息\n        '-i', tempVideoPath,\n        '-vf', 'fps=10,scale=320:-1:flags=lanczos',\n        outputPath,\n      ]);\n      await fs.remove(tempVideoPath);\n      return outputPath;\n    } catch (error) {\n      await fs.remove(tempVideoPath).catch(() => {});\n      throw new Error(`Failed to export GIF: ${error.message}`);\n    }\n  }\n\n  /**\n   * 序列化 composition（支持 onFrame 回调）\n   * @private\n   */\n  async _serializeComposition(composition) {\n    // 递归处理对象，将函数转换为字符串，处理循环引用\n    const serializeFunctions = (obj, path = '', visited = new WeakSet()) => {\n      if (obj === null || obj === undefined) {\n        return obj;\n      }\n      \n      // 处理基本类型\n      if (typeof obj !== 'object' && typeof obj !== 'function') {\n        return obj;\n      }\n      \n      // 处理函数\n      if (typeof obj === 'function') {\n        // 将函数转换为字符串，标记为特殊类型\n        // 如果函数有 __context 属性（用户提供的上下文），也一起序列化\n        const funcData = {\n          __isFunction: true,\n          __functionCode: obj.toString(),\n        };\n        \n        // 检查函数是否有关联的上下文\n        if (obj.__context && typeof obj.__context === 'object') {\n          // 序列化上下文对象（递归处理，但避免循环引用）\n          funcData.__context = serializeFunctions(obj.__context, `${path}.__context`, new WeakSet());\n        }\n        \n        return funcData;\n      }\n      \n      // 处理循环引用\n      if (visited.has(obj)) {\n        // 如果已经访问过，返回占位符\n        return {\n          __isCircular: true,\n          __circularRef: '[Circular Reference]',\n        };\n      }\n      \n      // 标记为已访问\n      visited.add(obj);\n      \n      // 处理数组\n      if (Array.isArray(obj)) {\n        return obj.map((item, index) => serializeFunctions(item, `${path}[${index}]`, visited));\n      }\n      \n      // 处理对象\n      if (typeof obj === 'object') {\n        // 跳过某些不应该序列化的对象类型\n        if (obj instanceof Error || obj instanceof RegExp || obj instanceof Date) {\n          return obj.toString();\n        }\n        \n        // 跳过 DOM 对象、Canvas 对象等\n        if (obj.constructor && (\n          obj.constructor.name === 'HTMLImageElement' ||\n          obj.constructor.name === 'HTMLVideoElement' ||\n          obj.constructor.name === 'HTMLCanvasElement' ||\n          obj.constructor.name === 'Image' ||\n          obj.constructor.name === 'Video' ||\n          obj.constructor.name === 'Canvas'\n        )) {\n          return {\n            __isDOMObject: true,\n            __type: obj.constructor.name,\n          };\n        }\n        \n        // 跳过 Paper.js 对象（这些会在 Worker 中重新创建）\n        if (obj.constructor && obj.constructor.name && (\n          obj.constructor.name.startsWith('paper.') ||\n          obj.constructor.name === 'Item' ||\n          obj.constructor.name === 'Path' ||\n          obj.constructor.name === 'Group' ||\n          obj.constructor.name === 'Raster' ||\n          obj.constructor.name === 'PointText'\n        )) {\n          return {\n            __isPaperObject: true,\n            __type: obj.constructor.name,\n          };\n        }\n        \n        // 跳过 VideoBuilder、Track 等构建器对象（这些不应该在 config 中）\n        if (obj.constructor && (\n          obj.constructor.name === 'VideoBuilder' ||\n          obj.constructor.name === 'Track' ||\n          obj.constructor.name === 'Scene' ||\n          obj.constructor.name === 'Component' ||\n          obj.constructor.name === 'VideoMaker' ||\n          obj.constructor.name === 'Timeline'\n        )) {\n          return {\n            __isBuilderObject: true,\n            __type: obj.constructor.name,\n          };\n        }\n        \n        const result = {};\n        for (const key in obj) {\n          if (obj.hasOwnProperty(key)) {\n            // 跳过某些不应该序列化的属性\n            if (key === 'parent' || key === 'builder' || key === 'track' || key === 'scene' ||\n                key === 'canvasWidth' || key === 'canvasHeight' || key === '_paperItem' ||\n                key === '_paperInstance' || key === '_loadedCallbackCalled') {\n              continue;\n            }\n            \n            // 检查值的类型，跳过不应该序列化的对象\n            const value = obj[key];\n            if (value && typeof value === 'object') {\n              // 跳过 VideoBuilder、Track、Scene、Component 等构建器对象\n              if (value.constructor && (\n                value.constructor.name === 'VideoBuilder' ||\n                value.constructor.name === 'Track' ||\n                value.constructor.name === 'Scene' ||\n                value.constructor.name === 'Component' ||\n                value.constructor.name === 'VideoMaker' ||\n                value.constructor.name === 'Timeline'\n              )) {\n                continue;\n              }\n            }\n            \n            try {\n              const serializedValue = serializeFunctions(value, path ? `${path}.${key}` : key, visited);\n              if (serializedValue !== undefined) {\n                result[key] = serializedValue;\n              }\n            } catch (e) {\n              // 如果序列化失败，跳过该属性\n              console.warn(`[序列化] 跳过属性 ${path ? `${path}.${key}` : key}:`, e.message);\n            }\n          }\n        }\n        return result;\n      }\n      \n      return obj;\n    };\n    \n    // 序列化基本配置\n    const serialized = {\n      config: {\n        width: composition.width,\n        height: composition.height,\n        fps: composition.fps,\n        backgroundColor: composition.backgroundColor,\n        duration: composition.duration,\n      },\n      layers: await Promise.all(composition.layers.map(async (layer) => ({\n        config: {\n          zIndex: layer.zIndex,\n          name: layer.name,\n          type: layer.type || 'element', // 添加图层类型\n        },\n        elements: layer.elements ? await Promise.all(layer.elements.map(async (element) => {\n          // 序列化 config，将函数转换为字符串，处理循环引用\n          let serializedConfig;\n          try {\n            // 为每个元素创建新的序列化上下文（新的 visited Set）\n            // 特别注意：需要规范化动画配置（将动画实例转换为配置对象）\n            const configToSerialize = { ...element.config };\n            \n            // 从 element.animations 中获取动画配置（而不是从 config.animations）\n            // 因为 BaseElement 构造函数会从 config.animations 中提取并删除\n            // 动画实际存储在 element.animations 数组中\n            if (element.animations && Array.isArray(element.animations) && element.animations.length > 0) {\n              // 动态导入 normalizeAnimationConfig\n              const baseElementModule = await import('../elements/BaseElement.js');\n              const { normalizeAnimationConfig } = baseElementModule;\n              configToSerialize.animations = element.animations.map(anim => \n                normalizeAnimationConfig(anim)\n              );\n            } else if (configToSerialize.animations && Array.isArray(configToSerialize.animations)) {\n              // 如果 element.animations 不存在，尝试从 config.animations 中获取（向后兼容）\n              const baseElementModule = await import('../elements/BaseElement.js');\n              const { normalizeAnimationConfig } = baseElementModule;\n              configToSerialize.animations = configToSerialize.animations.map(anim => \n                normalizeAnimationConfig(anim)\n              );\n            }\n            \n            serializedConfig = serializeFunctions(configToSerialize, '', new WeakSet());\n          } catch (e) {\n            console.warn(`[序列化] 元素 ${element.type} 的 config 序列化失败:`, e.message);\n            // 如果序列化失败，尝试只序列化基本属性\n            serializedConfig = {};\n            for (const key in element.config) {\n              if (element.config.hasOwnProperty(key)) {\n                const value = element.config[key];\n                if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' || value === null) {\n                  serializedConfig[key] = value;\n                } else if (typeof value === 'function') {\n                  serializedConfig[key] = {\n                    __isFunction: true,\n                    __functionCode: value.toString(),\n                  };\n                } else if (Array.isArray(value)) {\n                  // 处理数组（如 animations）\n                  if (key === 'animations') {\n                    // 在异步上下文中，需要先导入 normalizeAnimationConfig\n                    // 但由于这是在 try-catch 的回退逻辑中，这里先简单处理\n                    // 实际应该在主 try 块中已经处理了\n                    serializedConfig[key] = value;\n                  } else {\n                    serializedConfig[key] = value;\n                  }\n                }\n              }\n            }\n          }\n          \n          // 也序列化元素上的 onFrame、onRender、onLoaded（如果存在）\n          const callbacks = {};\n          if (element.onFrame) {\n            try {\n              const onFrameData = {\n                __isFunction: true,\n                __functionCode: element.onFrame.toString(),\n              };\n              // 如果 onFrame 有关联的上下文，也一起序列化\n              if (element.onFrame.__context && typeof element.onFrame.__context === 'object') {\n                onFrameData.__context = serializeFunctions(element.onFrame.__context, 'element.onFrame.__context', new WeakSet());\n              }\n              callbacks.onFrame = onFrameData;\n            } catch (e) {\n              console.warn(`[序列化] onFrame 序列化失败:`, e.message);\n            }\n          }\n          if (element.onRender) {\n            try {\n              const onRenderData = {\n                __isFunction: true,\n                __functionCode: element.onRender.toString(),\n              };\n              if (element.onRender.__context && typeof element.onRender.__context === 'object') {\n                onRenderData.__context = serializeFunctions(element.onRender.__context, 'element.onRender.__context', new WeakSet());\n              }\n              callbacks.onRender = onRenderData;\n            } catch (e) {\n              console.warn(`[序列化] onRender 序列化失败:`, e.message);\n            }\n          }\n          if (element.onLoaded) {\n            try {\n              const onLoadedData = {\n                __isFunction: true,\n                __functionCode: element.onLoaded.toString(),\n              };\n              if (element.onLoaded.__context && typeof element.onLoaded.__context === 'object') {\n                onLoadedData.__context = serializeFunctions(element.onLoaded.__context, 'element.onLoaded.__context', new WeakSet());\n              }\n              callbacks.onLoaded = onLoadedData;\n            } catch (e) {\n              console.warn(`[序列化] onLoaded 序列化失败:`, e.message);\n            }\n          }\n          \n          // 序列化分割文本的特殊属性\n          let originalAnimations = undefined;\n          if (element.type === 'text' && element.originalAnimations) {\n            try {\n              // 使用相对路径导入，从 src/core/VideoExporter.js 到 src/elements/BaseElement.js\n              const baseElementModule = await import('../elements/BaseElement.js');\n              const { normalizeAnimationConfig } = baseElementModule;\n              originalAnimations = element.originalAnimations.map(anim => normalizeAnimationConfig(anim));\n            } catch (e) {\n              console.warn(`[序列化] 文本元素 originalAnimations 序列化失败:`, e.message);\n            }\n          }\n          \n          return {\n            type: element.type,\n            config: serializedConfig,\n            callbacks: Object.keys(callbacks).length > 0 ? callbacks : undefined,\n            // 序列化元素的时间属性（这些不在 config 中，但在 Track.build 时设置）\n            startTime: element.startTime !== undefined ? element.startTime : undefined,\n            endTime: element.endTime !== undefined && element.endTime !== Infinity ? element.endTime : undefined,\n            duration: element.duration !== undefined ? element.duration : undefined,\n            // 序列化其他重要属性\n            visible: element.visible !== undefined ? element.visible : true,\n            zIndex: element.zIndex !== undefined ? element.zIndex : undefined,\n            // 序列化分割文本的特殊属性\n            originalAnimations: originalAnimations,\n            split: element.split !== undefined ? element.split : undefined,\n            splitDelay: element.splitDelay !== undefined ? element.splitDelay : undefined,\n            splitDuration: element.splitDuration !== undefined ? element.splitDuration : undefined,\n            // 如果是分割文本，也需要序列化子片段的时间和其他重要属性\n            segments: element.segments && Array.isArray(element.segments) ? await Promise.all(element.segments.map(async (segment) => {\n              // 序列化子片段的动画配置\n              let segmentAnimations = undefined;\n              if (segment.animations && Array.isArray(segment.animations) && segment.animations.length > 0) {\n                try {\n                  const baseElementModule = await import('../elements/BaseElement.js');\n                  const { normalizeAnimationConfig } = baseElementModule;\n                  segmentAnimations = segment.animations.map(anim => normalizeAnimationConfig(anim));\n                } catch (e) {\n                  console.warn(`[序列化] 分割文本子片段动画序列化失败:`, e.message);\n                }\n              }\n              \n              return {\n                startTime: segment.startTime !== undefined ? segment.startTime : undefined,\n                endTime: segment.endTime !== undefined && segment.endTime !== Infinity ? segment.endTime : undefined,\n                duration: segment.duration !== undefined ? segment.duration : undefined,\n                visible: segment.visible !== undefined ? segment.visible : true,\n                animations: segmentAnimations, // 序列化子片段的动画配置\n              };\n            })) : undefined,\n          };\n        })) : [],\n      }))),\n      transitions: [], // Worker 中不支持转场\n    };\n    \n    // 使用 JSON 序列化/反序列化确保完全可序列化\n    // 使用自定义 replacer 函数处理循环引用和特殊对象\n    const jsonReplacer = (key, value) => {\n      // 在 JSON.stringify 时再次过滤循环引用和特殊对象\n      if (typeof value === 'object' && value !== null) {\n        // 如果遇到循环引用标记或特殊对象标记，返回 undefined（跳过）\n        if (value.__isCircular || value.__isDOMObject || value.__isPaperObject || value.__isBuilderObject) {\n          return undefined;\n        }\n        \n        // 检查是否是 VideoBuilder、Track、Scene 等构建器对象\n        if (value.constructor && (\n          value.constructor.name === 'VideoBuilder' ||\n          value.constructor.name === 'Track' ||\n          value.constructor.name === 'Scene' ||\n          value.constructor.name === 'VideoMaker' ||\n          value.constructor.name === 'Timeline'\n        )) {\n          return undefined;\n        }\n        \n        // 特殊处理动画日程事件，确保 track 字段信息不被丢失\n        if (Array.isArray(value) && value.length > 0 && value[0].name && value[0].start !== undefined) {\n          // 这看起来像动画日程数组，我们需要确保 track 信息在序列化后仍然可用\n          return value.map(evt => ({\n            // 保持原始 track 值，不进行特殊处理\n            track: evt.track,\n            name: evt.name,\n            action: evt.action,\n            start: evt.start,\n            end: evt.end,\n            loop: evt.loop,\n            mix: evt.mix,\n            delay: evt.delay\n          }));\n        }\n      }\n      return value;\n    };\n    \n    try {\n      return JSON.parse(JSON.stringify(serialized, jsonReplacer));\n    } catch (e) {\n      // 如果仍然失败，尝试更激进的清理策略\n      console.warn('[序列化] JSON 序列化失败，尝试清理后重试:', e.message);\n      try {\n        // 创建一个完全干净的副本，只保留基本类型\n        const cleanSerialized = {\n          config: serialized.config,\n          layers: serialized.layers.map(layer => ({\n            config: layer.config,\n            elements: layer.elements.map(element => ({\n              type: element.type,\n              config: element.config ? Object.fromEntries(\n                Object.entries(element.config).filter(([k, v]) => \n                  v === null || \n                  typeof v === 'string' || \n                  typeof v === 'number' || \n                  typeof v === 'boolean' ||\n                  (typeof v === 'object' && v !== null && v.__isFunction)\n                )\n              ) : {},\n              callbacks: element.callbacks,\n            })),\n          })),\n          transitions: [],\n        };\n        return JSON.parse(JSON.stringify(cleanSerialized, jsonReplacer));\n      } catch (e2) {\n        console.error('[序列化] 清理后仍然失败:', e2.message);\n        throw new Error(`无法序列化 composition: ${e.message}`);\n      }\n    }\n  }\n}\n"],"names":["FFmpegUtil","Renderer","TransitionElement","TransitionRenderer","createCanvas","ElementLayer","fileURLToPath","Worker"],"mappings":"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"}