假设我需要删除视频中除第二分钟之外的所有内容。
例如,我可以按照以下方式执行此操作:
ffmpeg -copyts -ss <start> -i input.mp4 -to <end> -c:v libx264 -crf 23 -c:a aac -b:a 192k output.mp4
我感兴趣的是应该-ss
在之前还是之后-i
。
我已经阅读了这里和这里的所有答案和评论。从我在那里读到的内容来看,似乎在 FFmpeg 的旧版本(2.1 之前)中,放置-ss
在前面-i
是为了更快地处理,而放置-ss
在后面-i
是为了更准确的处理,但在较新的版本中,放置-ss
在前面-i
不仅是为了更快地处理,也是为了更准确的处理。
但另一方面,这里的“输入寻求”和“输出寻求”部分没有提到这个细微差别,阅读之后我不太确定放在-ss
前面-i
是否是“唯一的解决方案”。
有人能解释一下吗?(我希望处理准确。我不关心需要多长时间。)
压缩编解码器在给定的时间间隔内使用关键帧(或帧内帧)。只有在关键帧中才会存储完整的图像,而中间帧仅存储与相邻关键帧的差异。因此,任何流的解码都必须始终从关键帧开始。
在 2.1 版之前,ffmpeg 的
-ss
选项在用作输入选项(即参数之前)时无法准确定位-i
。相反,它会从最近的关键帧开始,因此无法在指定的时间准确剪切。您首先需要解码整个流,以便您可以选择要剪切的准确帧,为此您需要将其用作输出-ss
选项(即-i
参数之后)。然而如今,官方文件指出:
因此,如果您追求准确性,那么现在使用参数
-ss
作为输出选项是没有任何意义的,因为您只是浪费时间来解码您无论如何都会丢弃的东西。作为输出参数的主要用途
-ss
是它将保留原始时间码,这在某些情况下可能会有用。请注意,上述内容意味着您不能在进行流复制的同时在任意搜索点开始编码。另一方面,如果确切的起点不是那么重要,您可以
-ss
结合使用流复制并避免重新编码。