我曾经从采访中删除了 40 秒的答案,将其放入甲板上,并在我想要的部分前 7 秒钟在句子中开始观看演讲者。 我已经小心地开始了。 修剪器忽略了我,或者它看起来是这样。 它没有:它做了一个快速剪辑可以做的唯一事情,即在我要求的点之前从最近的关键帧开始。 一旦你知道,行为就不再是一个错误,成为一种选择,有两种选择,选择正确的一种需要一秒钟。
TL;博士: 快速修剪复制现有视频流而不是重新编码,并且副本只能从关键帧开始。 要求在关键帧相隔十秒的文件上从 0:07 开始,并且切割从 0:00 开始,因为这是解码器可以从的最后一点。 末端落在你问的地方;只有起点漂移,它向后漂移。 当您需要确切的帧时,修复是重新编码,速度较慢且成本略高。 那个 视频修剪器 同时提供和默认为快速之一。
为什么削减比你问的要早?
因为视频中几乎没有帧是完整的图片。
视频压缩通过存储一帧全帧然后描述更改来工作。 关键帧,正确的 IDR 帧 264,拥有整个图像,没有依赖。 保持差异后的帧:此块向左移动了四个像素,该区域不变,这些像素变得稍暗。 一个框架在这个序列的中途本身是没有意义的,没有它适用的文件,差异是没有意义的。
因此,当您要求在 0:07 开始并且该工具复制流而不解码它时,0:07 时没有任何内容可复制。 有一个描述 0:07 与之前的内容有何不同。 玩家唯一可以开始的地方是关键帧,唯一安全的地方是在起点或之前的最后一个关键帧。
另一种方法是将视频解码到 0:07,丢弃之前的内容,并将剩余的内容压缩到以新关键帧开头的新文件中。 这是准确的,它是慢路径,因为它在每个帧上都确实工作而不是复制字节。
关键帧的距离真的多远?
比大多数人假设的还要远,而差距决定了快捷的错误。
我测量它而不是猜测。 用x264默认情况下对30秒的测试素材进行编码,然后列出关键帧:
ffmpeg -f lavfi -i "testsrc=duration=30:size=640x360:rate=25" -c:v libx264 clip.mp4
ffprobe -select_streams v -show_entries packet=pts_time,flags -of csv=p=0 clip.mp4 \
| awk -F, '$2 ~ /K/ {print $1}'
# 0.000000
# 10.000000
# 20.000000
每十秒一键。 即 X264 默认为 250 帧之间的关键帧,每秒 25 帧。 在使用这些默认值编码的文件上,快速修剪可以在您选择的点之前开始长达十秒钟。
您处理的大多数镜头都更友好,因为其中大部分是为流式传输而制作的,玩家需要频繁的入口点来切换质量。 以下是值得了解的范围:
| 来源 | 典型的关键帧间隙 | 快速切割时的最坏情况漂移 |
|---|---|---|
| 录音 | 1 到 2 秒 | 几乎不明显 |
| 流式视频、HLS 或 DASH | 2 到 6 秒 | 短片上很明显 |
| X264 或 FFMpeg 默认值 | 25 fps 时 10 秒 | 毁掉捷径 |
| 屏幕录像机,低运动 | 10秒或更长时间 | 毁掉捷径 |
模式:为播放器编码的任何东西都有关闭的关键帧,而任何编码一次的存储都没有。
漂移对文件有什么作用?
它移动开始并留下结束,这值得精确,因为很容易假设整个窗口滑动。
请求 0:07 至 0:15 的相同剪辑,一个 8 秒的窗口,带有流副本:
| 征求 | 源中的关键帧 | 结果 | 发生了什么 |
|---|---|---|---|
| 7s 到 15s | 0、10、20 | 0s 到 15.08s | 开始在 0 处退回关键帧 |
| 12s 到 20s | 0、10、20 | 10s 到 20.08s | 开始在 10 时回落到关键帧 |
| 7s 到 15s | 每2s | 6s 到 15.08s | 开始回退一关键帧 |
三者中的结局是正确的。 我通过散列帧而不是信任持续时间来检查:输出的最后一帧与源帧在15.04秒是字节相同的,这是我要求的帧和停止的正确位置。 改变的是它开始的地方。
这就是为什么文件比您选择的窗口长的原因。 你认为是八秒的切口到了十五秒,不是因为任何东西都被占用了,而是因为有七秒的引导。 在关键帧相隔两秒的剪辑中,相同的剪辑到达九秒,没有人注意到。
什么时候应该重新编码?
三种情况,在它们之外,快路是更好的工具。
您需要一个特定的框架。 在一个球击中球棒的那一刻,在一个手势上切割一个字。 关键帧的准确性不够好,滑块的注意力都不够,因为限制在文件中而不是界面中。
夹子很短。 三十秒的剪辑中的 7 秒前导入是一件令人讨厌的事情。 在四秒钟的剪辑中,它是整个事情。
您正在使用稀疏关键帧切断文件。 屏幕记录和任何一次导出的存档,如上图所示。
成本是真实的,但比人们担心的要小。 重新编码对窗口中的每一帧进行解码并再次压缩,因此它需要时间与剪切的长度成比例而不是文件的大小,并且它失去了一代质量。 在 23 的恒定速率因子(这是修剪器用于其准确模式的情况下),该损失在一次通行证上几乎是不可见的。 这是已经压缩过一次的镜头的第二个传送,这是一样的 控制压缩的生成损失 一般。
如何在自己的文件中找到关键帧?
一项命令,它提前告诉您快速路径是否可以。
# the first ten keyframe timestamps, in seconds
ffprobe -select_streams v -show_entries packet=pts_time,flags -of csv=p=0 input.mp4 \
| awk -F, '$2 ~ /K/ {print $1}' | head -10
如果间隙是一两秒,请快速修剪并停止思考。 如果它们是十,并且您的剪辑很重要,请重新编码。
有第二个用途。 如果您正在制作其他人将剪辑的镜头,则以较短的关键帧间隔进行编码,以较小的文件大小成本,使他们的生活更轻松。 关键帧是完整的画面,因此更多的意味着更多的字节,这正是当没有人要求任何其他东西时,编码器将它们隔开。
修剪会降低质量吗?
严格意义上的快路没有。 没有任何被解码,因此没有任何东西被重新压缩:输出中的帧与输入中的输入字节(字节)中的压缩帧相同,在新容器中。 以这种方式修剪一个文件十次,第十次的质量与第一个相同。
准确的路径,一次。 窗口被解码和压缩,因此它会产生一代的损失。 在合理的质量目标上编码良好的来源上,这是很难看到的,明智的规则是从原始的一遍中进行所需的切割,而不是修剪修剪的装饰。
任何路径都不会升级、锐化或改进任何东西。 修剪器会减少时间,这是整个工作。
为什么我的修剪剪辑不能立即开始播放?
因为索引的位置,压缩时同样重要的标志。
MP4 包含一个描述每个帧开始的表。 按明显的顺序编写,该表以文件的末尾结束,因为编码器仅在完成后才知道其内容。 从磁盘播放,很好。 提供通过 HTTP 服务,玩家在整个文件到达之前无法启动。
修剪器通过 -movflags +faststart,它进行了快速的第二次传球并将该桌子移动到前面。 然后,在下载时开始播放剪辑,这是您想要的文件进入聊天应用程序、CMS 或从 URL 中提取它的幻灯片时的内容。
音频会发生什么?
音频是在其自己的帧边界上切割的,并且它们比视频关键帧间隔短得多,因此音频可以开始比图片更接近您的标记。
不匹配是另一个经典修剪故障的来源:一个剪辑的声音略微领先于图片,或者以单词的片段开头。 修复是在参数中而不是在编辑中,修剪器传递它: -avoid_negative_ts make_zero 重新定位两个流的时间戳,以便输出从零开始,流仍然相对彼此对齐。 没有它,流副本可以为关键帧和切点之间的帧发出负时间戳,玩家不同意如何处理这些帧。 有些跳过,有些停滞,有些早点播放音频。
如果你只想要声音,先剪视频,然后 提取音频 是错误的顺序。 先提取并剪切音频,因为音频剪切是准确且便宜的。
修剪手机的照片应用程序会更好吗?
对于一个快速的个人剪辑,它很好,它就在那里。 对于你将发布的任何内容,不,原因并不明显。
电话编辑器通常在导出时重新编码,并且它们使用为速度和可预测的文件大小而不是保真度选择的设置进行设置。 您在每次装饰时都支付一代人的损失。 更糟糕的是,其中一些无损地进行了修剪,将您的进出点存储为原始数据旁边的元数据,这看起来像是手机上的修剪,并且在文件离开后根本不是修剪:收件人获得完整的剪辑,或他们的玩家忽略的编辑列表。
复制模式修剪避免了这两个问题。 您获得的文件是每个人都得到的文件,其中的帧从未被解码过。
视频会离开我的机器吗?
不 。 切割贯穿 编译为 WebAssembly 的 ffmpeg 在浏览器选项卡内:从磁盘读取文件,在那里修剪,并作为下载返回。 发生这种情况时,DevTools 中的网络面板将保持空白。
对于素材,这比大多数文件类型更重要。 剪辑通常是任何人编辑的最大和最私人的东西,免费在线修剪器的正常安排是您将您的素材上传给陌生人,并相信您未阅读的页面上的保留政策。 这里没有任何副本可以保留。
限制是选项卡而不是计划:单个剪辑在 30 分钟内被封顶,整个源必须适合浏览器内存。 在此之前,桌面工具既更快又更可靠,这样说比在第九分钟给你一个内存不足的选项卡要好。
桌面编辑器什么时候是正确的工具?
当你做的不仅仅是消除时间。 加入多个剪辑,在您需要在样本级别看到的波形上添加标题、颜色、音乐或剪辑。 那是一个编辑时间表,而不是一个修剪器,正确的答案是真正的编辑器。
在浏览器中,分界线几乎同样干净。 从一个夹子上移除一个拉伸是一种修剪。 将碎片连接在一起是 视频编辑器。 使结果变小是 压缩机,并且更改容器或编解码器是 转换器,这是一个 不同于压缩的操作 尽管两人经常混淆。
为什么预览和导出的文件不一致?
因为一个修剪接口从三个不同意数字是什么的地方收集相同的数字,而将它们放在一个值上是修剪器中的大部分工作。
一个文本字段为您提供任何人输入的内容,这可能是 7、 0:07、 00:00:07 或 7.25。 滑块比任何人都想要的更精确地提供浮动。 视频元素 currentTime 给出另一个浮点数,它不一定是框架的时间戳:浏览器可以报告帧之间的位置,它们确实如此。
如果这三个在稍微不同的秒数降落,预览显示一件事,而导出产生另一件事,这是即使切割正确时也会让修剪器感到破碎的特定错误。 这里的解析器接受所有三个时间码形状,将它们解析为右对齐,因此最后一部分始终是秒,无论长度如何,并将单个值传递给预览和导出。 半类型的字段不返回任何东西,而不是抛出,因此输入不会在您键入时每次击键 0:0。
实用建议:当确切的第二个重要时,键入时间码而不是拖动。 滑块用于查找时刻,用于命名它的字段。
如何从中间剪掉一段?
两次切割和一个连接,没有修剪器一步完成,这经常让人们感到惊讶。
移除夹子的中间意味着将零件保留在您的选择之前,并在其之后保留部分,这是两个单独的窗口,然后将它们重新组合在一起。 这里的修剪器每次运行产生一个窗口,所以顺序是:从开始到坏部分的开始,从坏部分的末端修剪到结束,然后将两个连接在 视频编辑器。
当你这样做时要注意两件事。 当两个部件共享编解码器、分辨率和帧速率时,连接可以正常工作,如果两者都通过复制模式修剪来自同一源文件,它们将它们将是可以正常工作的。 接缝在两侧的关键帧边界上,因此第二部分开始比您标记的时间稍早,完全如上所述。 如果切点很重要,请使用第二块的精确模式。
另一种选择是在开始之前停止:如果您想要的是高光而不是编辑,则两个单独的剪辑通常比一个剪辑中缝合的剪辑更有用。



