You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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%的情况都是前者。

正确的操作流程

要安全覆盖原文件,必须分两步走:

  1. 先把压缩后的视频输出到新文件,确认内容正常后再替换原文件
  2. 用系统自带的文件移动命令完成替换,别让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

火山引擎 最新活动