diff --git a/src/common/utils/audio.ts b/src/common/utils/audio.ts index b495e1b..bd87ecc 100644 --- a/src/common/utils/audio.ts +++ b/src/common/utils/audio.ts @@ -6,7 +6,7 @@ import path from "node:path"; import {DATA_DIR, TEMP_DIR} from "./index"; import {v4 as uuidv4} from "uuid"; import {getConfigUtil} from "../config"; -import ffmpeg from "fluent-ffmpeg"; +import {spawn} from "node:child_process" export async function encodeSilk(filePath: string) { function getFileHeader(filePath: string) { @@ -66,30 +66,26 @@ export async function encodeSilk(filePath: string) { const _isWav = await isWavFile(filePath); const pcmPath = pttPath + ".pcm" let sampleRate = 0 - const convert = async () => { - return await new Promise<Buffer>((resolve, reject) => { - const ffmpegPath = getConfigUtil().getConfig().ffmpeg; - if (ffmpegPath) { - ffmpeg.setFfmpegPath(ffmpegPath); - } - ffmpeg(filePath) - .outputOptions([ - "-ar 24000", - "-ac 1", - "-f s16le" - ]) - .on("error", function (err) { - log(`ffmpeg转换出错: `, err.message); - reject(err); - }) - .on("end", () => { + const convert = () => { + return new Promise<Buffer>((resolve, reject) => { + const ffmpegPath = getConfigUtil().getConfig().ffmpeg || process.env.FFMPEG_PATH || "ffmpeg" + const cp = spawn(ffmpegPath, ["-y", "-i", filePath, "-ar", "24000", "-ac", "1", "-f", "s16le", pcmPath]) + cp.on("error", err => { + log(`FFmpeg处理转换出错: `, err.message) + return reject(err) + }) + cp.on("exit", (code, signal) => { + const EXIT_CODES = [0, 255] + if (code == null || EXIT_CODES.includes(code)) { sampleRate = 24000 const data = fs.readFileSync(pcmPath) fs.unlink(pcmPath, (err) => { }) - resolve(data) - }) - .save(pcmPath); + return resolve(data) + } + log(`FFmpeg exit: code=${code ?? "unknown"} sig=${signal ?? "unknown"}`) + reject(Error(`FFmpeg处理转换失败`)) + }) }) } let input: Buffer