我正在尝试切掉一部分.avi使用命令
ffmpeg -ss 346 -i input.avi -t 5 -c copy -y output.avi
输出视频的总长度约为 13 秒,比需要的时间长 8 秒。但如果将输出文件的扩展名指定为.mp4,则切割准确。我想了解为什么会发生这种情况。
任何帮助都将受到赞赏。
答案1
AVI 和 MP4 都是数据流的容器,MP4 的功能更强大。
MP4 容器允许您在非关键帧处从源视频流创建精确的“剪切”,而无需重新编码,方法是在内部使用编辑列表。
例如,假设您要从源视频中复制 346s 到 351s 秒(您似乎正在执行此操作)。如果 346s 之前最接近的关键帧位于 338s,则 ffmpeg 实际上会从 338s 开始复制视频,但会使用 MP4 的编辑列表魔法来告诉媒体播放器跳过前 8 秒。
同样的逻辑可能也适用于剪辑结尾(不确定,需要测试)。如果是这样,编辑列表还会告诉媒体播放器提前停止播放。
AVI 不像 MP4 那样支持编辑列表,这就是为什么使用 AVI 容器您会看到完整的 13 秒剪辑。
我希望这是有意义的 - 如果您有疑问,请发表评论,我会尽力澄清。
编辑我创建了一个图表来尝试直观地展示 ffmpeg 正在做什么: