"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.AudioMerger = void 0; const fs_1 = __importDefault(require("fs")); const child_process_1 = require("child_process"); const util_1 = require("util"); const execAsync = (0, util_1.promisify)(child_process_1.exec); class AudioMerger { // 合并多个音频文件 static async merge(inputFiles, outputPath) { if (inputFiles.length === 0) { throw new Error('没有音频文件需要合并'); } if (inputFiles.length === 1) { // 单个文件直接复制 fs_1.default.copyFileSync(inputFiles[0], outputPath); return outputPath; } try { // 创建文件列表 const listContent = inputFiles.map(f => `file '${f}'`).join('\n'); const listFile = '/tmp/ffmpeg_list.txt'; fs_1.default.writeFileSync(listFile, listContent); // 检查输出格式 const outputExt = outputPath.split('.').pop()?.toLowerCase(); // 构建 FFmpeg 命令 let cmd; if (outputExt === 'mp3') { // MP3 需要转码(WAV/PCM -> MP3) cmd = `ffmpeg -f concat -safe 0 -i "${listFile}" -c:a libmp3lame -b:a 192k -y "${outputPath}"`; } else { // 其他格式直接复制 cmd = `ffmpeg -f concat -safe 0 -i "${listFile}" -c copy -y "${outputPath}"`; } await execAsync(cmd, { timeout: 120000 }); console.log(`✅ 音频合并成功: ${outputPath}`); return outputPath; } catch (error) { console.error('❌ 音频合并失败:', error); throw new Error('音频合并失败'); } } // 获取音频时长 static async getDuration(filePath) { try { const cmd = `ffprobe -i "${filePath}" -show_entries format=duration -v quiet -of csv="p=0"`; const { stdout } = await execAsync(cmd, { timeout: 10000 }); return Math.round(parseFloat(stdout.trim()) || 0); } catch (error) { console.error('❌ 获取音频时长失败:', error); return 0; } } } exports.AudioMerger = AudioMerger;