{"version":3,"file":"VideoBuilder.cjs","sources":["../../../src/builder/VideoBuilder.js"],"sourcesContent":["/**\r\n * 视频构建器 - 多轨道多场景支持（直接使用 Layer，不使用 CompositionElement 嵌套）\r\n */\r\nimport { VideoMaker } from '../core/VideoMaker.js';\r\nimport { Track } from './Track.js';\r\nimport path from 'path';\r\nimport fs from 'fs-extra';\r\n\r\n/**\r\n * 视频构建器主类\r\n */\r\nexport class VideoBuilder {\r\n  constructor(config = {}) {\r\n    this.config = {\r\n      width: config.width || 1920,\r\n      height: config.height || 1080,\r\n      fps: config.fps || 30,\r\n      // backgroundColor 不再在构造函数中设置，应该通过 Scene 的 addBackground() 添加\r\n      ...config,\r\n    };\r\n    \r\n    this.tracks = [];\r\n    this.currentTime = 0; // 当前时间位置\r\n  }\r\n\r\n  /**\r\n   * 创建轨道\r\n   * @param {Object} config - 轨道配置 { zIndex, name }\r\n   * @returns {Track} 轨道实例\r\n   */\r\n  createTrack(config = {}) {\r\n    const track = new Track({\r\n      ...config,\r\n      builder: this,\r\n      zIndex: config.zIndex !== undefined ? config.zIndex : this.tracks.length,\r\n    });\r\n    \r\n    this.tracks.push(track);\r\n    return track;\r\n  }\r\n\r\n  /**\r\n   * 获取所有轨道\r\n   * @returns {Array<Track>}\r\n   */\r\n  getTracks() {\r\n    return this.tracks;\r\n  }\r\n\r\n  /**\r\n   * 计算总时长（所有轨道中最长的）\r\n   * @returns {number} 总时长（秒）\r\n   */\r\n  getTotalDuration() {\r\n    if (this.tracks.length === 0) return 0;\r\n    \r\n    return Math.max(...this.tracks.map(track => track.getTotalDuration()));\r\n  }\r\n\r\n  /**\r\n   * 初始化构建器（预加载需要异步加载的元素）\r\n   * @returns {Promise<void>}\r\n   */\r\n  async initialize() {\r\n    // 初始化所有轨道\r\n    for (const track of this.tracks) {\r\n      if (track.initialize) {\r\n        await track.initialize();\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 构建最终的 VideoMaker（直接使用 Layer，不使用 CompositionElement 嵌套）\r\n   * @returns {VideoMaker}\r\n   */\r\n  build() {\r\n    const totalDuration = this.getTotalDuration();\r\n    \r\n    // 创建主合成（背景透明，背景应该通过 Scene 的 addBackground() 添加）\r\n    const mainComposition = new VideoMaker({\r\n      width: this.config.width,\r\n      height: this.config.height,\r\n      fps: this.config.fps,\r\n      duration: totalDuration,\r\n      backgroundColor: 'transparent', // 主合成背景透明\r\n    });\r\n\r\n    // 移除默认的背景图层（因为背景应该通过 Scene 的 addBackground() 添加）\r\n    if (mainComposition.backgroundLayer) {\r\n      mainComposition.removeLayer(mainComposition.backgroundLayer);\r\n      mainComposition.backgroundLayer = null;\r\n    }\r\n\r\n    // 按 zIndex 排序轨道\r\n    const sortedTracks = [...this.tracks].sort((a, b) => a.zIndex - b.zIndex);\r\n\r\n    // 收集所有转场信息\r\n    const allTransitions = [];\r\n    for (const track of sortedTracks) {\r\n      // 先收集转场信息并扩展 fromScene 的 duration\r\n      // 这样 track.build() 时会使用扩展后的 duration\r\n      const sortedScenes = [...track.scenes].sort((a, b) => {\r\n        const aStartTime = a.startTime !== undefined ? a.startTime : 0;\r\n        const bStartTime = b.startTime !== undefined ? b.startTime : 0;\r\n        return aStartTime - bStartTime;\r\n      });\r\n\r\n      for (let i = 0; i < track.transitions.length; i++) {\r\n        const transition = track.transitions[i];\r\n        const transitionDuration = transition.duration || 0.5;\r\n\r\n        // 找到转场对应的from和to场景\r\n        let fromScene = null;\r\n        let toScene = null;\r\n        let transitionStartTime = transition.startTime;\r\n\r\n        // 如果transition.startTime未定义，尝试从场景推断\r\n        if (transitionStartTime === undefined) {\r\n          // 遍历场景，找到转场应该插入的位置\r\n          // 假设转场按顺序添加，第 i 个转场应该在第 i 个和第 i+1 个场景之间\r\n          const sceneIndex = i; // 转场索引对应场景索引\r\n          if (sceneIndex < sortedScenes.length - 1) {\r\n            const scene = sortedScenes[sceneIndex];\r\n            const nextScene = sortedScenes[sceneIndex + 1];\r\n            const sceneEndTime = (scene.startTime || 0) + scene.duration;\r\n\r\n            // 转场居中在两个场景的交界处\r\n            // 转场开始时间 = sceneEndTime - transitionDuration/2\r\n            // 转场结束时间 = sceneEndTime + transitionDuration/2\r\n            // 这样在 sceneEndTime 时正好是转场的 50% 位置\r\n            fromScene = scene;\r\n            toScene = nextScene;\r\n            transitionStartTime = sceneEndTime - transitionDuration / 2;\r\n\r\n            // 计算实际的 transition 时间\r\n            const transitionActualEndTime = transitionStartTime + transitionDuration;\r\n\r\n            // 缩短 fromScene 的 duration，让其元素在转场开始时结束显示\r\n            // 转场使用预渲染帧进行混合，不需要依赖主时间轴上的元素\r\n            // 元素 endTime = fromSceneStart + (transitionStartTime - fromSceneStart) = transitionStartTime\r\n            fromScene.duration = transitionStartTime - (fromScene.startTime || 0);\r\n\r\n            // 调整 toScene.startTime，让它在 transition 结束后开始\r\n            // 同时调整 duration，保持 scene.endTime 不变\r\n            const originalToSceneEndTime = (toScene.startTime || 0) + toScene.duration;\r\n            toScene.startTime = transitionActualEndTime;\r\n            toScene.duration = originalToSceneEndTime - transitionActualEndTime;\r\n          }\r\n        } else {\r\n          // 转场有指定的startTime，查找对应的场景\r\n          // transition.startTime 是转场开始的时间点\r\n          for (let j = 0; j < sortedScenes.length; j++) {\r\n            const scene = sortedScenes[j];\r\n            const sceneStartTime = scene.startTime !== undefined ? scene.startTime : 0;\r\n            \r\n            // 找到在转场开始时间之后的场景（转场的目标场景）\r\n            if (sceneStartTime >= transitionStartTime) {\r\n              // 找到目标场景，源场景是其前一个场景\r\n              if (j > 0) {\r\n                fromScene = sortedScenes[j - 1];\r\n                toScene = scene;\r\n                break;\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        if (fromScene && toScene && transitionStartTime !== undefined) {\r\n          // 转场时间计算：\r\n          // transition.startTime 是转场开始的时间点\r\n          // 转场结束时间 = startTime + duration\r\n          const transitionActualStartTime = transitionStartTime;\r\n          const transitionActualEndTime = transitionStartTime + transitionDuration;\r\n\r\n          // 确保计算正确\r\n          if (transitionActualStartTime >= transitionActualEndTime) {\r\n            console.warn(`转场 ${transition.name} 时间计算错误: startTime=${transitionActualStartTime}, endTime=${transitionActualEndTime}, transitionStartTime=${transitionStartTime}, duration=${transitionDuration}`);\r\n          }\r\n\r\n          const transitionObj = {\r\n            name: transition.name,\r\n            duration: transitionDuration,\r\n            startTime: transitionActualStartTime, // 转场开始时间\r\n            endTime: transitionActualEndTime, // 转场结束时间（目标场景开始时间）\r\n            easing: transition.easing,\r\n            params: transition.params,\r\n            fromScene: fromScene,\r\n            toScene: toScene,\r\n          };\r\n\r\n          allTransitions.push(transitionObj);\r\n        } else {\r\n          console.warn(`转场 ${transition.name} 无法找到对应的场景，startTime: ${transitionStartTime}, fromScene: ${fromScene}, toScene: ${toScene}`);\r\n        }\r\n      }\r\n\r\n      // Track.build() 现在直接创建 Layer 并添加元素到 VideoMaker\r\n      track.build(mainComposition);\r\n    }\r\n\r\n    // 将转场信息保存到composition\r\n    mainComposition.transitions = allTransitions;\r\n\r\n    return mainComposition;\r\n  }\r\n\r\n  /**\r\n   * 导出视频\r\n   * @param {string} outputPath - 输出路径\r\n   * @param {Object} options - 导出选项\r\n   * @returns {Promise<void>}\r\n   */\r\n  async export(outputPath, options = {}) {\r\n    // 先初始化，预加载所有需要异步加载的元素（如 SVG）\r\n    await this.initialize();\r\n    \r\n    const composition = this.build();\r\n    try {\r\n      await composition.export(outputPath, options);\r\n    } finally {\r\n      composition.destroy();\r\n      // 导出完成后自动销毁 builder\r\n      this.destroy();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 渲染视频（自动 build 和 export）\r\n   * @param {string} outputPath - 输出路径（可选，默认：'output/fkbuilder-video.mp4'）\r\n   * @param {Object} options - 导出选项\r\n   * @returns {Promise<string>} 输出路径\r\n   */\r\n  async render(outputPath, options = {}) {\r\n    // 如果没有提供 outputPath，使用默认路径\r\n    if (!outputPath) {\r\n      const defaultOutputDir = path.join(process.cwd(), 'output');\r\n      await fs.ensureDir(defaultOutputDir);\r\n      outputPath = path.join(defaultOutputDir, 'fkbuilder-video.mp4');\r\n    }\r\n\r\n    const composition = this.build();\r\n    try {\r\n      const result = await composition.export(outputPath, options);\r\n      return result || outputPath;\r\n    } finally {\r\n      composition.destroy();\r\n      // 渲染完成后自动销毁 builder\r\n      this.destroy();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 渲染一帧\r\n   * @param {number} time - 时间（秒）\r\n   * @returns {Promise<Canvas>}\r\n   */\r\n  async renderFrame(time) {\r\n    const composition = this.build();\r\n    const canvas = await composition.renderFrame(time);\r\n    composition.destroy();\r\n    return canvas;\r\n  }\r\n\r\n  /**\r\n   * 销毁构建器\r\n   */\r\n  destroy() {\r\n    for (const track of this.tracks) {\r\n      track.destroy();\r\n    }\r\n    this.tracks = [];\r\n  }\r\n}\r\n\r\n"],"names":["Track","VideoMaker"],"mappings":"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"}