You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:24:03