ffmpeg如何检测视频裁剪完成?Electron应用读取裁剪MP4为空怎么解决
解决方案
方案1:监听child_process的exit事件(最推荐)
这是准确率最高的方案,你通过execFile启动ffmpeg子进程后,直接监听子进程的退出事件,只有退出码为0(代表ffmpeg执行成功)时再读取目标文件,完全避免提前读取的问题。
示例代码:
const { execFile } = require('child_process'); const ffmpegPath = '你的ffmpeg二进制文件路径'; const ffmpegProcess = execFile(ffmpegPath, [ // 你的ffmpeg裁剪参数 '-i', '输入视频路径', '-preset', 'ultrafast', // 其他裁剪参数 croppedFilePath ], (error, stdout, stderr) => { if (error) { console.error('ffmpeg执行失败:', error); return; } // 执行到此处代表ffmpeg已完全运行结束,文件写入完成 console.log('ffmpeg裁剪完成,开始读取文件'); fs.readFile(croppedFilePath, (err, data) => { // 后续文件处理逻辑 }); });
你原有的文件存在检测逻辑可直接替换为该监听逻辑,不需要额外做文件状态轮询。
方案2:临时文件过渡方案
如果需要保留原有文件检测逻辑,可以让ffmpeg先把输出写入到带临时后缀的文件,等ffmpeg执行成功后再重命名为最终目标文件,此时检测到目标文件存在就一定是写入完成的状态:
- 调整ffmpeg输出路径为
${croppedFilePath}.tmp - ffmpeg执行成功后调用
fs.rename()把.tmp文件重命名为最终的.mp4文件 - 你的文件监听逻辑只要检测最终
.mp4文件存在即可,不会出现空文件问题
方案3:文件状态轮询校验(兼容原有逻辑)
如果不能修改原有监听逻辑,可在检测到文件存在后增加额外校验规则:
- 每隔500ms读取一次文件大小,连续2~3次检测到文件大小没有变化,再执行读取操作
- 也可以尝试以写入模式打开文件,如果能成功拿到独占锁,说明ffmpeg已经关闭文件句柄,裁剪完成
内容的提问来源于stack exchange,提问作者Radespy
相关产品推荐
相关产品推荐

