免费浏览器端媒体工具
剪出来的视频为什么比设定值长一点?
快速剪切不重新编码,几乎快速,画面原封不动;它同时也会比你设定的位置多跑出几帧。我们实测了这几分之一秒来自哪里,以及什么时候真的需要在意。
剪出来的视频为什么比设定值长一点?
快速剪切不重新编码,几乎快速,画面原封不动;它同时也会比你设定的位置多跑出几帧。我们实测了这几分之一秒来自哪里,以及什么时候真的需要在意。
先说结论
剪切工具有两条路径。快速剪切直接复制原始的视频流与音频流、不做重新编码,因此快速、画面一个像素都没动 —— 但它交回来的文件会比你选定的位置多跑出几帧:选 2.000 秒的区间,拿回来的是 2.133 秒。同一区间改用重编码,得到 2.000000 秒,一帧不差。
多出来的长度在 2 到 4 帧之间,30fps 素材上就是 0.07 到 0.13 秒。它和关键帧间隔无关,也不会因为视频变长而变严重。剪一段口播发社交媒体,你基本察觉不到;要卡音乐节拍或对齐字幕,就会碰到它。
实测数据
我们让同一条区间在两套路径上各跑一遍,素材为完全相同的 640x360、30fps 片段,再用 ffprobe 读回结果。
- 目标 2.000 秒(1.5s 到 3.5s):快速剪切输出 2.133 秒 / 62 帧;重编码输出 2.000000 秒 / 60 帧。
- 目标 10.000 秒(5.0s 到 15.0s):快速剪切输出 10.133 秒 / 302 帧;重编码精确输出 10.000000 秒 / 300 帧。
- 起点正好落在关键帧上的区间(2.0s 到 4.0s):快速剪切依然输出 2.067 秒。把剪切点对准关键帧并不能消除这个偏差。
- 四段素材,关键帧间隔分别为 1、2、5、10 秒:快速剪切在四段上都输出 2.133 秒。关键帧间隔完全没有影响。
准确的是起点,不是结尾
关于剪切不精确,最常见的解释是「关键帧对齐」—— 说复制模式的剪切点会吸附到最近的关键帧上。我们自己的实测不支持这个说法。把输出首帧的解码像素与源文件的每一帧逐一比对后,1.5s 到 3.5s 快速剪切的第 0 帧与源文件 1.500 秒那一帧像素完全一致。
偏差出在结尾。把输出的帧时间戳列出来,最后两帧就不再有均匀间隔:它们落在 2.033 秒和 2.100 秒附近,而标准的 30fps 节奏应该把这两帧放在 2.000 秒和 2.033 秒。画面本身没有被复制或丢帧,只是你选定区间的末尾那几个数据包本来就不落在整齐的帧边界上,而流拷贝不被允许改写它们。
该选哪条路
- 只要快、长度差一点无所谓:用快速剪切。在一段 30 秒测试素材上剪 10 秒区间,快速剪切耗时 0.03 秒,重编码耗时 0.26 秒,而且原始编码画面一个比特都没动。
- 要卡节拍、对齐字幕、或必须凑够固定时长:用重编码。代价是一点时间和一代画质,换来的是精确落在你指定的那一帧上。
- 剪完还要把多段拼起来:建议重编码。每一段都带着自己的尾部偏差,把若干快速剪切的片段接起来会把这些偏差叠加在一起。
- 文件大小不适合作为选择依据。实测同一条 10 秒区间,快速剪切输出 1.34 MB,重编码输出 0.83 MB —— 后者小是因为它用 CRF 23 从头重新压缩了一遍。更小并不等于更好。