是否可以使用 ffmpeg 从未指定长度的视频开始处修剪 X 秒?

mar*_*ate 37 video mencoder ffmpeg

我需要修剪一系列不同长度的 FLV 录音的前 1 或 2 秒。我找到了很多资源来从视频中提取指定的持续时间(例如 30 秒剪辑),但没有找到继续到视频结尾的资源。

这两种尝试都只是产生了视频的复制版本,没有所需的修剪:

ffmpeg -ss 2 -vcodec copy -acodec copy -i input.flv output.flv

ffmpeg -ss 2 -t 120 -vcodec copy -acodec copy -i input.flv output.flv
Run Code Online (Sandbox Code Playgroud)

关于第二个的想法是:也许如果我指定了超出可能的长度,它就会走到最后。没有骰子。

我知道这不是编解码器的问题,也不是使用秒而不是时间码的问题,因为以下内容很有用:

ffmpeg -ss 2 -t 5 -vcodec copy -acodec copy -i input.flv output.flv
Run Code Online (Sandbox Code Playgroud)

还有其他想法吗?我愿意使用其他(基于 Windows 的)命令行工具,但是我非常喜欢 ffmpeg,因为我已经使用它来创建缩略图并且熟悉它。

如果有帮助,我的视频将全部少于 2 分钟。

更新:

我已经改用 Mencoder ( http://www.mplayerhq.hu/ ) 因为看起来 ffmpeg 如果没有一些额外的技巧就无法实现这一点。

完成我打算做的事的 Mencoder 语法是:

mencoder.exe -ss 2 -oac copy -ovc copy input.flv -o output.flv
Run Code Online (Sandbox Code Playgroud)

小智 38

尝试:

ffmpeg -i input.flv -ss 2 -vcodec copy -acodec copy output.flv
Run Code Online (Sandbox Code Playgroud)

我认为输入参数应该是第一个。

  • 如 [FFmpeg Seeking](https://trac.ffmpeg.org/wiki/Seeking) 中所述,在复制时使用 -ss 作为输入参数(在 `-i` 之前),甚至使用旧版本的 FFmpeg 进行转码,使用关键帧搜索。这要快得多,但牺牲了准确性。如果您将其用作输出参数,则该过程可能会慢得多(即使对于丢弃的部分,输入也是逐帧解码的),但准确无误。尽管这个问题很老,但我认为这应该是公认的答案。 (6认同)

mar*_*ate 27

原来,这个命令2秒修剪上的视频,如预期:

ffmpeg -i input.flv -ss 2 -vcodec copy -acodec copy output.flv
Run Code Online (Sandbox Code Playgroud)

问题在于 input.flv 中的关键帧间隔。它被设置为 5 秒,这在视频的开头产生了 3 秒的黑帧(5 - 2 = 3)。从那以后,我将关键帧间隔更改为 1 秒,但在我的情况下,2 秒也可能会产生所需的结果。

更新:根据 Dave 的回答更新了排序-i-ss参数,我已经接受了信用。

  • 我也遇到了这个问题。[这篇文章](http://ubuntuforums.org/showthread.php?t=1824250&p=11148562#post11148562) 为我做的。我咬紧牙关,不再尝试对我所有的编辑命令使用`-vcodec copy -acodec copy`。重新编码防止了我的视频开头的黑帧或没有在正确的位置剪切(第二次 * 没有 * 重新编码的差异转化为视频中几乎 5 秒的差异)。所以,我最终用 `-vcodec libx264 -crf 0` 替换了 `-vcodec copy`。 (3认同)
  • 我刚刚遇到了同样的事情。我发现我不能只是`-vcodec copy`,因为切片不是从关键帧开始的。我得到了 N 秒的静止图像或黑色图像,直到下一个关键帧。如果我真的重新编码而不是复制,它会按预期工作。所以即使我的输入和输出都是 H264,我仍然需要重新编码(使用 `-vcodec libx264` 而不是 `-vcodec copy`)。 (3认同)

小智 8

在 -i 之前使用 -ss 和 -to 像这样:

ffmpeg -ss 00:01:10 -to 00:02:10 -i input -c copy output
Run Code Online (Sandbox Code Playgroud)