{"version":3,"file":"VideoElement.cjs","sources":["../../../src/elements/VideoElement.js"],"sourcesContent":["import { BaseElement } from './BaseElement.js';\nimport { DEFAULT_IMAGE_CONFIG } from '../types/constants.js';\nimport { deepMerge } from '../utils/helpers.js';\nimport { ElementType } from '../types/enums.js';\nimport { Image, loadImage, createCanvas } from '@napi-rs/canvas';\nimport { toPixels } from '../utils/unit-converter.js';\nimport execa from 'execa';\nimport { rawVideoToFrames, calculateVideoScale, getInputCodec, buildVideoFFmpegArgs, readFileStreams, createAudioStream } from '../utils/video-utils.js';\nimport paper from '@chnak/paper';\nimport { calculateImageFit } from '../utils/image-fit.js';\nimport path from 'path';\nimport os from 'os';\nimport {getVideoDuration} from '../utils/video-utils.js';\n\n/**\n * 视频元素\n */\nexport class VideoElement extends BaseElement {\n  constructor(config = {}) {\n    super(config);\n    this.type = ElementType.VIDEO;\n    // 重新合并配置，确保传入的config优先级最高\n    this.config = deepMerge({}, DEFAULT_IMAGE_CONFIG, config);\n    \n    this.videoPath = config.src  || config.videoPath || null;\n    this.fit = config.fit || 'cover'; // cover, contain, fill, none\n    this.cutFrom = config.cutFrom||0; // 开始时间（秒）\n    this.cutTo = config.cutTo||this.config.duration; // 结束时间（秒）\n    this.speedFactor = config.speedFactor || config.speed || 1; // 播放速度倍数\n    this.loop = config.loop || false; // 是否循环播放\n    this.mute = config.mute !== undefined ? config.mute : true; // 默认静音\n    this.volume = config.volume !== undefined ? config.volume : 1.0; // 音量\n    // 响度归一化统一在 mergeAudios 中处理，避免双重压缩导致音频\"闷/慢\"\n    \n    // 视频处理相关\n    this.videoProcessor = null;\n    this.frameIterator = null;\n    this.frameBuffer = new Map(); // Map<frameIndex, Buffer> 有界缓冲，防止 OOM\n    this.maxFrameBufferSize = config.maxFrameBufferSize || 600; // 默认600帧（20秒），1080p约4.8GB\n    this.totalBufferedFrames = 0; // 已提取的总帧数（含已被淘汰的）\n    this.currentFrameIndex = 0;\n    this.videoInfo = null;\n    this.initialized = false;\n    \n    // 帧缓存（用于多进程渲染优化）\n    this.frameImageCache = new Map(); // Map<progress, Image>\n    this.frameImageCacheSize = 10; // 最多缓存10帧\n    this.preloadNextFrame = null; // 预加载的下一帧 Promise\n    \n    // 与 ImageElement 一致的属性\n    this.imageData = null; // 当前帧的 Image/Canvas 对象\n    this.loaded = false; // 是否已加载（对于视频，表示是否已初始化）\n    \n    // 音频相关\n    this.audioStream = null;\n    this.audioPath = null; // 提取的音频文件路径\n  }\n\n  async ready() {\n    await super.ready();\n\n    if (this.videoPath) {\n      try {\n        const { effectiveDuration } = await getVideoDuration(this.videoPath, {\n          cutFrom: this.config.cutFrom,\n          cutTo: this.config.cutTo,\n        });\n        if (effectiveDuration > 0 && this.config.duration > effectiveDuration) {\n          this.config.loop = true;\n        }\n      } catch (err) {\n        console.warn(`[VideoElement] getVideoDuration failed: ${err.message}`);\n      }\n    }\n\n    return true;\n  }\n\n  /**\n   * 设置视频的起始播放时间（用于分块渲染时 seek 到指定位置）\n   * @param {number} seekTime - 起始时间（秒）\n   */\n  setSeekTime(seekTime) {\n    this.cutFrom = seekTime;\n    // 清除 cutTo，因为它相对于视频开头，重新设置 cutFrom 后需要重新计算\n    this.cutTo = undefined;\n    // 清除 actualCutTo 和 actualCutFrom，确保下次 ready() 时重新计算\n    this.actualCutTo = undefined;\n    this.actualCutFrom = undefined;\n  }\n  /**\n   * 设置视频适配方式（与 ImageElement 一致）\n   */\n  setFit(fit) {\n    this.config.fit = fit; // cover, contain, fill, none\n    this.fit = fit;\n  }\n\n  /**\n   * 初始化方法 - 使用 FFmpeg 提取视频帧\n   */\n  async initialize() {\n    await super.initialize();\n    if (this.initialized || !this.videoPath) {\n      return;\n    }\n    \n    // 防止并发初始化（使用 Promise 缓存）\n    if (this._initializingPromise) {\n      console.log(`[VideoElement] 等待正在进行的初始化... (${this.videoPath})`);\n      await this._initializingPromise;\n      return;\n    }\n    \n    // 检测是否在 Worker 线程中\n    const isWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;\n    const threadInfo = isWorker ? '[Worker]' : '[Main]';\n    console.log(`${threadInfo} [VideoElement] 开始初始化: ${this.videoPath}`);\n    \n    // 创建初始化 Promise\n    this._initializingPromise = (async () => {\n      try {\n        // 获取视频流信息\n      const streams = await readFileStreams(this.videoPath);\n      const videoStream = streams.find(s => s.codec_type === 'video');\n      \n      if (!videoStream) {\n        throw new Error(`无法找到视频流: ${this.videoPath}`);\n      }\n\n      // 解析帧率\n      // 优先使用 avg_frame_rate（平均帧率，更准确），如果没有则使用 r_frame_rate（编码帧率）\n      let fps = 30;\n      if (videoStream.avg_frame_rate) {\n        const [num, den] = videoStream.avg_frame_rate.split('/').map(Number);\n        if (den && den > 0) {\n          fps = num / den;\n        }\n      } else if (videoStream.r_frame_rate) {\n        const [num, den] = videoStream.r_frame_rate.split('/').map(Number);\n        if (den && den > 0) {\n          fps = num / den;\n        }\n      }\n\n      this.videoInfo = {\n        width: videoStream.width,\n        height: videoStream.height,\n        duration: parseFloat(videoStream.duration) || 0,\n        fps: fps,\n      };\n      \n\n      // 计算目标尺寸\n      const viewSize = paper.view && paper.view.viewSize ? paper.view.viewSize : { width: 1920, height: 1080 };\n      const context = { \n        width: this.canvasWidth || viewSize.width, \n        height: this.canvasHeight || viewSize.height \n      };\n\n      // 使用 BaseElement 的通用方法转换尺寸\n      let { width: targetWidth, height: targetHeight } = this.convertSize(\n        this.config.width,\n        this.config.height,\n        context\n      );\n\n      if (!targetWidth) targetWidth = context.width;\n      if (!targetHeight) targetHeight = context.height;\n\n      // 计算缩放参数\n      const scaleParams = calculateVideoScale({\n        inputWidth: this.videoInfo.width,\n        inputHeight: this.videoInfo.height,\n        requestedWidth: targetWidth,\n        requestedHeight: targetHeight,\n        resizeMode: this.fit\n      });\n\n      const { targetWidth: finalWidth, targetHeight: finalHeight, scaleFilter } = scaleParams;\n      const roundedWidth = Math.round(finalWidth);\n      const roundedHeight = Math.round(finalHeight);\n      this.finalWidth = roundedWidth;\n      this.finalHeight = roundedHeight;\n\n      // 获取输入编解码器\n      const inputCodec = getInputCodec(videoStream.codec_name);\n\n      // 计算实际需要提取的视频时长\n      // 如果元素有 duration，只提取 duration 对应的帧数\n      // 否则使用 cutTo - cutFrom（如果指定了）\n      let actualCutFrom = this.cutFrom || 0;\n      let actualCutTo = this.cutTo;\n      \n      if (this.duration && this.duration > 0) {\n        // 元素有 duration，只提取 duration 对应的时长\n        actualCutTo = actualCutFrom + this.duration;\n        \n        // 如果原始 cutTo 存在且更短，使用原始 cutTo\n        if (this.cutTo !== undefined && this.cutTo < actualCutTo) {\n          actualCutTo = this.cutTo;\n        }\n        \n        // 确保不超过视频总时长\n        if (this.videoInfo.duration > 0 && actualCutTo > this.videoInfo.duration) {\n          actualCutTo = this.videoInfo.duration;\n        }\n      }\n      \n      // 保存实际使用的 cutFrom 和 cutTo（用于音频提取等）\n      this.actualCutFrom = actualCutFrom;\n      this.actualCutTo = actualCutTo;\n\n      // 使用视频的实际 FPS，而不是固定的 30\n      // 这样可以确保提取的帧数正确\n      const targetFps = this.fps || this.videoInfo.fps || 30;\n      \n      // 计算提取参数\n      const extractDuration = actualCutTo - actualCutFrom;\n      const expectedFrames = Math.ceil(extractDuration * targetFps);\n      this.expectedFrames = expectedFrames;\n      \n      // 创建初始化 Promise\n      const initializingPromise = (async () => {\n        try {\n          // 构建 FFmpeg 参数\n          const args = buildVideoFFmpegArgs({\n          inputPath: this.videoPath,\n          inputCodec,\n          cutFrom: actualCutFrom,\n          cutTo: actualCutTo,\n          speedFactor: this.speedFactor,\n          framerate: targetFps,\n          scaleFilter,\n          mute: this.mute,\n          volume: 1\n        });\n\n        // 创建转换流\n        const controller = new AbortController();\n        const transform = rawVideoToFrames({\n          width: roundedWidth,\n          height: roundedHeight,\n          channels: 4, // RGBA\n          signal: controller.signal\n        });\n\n        // 检测是否在 Worker 线程中\n        // Worker 线程中的 process.stderr 是 WritableWorkerStdio，不能直接传递给 execa\n        // 使用多种方法检测 Worker 线程\n        let isWorkerThread = false;\n        try {\n          // 方法1: 检查 WorkerGlobalScope\n          if (typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope) {\n            isWorkerThread = true;\n          }\n          // 方法2: 检查 process.stderr 的类型\n          else if (process.stderr && typeof process.stderr === 'object') {\n            // Worker 线程中的 process.stderr 是 WritableWorkerStdio\n            const stderrType = process.stderr.constructor?.name || '';\n            if (stderrType === 'WritableWorkerStdio' || (process.stderr._writableState && !process.stderr.isTTY)) {\n              isWorkerThread = true;\n            }\n          }\n        } catch (e) {\n          // 如果检测失败，默认不在 Worker 线程中\n          isWorkerThread = false;\n        }\n        \n        const stderrOption = isWorkerThread ? 'pipe' : (process.stderr || 'pipe');\n        \n        // 启动 FFmpeg 进程\n        const ps = execa('ffmpeg', args, {\n          encoding: 'buffer',\n          buffer: false,\n          stdin: 'ignore',\n          stdout: 'pipe', // 使用 pipe，然后手动连接\n          stderr: stderrOption, // Worker 线程中使用 'pipe'，主线程使用 process.stderr\n          cancelSignal: controller.signal\n        });\n\n        // 处理流的错误\n        // 注意：在缓冲帧的过程中，transform 流可能会因为 FFmpeg 进程结束而触发错误\n        // 这是正常的，只要已经缓冲了帧就可以继续\n        let transformError = null;\n        transform.on('error', (err) => {\n          // 记录错误，但不立即中止（因为可能已经缓冲了足够的帧）\n          transformError = err;\n          console.warn('[VideoElement] Transform stream error (可能不影响缓冲):', err.message);\n          // 只有在进程未结束时才中止\n          if (!ps.killed && ps.exitCode === null) {\n            controller.abort();\n          }\n        });\n\n        // 在 Worker 线程中，stderr 使用 pipe，需要手动处理\n        if (isWorkerThread && ps.stderr) {\n          ps.stderr.on('data', (data) => {\n            // Worker 线程中可以选择忽略 stderr 或记录到日志\n            // 这里选择忽略，避免输出过多信息\n          });\n          ps.stderr.on('error', (err) => {\n            // 忽略 stderr 错误\n          });\n        }\n\n        // 等待 stdout 可用（CommonJS 环境中可能需要等待）\n        if (!ps.stdout) {\n          let waited = 0;\n          const maxWait = 200; // 增加到 200ms，给更多时间\n          while (!ps.stdout && waited < maxWait) {\n            await new Promise(resolve => setTimeout(resolve, 10));\n            waited += 10;\n            // 重新检查 ps.stdout（可能在等待过程中变为可用）\n            if (ps.stdout) break;\n          }\n        }\n\n        // 检查 stdout 是否可用\n        if (!ps.stdout) {\n          // 如果 stdout 不可用，尝试等待进程启动\n          // 在某些情况下，execa 可能需要更多时间\n          console.warn('[VideoElement] FFmpeg stdout 初始不可用，等待进程启动...');\n          await new Promise(resolve => setTimeout(resolve, 50));\n          \n          // 再次检查\n          if (!ps.stdout) {\n            console.error('[VideoElement] FFmpeg stdout is not available after waiting');\n            throw new Error('FFmpeg stdout is not available');\n          }\n        }\n\n        // 保存 stdout 引用，避免后续访问时它可能被关闭\n        const stdout = ps.stdout;\n        \n        stdout.on('error', (err) => {\n          // stdout 错误通常表示 FFmpeg 进程已经结束或出现问题\n          // 但如果已经缓冲了帧，这可能不是致命错误\n          console.warn('[VideoElement] FFmpeg stdout error (可能不影响缓冲):', err.message);\n          // 不立即 destroy transform，让缓冲过程自然结束\n          // transform.destroy(err); // 注释掉，避免触发 transform 错误事件\n        });\n\n        // 将 FFmpeg 的 stdout 管道连接到 transform\n        // 设置 highWaterMark 以避免缓冲区溢出\n        stdout.pipe(transform, { end: false });\n\n        // 处理进程错误\n        ps.catch((err) => {\n          // FFmpeg 进程错误\n          // 如果进程被取消（exitCode 143）或正常结束，这是正常的\n          if (!err.isCanceled && err.exitCode !== 143) {\n            console.warn('[VideoElement] FFmpeg process error (可能不影响缓冲):', err.message);\n          }\n          // 不立即 destroy，让缓冲过程自然结束\n          // transform.destroy(); // 注释掉，避免在缓冲过程中中断\n        });\n\n        // 当进程正常结束时，结束 transform 流\n        ps.then(() => {\n          // 进程正常结束，结束 transform 流\n          transform.end();\n        }).catch(() => {\n          // 进程异常结束，但不立即 destroy（可能正在缓冲）\n        });\n\n        // 转换为迭代器 - 使用 transform 流的迭代器\n        this.frameIterator = transform[Symbol.asyncIterator]();\n        this.controller = controller;\n        this.ps = ps;\n        this.finalWidth = roundedWidth;\n        this.finalHeight = roundedHeight;\n\n        // 缓冲所有帧（用于随机访问）\n        let frameCount = 0;\n        let bufferError = null;\n        const frameSize = roundedWidth * roundedHeight * 4; // RGBA\n        \n        try {\n          while (true) {\n            try {\n              const { value, done } = await this.frameIterator.next();\n              if (done) {\n                break;\n              }\n              if (value) {\n                this.frameBuffer.set(frameCount, Buffer.from(value));\n                frameCount++;\n                // FIFO 淘汰：超过上限时移除最旧帧\n                while (this.frameBuffer.size > this.maxFrameBufferSize) {\n                  const oldestKey = Math.min(...this.frameBuffer.keys());\n                  this.frameBuffer.delete(oldestKey);\n                }\n              }\n            } catch (iterError) {\n              if (frameCount === 0) {\n                bufferError = iterError;\n              }\n              break;\n            }\n          }\n        } catch (error) {\n          if (frameCount === 0) {\n            bufferError = error;\n          }\n        }\n        \n        // 只有在没有缓冲到任何帧时才抛出错误\n        if (frameCount === 0) {\n          const errorMsg = bufferError \n            ? `无法缓冲视频帧: ${bufferError.message}` \n            : (transformError \n              ? `无法缓冲视频帧: Transform stream error - ${transformError.message}` \n              : '无法缓冲视频帧: 未知错误');\n          throw new Error(errorMsg);\n        }\n        \n        // 保存总帧数（用于进度计算），即使部分帧已被淘汰\n        this.totalBufferedFrames = frameCount;\n\n        // 如果不禁音，提取视频中的音频\n        if (!this.mute) {\n          try {\n            const outputDir = path.join(os.tmpdir(), 'fknew-video-audio');\n            await import('fs-extra').then(fs => fs.ensureDir(outputDir));\n            \n            this.audioStream = await createAudioStream({\n              source: this.videoPath,\n              cutFrom: this.actualCutFrom,\n              cutTo: this.actualCutTo,\n              speedFactor: this.speedFactor,\n              volume: this.volume,\n              outputDir: outputDir,\n            });\n            \n            if (this.audioStream && this.audioStream.path) {\n              this.audioPath = this.audioStream.path;\n              console.log(`[VideoElement] 视频音频已提取: ${this.audioPath}`);\n            } else {\n              console.log(`[VideoElement] 视频 ${this.videoPath} 没有音频轨道或音频提取失败`);\n            }\n          } catch (error) {\n            console.warn(`[VideoElement] 提取视频音频失败: ${error.message}`);\n          }\n        }\n\n        this.initialized = true;\n        \n        const isWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;\n        const threadInfo = isWorker ? '[Worker]' : '[Main]';\n        console.log(`${threadInfo} [VideoElement] 初始化完成: ${this.videoPath}, 缓冲了 ${this.frameBuffer.size} 帧 (最大 ${this.maxFrameBufferSize})`);\n        \n        // 调用 onLoaded 回调（注意：此时还没有 paperItem，所以传递 null）\n        this._callOnLoaded(this.startTime || 0, null, null);\n      } catch (error) {\n        const isWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;\n        const threadInfo = isWorker ? '[Worker]' : '[Main]';\n        console.error(`${threadInfo} [VideoElement] 初始化失败: ${this.videoPath}`, error);\n        this.initialized = false;\n        throw error;\n      }\n    })();\n    \n    await initializingPromise;\n      } catch (error) {\n        const isWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;\n        const threadInfo = isWorker ? '[Worker]' : '[Main]';\n        console.error(`${threadInfo} [VideoElement] 外层初始化失败: ${this.videoPath}`, error);\n        this.initialized = false;\n        throw error;\n      } finally {\n        // 清除初始化 Promise，允许后续重新初始化\n        this._initializingPromise = null;\n      }\n    })();\n    \n    await this._initializingPromise;\n  }\n\n  /**\n   * 获取当前帧的 Canvas 对象\n   * @param {number} progress - 进度 (0-1)，基于元素的 duration\n   * @returns {Promise<Canvas|null>} 当前帧的 Canvas 对象\n   */\n  async getFrameAtProgress(progress) {\n    if (!this.initialized) {\n      await this.initialize();\n    }\n\n    if (!this.initialized) {\n      return null;\n    }\n\n    try {\n      // 检查缓存\n      const cacheKey = Math.floor(progress * 1000) / 1000; // 保留3位小数作为缓存键\n      if (this.frameImageCache.has(cacheKey)) {\n        return this.frameImageCache.get(cacheKey);\n      }\n\n      let rgba = null;\n      let frameIndex = 0;\n\n      if (this.frameBuffer.size > 0 && this.videoInfo) {\n        // frameBuffer 现在只包含元素 duration 对应的帧\n        const elementDuration = this.duration || 0;\n        const videoFps = this.videoInfo.fps || 30;\n\n        // 计算帧索引\n        if (elementDuration > 0) {\n          const videoTime = progress * elementDuration;\n          frameIndex = Math.floor(videoTime * videoFps);\n        } else {\n          frameIndex = Math.floor(progress * this.totalBufferedFrames);\n        }\n\n        // 处理循环播放\n        if (this.loop && this.totalBufferedFrames > 0) {\n          // 循环模式：使用取模运算，允许超出范围的索引循环回开头\n          frameIndex = ((frameIndex % this.totalBufferedFrames) + this.totalBufferedFrames) % this.totalBufferedFrames;\n        } else {\n          // 非循环模式：限制帧索引在有效范围内\n          frameIndex = Math.max(0, Math.min(frameIndex, this.totalBufferedFrames - 1));\n        }\n\n        // 获取帧（从 Map 中），如果无效则尝试使用相邻帧\n        rgba = this.frameBuffer.get(frameIndex);\n\n        // 如果当前帧无效，尝试使用相邻帧\n        if (!rgba || !Buffer.isBuffer(rgba) || rgba.length === 0) {\n          // 尝试使用前一帧\n          if (frameIndex > 0) {\n            rgba = this.frameBuffer.get(frameIndex - 1);\n          }\n          // 如果前一帧也无效，尝试使用后一帧\n          if ((!rgba || !Buffer.isBuffer(rgba) || rgba.length === 0) && frameIndex < this.totalBufferedFrames - 1) {\n            rgba = this.frameBuffer.get(frameIndex + 1);\n          }\n          // 如果都无效，使用第一帧\n          if ((!rgba || !Buffer.isBuffer(rgba) || rgba.length === 0) && this.frameBuffer.size > 0) {\n            const firstKey = Math.min(...this.frameBuffer.keys());\n            rgba = this.frameBuffer.get(firstKey);\n          }\n        }\n      } else if (this.frameIterator) {\n        // 如果没有缓冲，尝试从迭代器获取\n        try {\n          const { value, done } = await this.frameIterator.next();\n          if (!done && value) {\n            rgba = Buffer.from(value);\n          }\n        } catch (err) {\n          // 忽略迭代器错误\n        }\n      }\n\n      // 如果仍然无法获取有效帧，返回 null（避免黑屏，render 方法会跳过渲染）\n      if (!rgba || !Buffer.isBuffer(rgba) || rgba.length === 0) {\n        return null;\n      }\n\n      // 从 RGBA Buffer 创建 Canvas 对象（与 ImageElement 一致，直接使用 Canvas）\n      // 添加重试逻辑，Skia surface 失败时清除缓存重试\n      let frameCanvas = null;\n      let retryCount = 0;\n      const maxRetries = 2;\n\n      while (retryCount < maxRetries) {\n        try {\n          frameCanvas = createCanvas(this.finalWidth, this.finalHeight);\n          const ctx = frameCanvas.getContext('2d');\n          const imageData = ctx.createImageData(this.finalWidth, this.finalHeight);\n          // Node.js Buffer 转换为 Uint8Array 以兼容 Uint8ClampedArray.set()\n          const uint8Data = new Uint8Array(rgba.buffer, rgba.byteOffset, rgba.byteLength);\n          imageData.data.set(uint8Data);\n          ctx.putImageData(imageData, 0, 0);\n          break; // 成功则退出循环\n        } catch (canvasError) {\n          retryCount++;\n          console.warn(`[VideoElement] Skia surface 创建失败 (尝试 ${retryCount}/${maxRetries}): ${canvasError.message}`);\n          // 清除所有缓存后重试\n          this.frameImageCache.clear();\n          if (retryCount >= maxRetries) {\n            throw canvasError;\n          }\n        }\n      }\n\n      // 缓存 Canvas 对象\n      if (this.frameImageCache.size >= this.frameImageCacheSize) {\n        // 删除最旧的缓存（FIFO）\n        const firstKey = this.frameImageCache.keys().next().value;\n        this.frameImageCache.delete(firstKey);\n      }\n      this.frameImageCache.set(cacheKey, frameCanvas);\n\n      return frameCanvas;\n    } catch (error) {\n      console.error('Failed to get video frame:', error);\n      return null;\n    }\n  }\n  \n  /**\n   * 清理帧缓存\n   */\n  clearFrameCache() {\n    this.frameImageCache.clear();\n    this.preloadNextFrame = null;\n  }\n\n  /**\n   * 应用视觉效果（滤镜、边框、阴影等）\n   * @param {paper.Raster} raster - Paper.js Raster 对象\n   * @param {Object} state - 元素状态\n   * @param {number} width - 元素宽度\n   * @param {number} height - 元素高度\n   * @param {Object} paperInstance - Paper.js 实例 { project, paper }\n   * @returns {paper.Group|paper.Raster} 应用效果后的对象\n   */\n  applyVisualEffects(raster, state, width, height, paperInstance = null) {\n    // 获取 Paper.js 实例\n    const { paper: p } = this.getPaperInstance(paperInstance);\n    // 检查是否有视觉效果（与 ImageElement 一致）\n    const hasBorder = state.borderWidth > 0;\n    const hasShadow = state.shadowBlur > 0;\n    const hasFlip = state.flipX || state.flipY;\n    const hasBlendMode = state.blendMode && state.blendMode !== 'normal';\n    const hasFilter = state.filter || \n      (state.brightness !== 1 || state.contrast !== 1 || state.saturation !== 1 || \n       state.hue !== 0 || state.grayscale > 0);\n    const hasGlassEffect = state.glassEffect;\n\n    if (!hasBorder && !hasShadow && !hasFlip && !hasBlendMode && !hasFilter && !hasGlassEffect) {\n      return raster;\n    }\n\n    // 创建组来包含所有效果\n    const group = new p.Group();\n    \n    // 应用翻转\n    if (hasFlip) {\n      if (state.flipX) {\n        raster.scale(-1, 1, raster.position);\n      }\n      if (state.flipY) {\n        raster.scale(1, -1, raster.position);\n      }\n    }\n\n    // 应用混合模式\n    if (hasBlendMode) {\n      raster.blendMode = state.blendMode;\n    }\n\n    // 应用阴影（通过创建阴影层）\n    if (hasShadow) {\n      const shadowRaster = raster.clone();\n      shadowRaster.position = new p.Point(\n        raster.position.x + (state.shadowOffsetX || 0),\n        raster.position.y + (state.shadowOffsetY || 0)\n      );\n      shadowRaster.opacity = 0.3; // 阴影透明度\n      \n      // 应用阴影颜色（通过 tint）\n      if (state.shadowColor) {\n        const shadowColor = new p.Color(state.shadowColor);\n        shadowRaster.tint = shadowColor;\n      }\n      \n      // 应用模糊（通过降低分辨率模拟）\n      if (state.shadowBlur > 0) {\n        const blurFactor = Math.max(1, state.shadowBlur / 10);\n        shadowRaster.size = new p.Size(\n          shadowRaster.size.width * (1 + blurFactor * 0.1),\n          shadowRaster.size.height * (1 + blurFactor * 0.1)\n        );\n      }\n      \n      group.addChild(shadowRaster);\n    }\n\n    // 添加主视频帧\n    group.addChild(raster);\n\n    // 应用边框（通过绘制边框路径）\n    if (hasBorder) {\n      const borderPath = new p.Path.Rectangle({\n        rectangle: new p.Rectangle(\n          raster.position.x - width / 2,\n          raster.position.y - height / 2,\n          width,\n          height\n        ),\n        radius: state.borderRadius || 0,\n      });\n      borderPath.strokeColor = new p.Color(state.borderColor || '#000000');\n      borderPath.strokeWidth = state.borderWidth;\n      borderPath.fillColor = null;\n      group.addChild(borderPath);\n    }\n\n    // 毛玻璃效果：添加边框（如果启用）\n    if (hasGlassEffect && state.glassBorder) {\n      const glassBorderPath = new p.Path.Rectangle({\n        rectangle: new p.Rectangle(\n          raster.position.x - width / 2,\n          raster.position.y - height / 2,\n          width,\n          height\n        ),\n        radius: state.borderRadius || 0,\n      });\n      glassBorderPath.strokeColor = new p.Color(state.glassBorderColor || '#ffffff');\n      glassBorderPath.strokeWidth = state.glassBorderWidth || 1;\n      glassBorderPath.fillColor = null;\n      glassBorderPath.opacity = 0.5; // 半透明边框\n      group.addChild(glassBorderPath);\n    }\n\n    return group.children.length > 1 ? group : raster;\n  }\n\n  async render(layer, time, paperInstance = null) {\n    if (!this.visible) return null;\n    if (!this.isActiveAtTime(time)) return null;\n    \n    // 确保视频已初始化（与 ImageElement 的 loaded 检查一致）\n    if (!this.initialized) {\n      try {\n        await Promise.race([\n          this.initialize(),\n          new Promise((_, reject) => setTimeout(() => reject(new Error('Video initialization timeout (5s)')), 5000))\n        ]);\n      } catch (error) {\n        console.error(`[VideoElement] 初始化失败 (id: ${this.id}):`, error.message);\n        return null;\n      }\n    }\n    \n    if (!this.initialized) {\n      console.warn(`[VideoElement] 视频未初始化 (id: ${this.id})`);\n      return null;\n    }\n    \n    const { paper: p, project } = this.getPaperInstance(paperInstance);\n    const viewSize = project?.view?.viewSize || { width: 1920, height: 1080 };\n    const context = { width: viewSize.width, height: viewSize.height };\n    const state = this.getStateAtTime(time, context);\n    \n    // 计算进度\n    const progress = this.getProgressAtTime(time);\n    \n    // 获取当前帧并赋值给 this.imageData（与 ImageElement 一致）\n    let imageData = null;\n    try {\n      imageData = await this.getFrameAtProgress(progress);\n    } catch (frameError) {\n      console.warn(`[VideoElement] 获取视频帧异常 (id: ${this.id}): ${frameError.message}`);\n      return null;\n    }\n    if (!imageData) {\n      console.warn(`[VideoElement] 无法获取视频帧 (id: ${this.id})`);\n      return null;\n    }\n    \n    // 计算容器尺寸（元素的目标尺寸，与 ImageElement 一致）\n    const containerSize = this.convertSize(state.width, state.height, context);\n    const containerWidth = containerSize.width || viewSize.width;\n    const containerHeight = containerSize.height || viewSize.height;\n    \n    // 获取视频帧原始尺寸\n    const imageWidth = imageData.width || this.finalWidth || containerWidth;\n    const imageHeight = imageData.height || this.finalHeight || containerHeight;\n    \n    // 根据 fit 参数计算实际显示尺寸（与 ImageElement 一致）\n    const fit = state.fit || this.config.fit || this.fit || 'cover';\n    const fitResult = calculateImageFit({\n      imageWidth,\n      imageHeight,\n      containerWidth,\n      containerHeight,\n      fit\n    });\n    \n    // 使用适配后的尺寸\n    const width = fitResult.width;\n    const height = fitResult.height;\n    const { x, y } = this.calculatePosition(state, context, { width, height });\n    \n    // 直接使用 Image/Canvas 对象创建 Raster（与 ImageElement 完全一致）\n    const raster = new p.Raster(imageData);\n    raster.position = new p.Point(x, y);\n    \n    // 使用 scale 来设置尺寸，而不是直接设置 size（与 ImageElement 一致）\n    const sourceWidth = imageData.width || width;\n    const sourceHeight = imageData.height || height;\n    \n    if (sourceWidth > 0 && sourceHeight > 0) {\n      const scaleX = width / sourceWidth;\n      const scaleY = height / sourceHeight;\n      raster.scale(scaleX, scaleY, raster.position);\n    } else {\n      // 如果无法获取原始尺寸，直接设置 size\n      raster.size = new p.Size(width, height);\n    }\n    \n    // 应用变换\n    this.applyTransform(raster, state, {\n      applyPosition: false,\n      paperInstance: p\n    });\n    \n    // 应用视觉效果\n    const finalItem = this.applyVisualEffects(raster, state, width, height, p);\n    \n    // 添加到图层\n    if (layer) {\n      layer.addChild(finalItem);\n    }\n    \n    return finalItem;\n  }\n\n  /**\n   * 获取音频元素（如果视频不禁音）\n   * @returns {Promise<Array>} 音频元素数组\n   */\n  async getAudioElements() {\n    if (this.mute || !this.audioPath) {\n      return [];\n    }\n    \n    // 如果还没有初始化，先初始化\n    if (!this.initialized) {\n      await this.initialize();\n    }\n    \n    // 如果初始化后仍然没有音频路径，说明视频没有音频或提取失败\n    if (!this.audioPath) {\n      return [];\n    }\n    \n    // 创建一个临时的音频元素来代表视频的音频\n    const { AudioElement } = await import('./AudioElement.js');\n    const audioElement = new AudioElement({\n      type: 'audio',\n      src: this.audioPath,\n      startTime: this.startTime || 0,\n      duration: this.duration || 0,\n      volume: this.volume,\n      canvasWidth: this.canvasWidth,\n      canvasHeight: this.canvasHeight\n    });\n    \n    return [audioElement];\n  }\n\n  /**\n   * 获取音频配置（用于音频合并）\n   * @returns {Object|null} 音频配置对象\n   */\n  getAudioConfig() {\n    if (this.mute || !this.audioPath) {\n      return null;\n    }\n    \n    return {\n      path: this.audioPath,\n      startTime: this.startTime || 0,\n      duration: this.duration || 0,\n      volume: this.volume,\n      fadeIn: 0,\n      fadeOut: 0,\n      loop: false,\n    };\n  }\n\n  /**\n   * 销毁元素，释放资源\n   */\n  destroy() {\n    // 先关闭视频，kill FFmpeg 进程\n    this.close();\n    // 清理帧缓存\n    this.clearFrameCache?.();\n    this.frameBuffer.clear();\n    this.totalBufferedFrames = 0;\n    this.frameIterator = null;\n    this.preloadNextFrame = null;\n    this.videoInfo = null;\n    this.audioStream = null;\n    this.audioPath = null;\n    this.initialized = false;\n    this._initializingPromise = null;\n    super.destroy();\n  }\n\n  /**\n   * 关闭视频元素，清理资源\n   */\n  async close() {\n    // 终止 FFmpeg 进程\n    if (this.ps) {\n      try {\n        this.ps.kill?.('SIGTERM');\n      } catch (_) {}\n      this.ps = null;\n    }\n\n    if (this.controller) {\n      this.controller.abort();\n      this.controller = null;\n    }\n\n    // 关闭音频流\n    if (this.audioStream && typeof this.audioStream.close === 'function') {\n      try {\n        await this.audioStream.close();\n      } catch (_) {}\n    }\n\n    this.frameBuffer.clear();\n    this.totalBufferedFrames = 0;\n    this.frameIterator = null;\n    this.audioStream = null;\n    this.audioPath = null;\n    this.initialized = false;\n  }\n}"],"names":["BaseElement","ElementType","deepMerge","DEFAULT_IMAGE_CONFIG","getVideoDuration","readFileStreams","calculateVideoScale","getInputCodec","buildVideoFFmpegArgs","rawVideoToFrames","createAudioStream","createCanvas","calculateImageFit"],"mappings":"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"}