如果将输出指定为 .avi 文件,则剪切 .avi 文件的一部分是不准确的(但如果将输出指定为 .mp4 文件,则准确)

如果将输出指定为 .avi 文件,则剪切 .avi 文件的一部分是不准确的(但如果将输出指定为 .mp4 文件,则准确)

我正在尝试切掉一部分.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 正在做什么:

当你不重新编码时,ffmpeg 如何进行剪切

相关内容