FFmpeg压缩视频时覆盖原文件导致时长缩短问题咨询
问题根源:FFmpeg不支持原地覆盖输入文件
这事儿我之前也踩过一模一样的坑!核心原因特别直白:FFmpeg绝对不能同时把同一个文件既当输入又当输出,哪怕你加了-y强制覆盖参数也没用。
为什么直接覆盖原文件会变成1秒?
当你执行ffmpeg -y -i my_video.mp4 ... my_video.mp4时,FFmpeg的操作逻辑是这样的:
- 先打开
my_video.mp4作为输入源,开始读取视频数据 - 几乎同时,因为输出路径和输入一致,它会按照
-y的要求清空原文件,准备写入新内容 - 结果就是,FFmpeg刚读到开头1秒的视频数据,原文件的后续内容就被清空覆盖了
- 等到它想继续读取剩下的4秒数据时,原文件已经被破坏,只能输出那仅存的1秒内容,原文件直接报废
为什么输出改名为my_video2.mp4时,原文件还是变成1秒?
这里大概率是你测试时的小疏忽——你是不是用了已经被第一次操作破坏的my_video.mp4来执行第二次命令?如果是用原始的5秒视频执行ffmpeg -y -i my_video.mp4 ... my_video2.mp4,FFmpeg只会以只读模式读取原文件,输出完全独立的新文件,原文件根本不会被修改。
如果确实是用原始文件执行后原文件仍损坏,那可能是极罕见的文件系统问题或FFmpeg版本bug,但99.9%的情况都是前者。
正确的操作流程
要安全覆盖原文件,必须分两步走:
- 先把压缩后的视频输出到新文件,确认内容正常后再替换原文件
- 用系统自带的文件移动命令完成替换,别让FFmpeg直接碰原文件
示例命令:
# 第一步:压缩到新文件,保留原文件 ffmpeg -y -i my_video.mp4 -vcodec h264 -acodec mp2 my_video2.mp4 # 第二步:确认my_video2.mp4正常后,替换原文件(Linux/macOS) mv my_video2.mp4 my_video.mp4 # Windows系统用move命令 move my_video2.mp4 my_video.mp4
这样就能保证原文件在整个过程中不会被意外破坏,万一新文件有问题,原文件还能完好保留。
内容的提问来源于stack exchange,提问作者user9066203




