avconv无法覆盖文件?同名输出视频压缩无效问题咨询
问题分析与解决方案
你遇到的这个情况其实是avconv的典型限制——就算加了-y参数,输入和输出文件同名时也没法正常覆盖原文件,这不是-y没用,而是工具的文件处理逻辑导致的。
为什么同名操作会失效?
avconv处理文件时,会先打开输入文件读取数据,同时尝试创建/写入输出文件。如果两者是同一个文件,它开始写入输出的瞬间,原输入文件的内容就会被破坏,后续读取输入数据时直接出错,最终导致处理失败,原文件自然不会被修改。-y只是用来确认允许覆盖已存在的输出文件,但解决不了“输入文件被提前破坏”的底层问题。
正确的处理思路
确实得先用不同的输出文件名完成转码,等转码成功后再替换原文件。这样既能避免输入文件被中途损坏,还能保证如果转码失败,原文件不会丢失。
修改后的代码示例
你可以调整代码逻辑,用临时文件中转:
// 定义临时输出文件,避免和原文件冲突 $tempOutput = $vfile . '.temp'; // 第一步:执行视频压缩 $thuc = exec("avconv -y -i $vfile -map 0 -c:v libx264 -crf 22 -c:a copy $tempOutput"); // 第二步:如果视频宽度超过800,执行缩放处理 if ($video_width > 800) { $thuc = exec("avconv -y -i $tempOutput -filter:v scale=\"750:trunc(ow/a/2)*2\" -c:a copy $tempOutput"); } // 第三步:转码完成后替换原文件(先确保临时文件存在) if (file_exists($tempOutput)) { unlink($vfile); rename($tempOutput, $vfile); }
额外提醒
- 最好在
exec之后检查命令的返回值,确认转码成功后再替换原文件,避免意外丢失原文件。 - 临时文件建议放在原文件同目录下,减少跨目录的权限问题。
内容的提问来源于stack exchange,提问作者Verode
相关产品推荐
相关产品推荐

