使用 ffmpeg 剪切视频

Nei*_*eil 518 video ffmpeg command-line processing

我正在使用ffmpeg像这样剪切大文件的一部分:

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv
Run Code Online (Sandbox Code Playgroud)

-ss部分工作正常,但-t被忽略。它正确地删除了指定的初始指定秒数,-ss然后继续使用副本到达输入的末尾。

有没有办法在ffmpeg不重新编码的情况下切断视频的结尾?

小智 608

您可以使用该-ss选项指定开始时间戳,并使用该-t选项指定编码持续时间。时间戳需要采用HH:MM:SS.xxx格式或以秒 ( s.msec) 为单位。

以下将剪辑前 30 秒,然后剪辑之后 10 秒的所有内容:

ffmpeg -ss 00:00:30.0 -i input.wmv -c copy -t 00:00:10.0 output.wmv
ffmpeg -ss 30 -i input.wmv -c copy -t 10 output.wmv
Run Code Online (Sandbox Code Playgroud)

请注意,这-t是一个输出选项,始终需要在之后 指定-i

一些技巧:

  • 对于较旧的 ffmpeg 版本,如果您使用-ssafter -i,您可以获得更准确的搜索,但执行速度会变慢。另请参阅:使用 FFmpeg 搜索
  • 您可以使用-to而不是-t指定要剪切到的时间戳。所以,-i <input> -ss 30 -t 10你也可以做-i <input> -ss 30 -to 40同样的事情来代替。

  • 如果您的 ffmpeg 不支持-c, 或-to,则它可能非常过时。自己编译一个新版本或从他们的主页下载一个静态版本。真的不复杂。

  • @Mondain 实际上,将 -ss 放在后面会更准确。并且 slhck 在这里提到了这一点 http://blog.superuser.com/2012/02/24/ffmpeg-the-ultimate-video-and-audio-manipulation-tool/ 也在 -ss 的 ffmpeg 文档中提到了放置之间的区别它之前或之后。 (6认同)
  • 从文档中,您所说的关于 -t 只是输出选项的部分是不正确的:`当用作输入选项时(在 -i 之前),限制从输入文件读取数据的持续时间。当用作输出选项(在输出文件名之前)时,在其持续时间达到持续时间后停止写入输出。` (3认同)

小智 162

正如其他人所提到的,放在-ss之前(更快)或之后(更准确)-i会产生很大的不同。ffmpeg 搜索页面上的“快速准确搜索”部分告诉您如何获取两者,我已经使用了它,它有很大的不同。基本上你放在-ss之前和之后-i,只要确保在你想要开始切割的地方之前留出足够的时间来获得另一个关键帧。示例:如果您想在 Video.mp4 中制作 1 分钟的剪辑,从 9 分 0 秒到 10 分 0 秒,您可以使用以下方法快速准确地完成:

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4
Run Code Online (Sandbox Code Playgroud)

第一个-ss快速搜索到(大约)8 分钟,然后第二个-ss准确搜索到 9 分钟,然后-t 00:01:00取出一个 1 分钟的剪辑。

还要注意该页面中的这一要点:“如果您使用-sswith -c:v copy,则生成的比特流最终可能会断断续续、不可播放或与音频流不同步,因为 ffmpeg 被迫仅在 i 帧上使用/拆分。 ”

这意味着您需要重新编码视频,即使您只想复制它,否则可能会出现断断续续和不同步的风险。你可以先尝试-c copy,但如果视频很糟糕,你需要重新做。

  • 从 FFmpeg 2.1 开始,-ss 作为输入选项既快速又准确,因此无需将其也包含为输出选项:https://trac.ffmpeg.org/wiki/Seeking (6认同)
  • 是否可以澄清一下:这个答案说“你可以先尝试`-c copy`,但如果视频很糟糕,你需要重新做。” 不过,答案中只提供了“-c copy”,没有讨论如果结果剪切不正确要添加哪些选项。应该添加哪些选项? (4认同)
  • @MRule,如果您省略“-c copy”,它将重新编码,与复制相比,这在计算上昂贵,但更准确,因为它不依赖于输入和输出中的关键帧相同。 (2认同)

Chr*_*ris 42

我发现-ss结合起来会-c copy在开始时产生半秒的斩波。

为避免这种情况,您必须删除-c copy(无可否认会进行转码)。

  • 当我将“-c copy”与“-ss”一起使用时,它在输出开始时增加了 7 秒。 (4认同)

小智 15

手动

在媒体播放器中打开文件,该播放器将逐帧播放并播放包含以下数据的AVISynth 文件

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)
Run Code Online (Sandbox Code Playgroud)

然后使用 EXACT 时间格式进行剪切:

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:05.240 -to 00:00:08.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"
Run Code Online (Sandbox Code Playgroud)

ffmpeg -i "Path\do you want him.flv"        \
       -ss 00:00:10.240 -to 00:00:14.360    \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"
Run Code Online (Sandbox Code Playgroud)

现在用视频文件制作一个txt文件,内容如下:

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'
Run Code Online (Sandbox Code Playgroud)

运行 ffmpeg:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"
Run Code Online (Sandbox Code Playgroud)


Zim*_*mba 10

使用这种格式:

ffmpeg <start time> <input file> <cut duration> <out file>
Run Code Online (Sandbox Code Playgroud)

例如。在 1 分钟的视频后剪切 60 秒的剪辑

ffmpeg.exe -ss 00:01:00 -i "in file.mp4" -to 00:01:00 -c copy out.mp4

注意:输入文件之前的
开始时间更快。输入文件准确/精确后的开始时间


小智 8

对我来说,-t选项没有用,但-vframes有效。我更喜欢使用#frames,因为我宁愿在 I-Frames 处进行剪辑,而且我使用ffprobe.

对我有用的命令行是:

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv
Run Code Online (Sandbox Code Playgroud)

顺便说一句,放在-ss前面对-i执行时间有很大影响。

  • 实际上“-vframes”(或“-frames:v”)应该位于“-i”之后,因为它是一个输出选项。 (2认同)

小智 5

与 user225366 一样,-t 选项不适用于短视频,但适用于较长的视频。对于短视频,似乎 -frames:v 更好。这对我有用。

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4
Run Code Online (Sandbox Code Playgroud)

如果视频有音频,则需要添加 -acodec 副本,如其他答案所示。