{"version":3,"file":"AudioElement.cjs","sources":["../../../src/elements/AudioElement.js"],"sourcesContent":["import { BaseElement } from './BaseElement.js';\r\nimport { ElementType } from '../types/enums.js';\r\nimport fs from 'fs-extra';\r\n\r\n/**\r\n * 音频元素\r\n */\r\nexport class AudioElement extends BaseElement {\r\n  constructor(config = {}) {\r\n    super(config);\r\n    this.type = ElementType.AUDIO;\r\n    \r\n    // 音频文件路径\r\n    this.src = config.src || '';\r\n    this.audioPath = config.audioPath || config.src || '';\r\n    \r\n    // 音频裁剪时间（从原始音频文件中裁剪的开始和结束时间）\r\n    this.audioStartTime = config.cutFrom !== undefined ? config.cutFrom : 0; // 从音频文件的哪个时间点开始裁剪（秒）\r\n    this.audioEndTime = config.cutTo !== undefined ? config.cutTo : undefined; // 裁剪到音频文件的哪个时间点（秒，undefined 表示裁剪到文件末尾）\r\n    \r\n    // 音频配置\r\n    this.volume = config.volume !== undefined ? config.volume : 1.0; // 音量 (0.0 - 1.0)\r\n    this.fadeIn = config.fadeIn || 0; // 淡入时长（秒）\r\n    this.fadeOut = config.fadeOut || 0; // 淡出时长（秒）\r\n    this.loop = config.loop || false; // 是否循环\r\n    \r\n    // 音频信息（在加载后填充）\r\n    this.audioInfo = null;\r\n    this.loaded = false;\r\n  }\r\n\r\n  async initialize() {\r\n    await super.initialize();\r\n    await this.load();\r\n  }\r\n\r\n  /**\r\n   * 加载音频信息（使用 FFmpeg 获取音频时长等信息）\r\n   */\r\n  async load() {\r\n    if (!this.audioPath || !await fs.pathExists(this.audioPath)) {\r\n      console.warn(`音频文件不存在: ${this.audioPath}`);\r\n      return;\r\n    }\r\n\r\n    try {\r\n      const { FFmpegUtil } = await import('../utils/ffmpeg.js');\r\n      const ffmpeg = new FFmpegUtil();\r\n      \r\n      // 使用 FFprobe 获取音频信息\r\n      const execaModule = await import('execa');\r\n      const execa = execaModule.default || execaModule.execa || execaModule;\r\n      const { stdout } = await execa('ffprobe', [\r\n        '-v', 'error',\r\n        '-show_entries', 'format=duration',\r\n        '-of', 'default=noprint_wrappers=1:nokey=1',\r\n        this.audioPath,\r\n      ]);\r\n      \r\n      const duration = parseFloat(stdout.trim());\r\n      \r\n      this.audioInfo = {\r\n        duration: duration || 0,\r\n        path: this.audioPath,\r\n      };\r\n      \r\n      // 如果 duration 未指定，使用音频文件的时长\r\n      if (!this.duration && this.audioInfo.duration > 0) {\r\n        this.duration = this.audioInfo.duration;\r\n        if (this.endTime === Infinity) {\r\n          this.endTime = this.startTime + this.duration;\r\n        }\r\n      }\r\n      \r\n      this.loaded = true;\r\n    } catch (error) {\r\n      console.warn(`获取音频信息失败: ${this.audioPath}`, error.message);\r\n      this.loaded = false;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 设置音频源\r\n   */\r\n  async setSrc(src) {\r\n    this.src = src;\r\n    this.audioPath = src;\r\n    await this.load();\r\n  }\r\n\r\n  /**\r\n   * 设置音量\r\n   */\r\n  setVolume(volume) {\r\n    this.volume = Math.max(0, Math.min(1, volume));\r\n  }\r\n\r\n  /**\r\n   * 设置淡入时长\r\n   */\r\n  setFadeIn(duration) {\r\n    this.fadeIn = Math.max(0, duration);\r\n  }\r\n\r\n  /**\r\n   * 设置淡出时长\r\n   */\r\n  setFadeOut(duration) {\r\n    this.fadeOut = Math.max(0, duration);\r\n  }\r\n\r\n  /**\r\n   * 音频元素不需要渲染到 canvas\r\n   */\r\n  render(layer, time) {\r\n    // 音频元素不渲染到 canvas\r\n    return null;\r\n  }\r\n\r\n  /**\r\n   * 设置音频裁剪时间\r\n   */\r\n  setAudioTrim(startTime, endTime) {\r\n    this.audioStartTime = Math.max(0, startTime || 0);\r\n    this.audioEndTime = endTime !== undefined ? Math.max(this.audioStartTime, endTime) : undefined;\r\n  }\r\n\r\n  /**\r\n   * 获取音频配置（用于导出）\r\n   */\r\n  getAudioConfig() {\r\n    return {\r\n      path: this.audioPath,\r\n      startTime: this.startTime || 0, // 在视频中的开始时间\r\n      duration: this.duration, // 在视频中的持续时间\r\n      audioStartTime: this.audioStartTime || 0, // 从音频文件中裁剪的开始时间\r\n      audioEndTime: this.audioEndTime, // 从音频文件中裁剪的结束时间（undefined 表示裁剪到文件末尾）\r\n      volume: this.volume,\r\n      fadeIn: this.fadeIn,\r\n      fadeOut: this.fadeOut,\r\n      loop: this.loop,\r\n    };\r\n  }\r\n}\r\n\r\n"],"names":["BaseElement","ElementType"],"mappings":"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"}