如何在Node.js中使用FFmpeg检测损坏的MP3文件
在Node.js中使用ffmpeg-static检测MP3文件完整性
先解决你之前的命令执行问题
你之前的代码直接返回exec()的结果,这其实是一个ChildProcess对象,而非命令的执行输出或结果。而且exec是异步操作,必须通过回调或Promise来处理输出、错误信息,才能知道命令为什么失败。
实现MP3完整性检测的方案
要检测MP3文件是否存在缺失或损坏的帧,对应的FFmpeg核心命令是:
ffmpeg -v error -i input.mp3 -f null -
这个命令会完整解码目标文件,若存在损坏帧,FFmpeg会在stderr输出错误信息,且返回非0的退出码;若文件正常,则无错误输出,退出码为0。
以下是基于ffmpeg-static的Node.js实现代码:
import pathToFfmpeg from "ffmpeg-static"; import shell from 'any-shell-escape'; import { exec } from "child_process"; import { resolve } from 'path'; // 封装FFmpeg命令执行为Promise,方便异步处理 function runFfmpegCommand(commandArgs) { return new Promise((resolveExec, rejectExec) => { const script = shell([pathToFfmpeg, ...commandArgs]); exec(script, (error, stdout, stderr) => { if (error) { // FFmpeg检测到文件损坏时会返回非0退出码,此时stderr包含具体错误信息 return rejectExec({ error, stderr }); } resolveExec({ stdout, stderr }); }); }); } // 检测MP3文件完整性的核心函数 async function checkMp3Integrity(src) { const fullPath = resolve(process.cwd(), src); try { await runFfmpegCommand([ '-v', 'error', // 仅输出错误信息 '-i', fullPath, // 目标MP3文件路径 '-f', 'null', '-'// 不输出任何文件,仅执行解码检测 ]); return { isIntact: true, error: null }; } catch (result) { return { isIntact: false, error: result.stderr.trim() }; } } // 使用示例 // checkMp3Integrity('./your-file.mp3').then(result => { // if (result.isIntact) { // console.log('MP3文件完整无损坏'); // } else { // console.log('MP3文件存在损坏:', result.error); // } // }).catch(execError => { // console.log('命令执行失败(如文件不存在):', execError); // });
代码说明
- Promise封装:将
exec异步操作封装为Promise,支持async/await语法,更易维护和调试。 - 命令安全:使用
any-shell-escape处理命令参数,避免注入风险。 - 错误处理:FFmpeg检测到文件损坏时会触发Promise的reject,我们从中提取
stderr的错误信息,判断文件状态。
内容的提问来源于stack exchange,提问作者Oliver Wagner
相关产品推荐
相关产品推荐

