使用 FFmpeg 从视频文件中从起始位置到结束位置剪切部分

使用 FFmpeg 从视频文件中从起始位置到结束位置剪切部分

我有一个30分钟的视频文件,但我想提取从00:09:23到00:25:33的视频。

我可以用 定义起始位置-ss,但找不到终止位置。有什么可以帮忙的吗?

答案1

安装 ffmpeg

确保你下载最新版本的ffmpeg,不要使用发行版自带的版本(例如 Ubuntu)。各种发行版的打包版本通常都已过时,并且无法按预期运行。

或者自己编译。在 macOS 下,您可以使用 Homebrewbrew install ffmpeg

如何剪辑视频,无需重新编码

使用此功能可剪切视频[start][duration]

ffmpeg -ss [start] -i in.mp4 -t [duration] -map 0 -c copy out.mp4

使用此功能将视频从 剪切[start][end]

ffmpeg -copyts -ss [start] -i in.mp4 -to [end] -map 0 -c copy out.mp4

解释选项

各选项含义如下:

  • -ss指定开始时间,例如00:01:23.00083(以秒为单位)
  • -t指定剪辑的持续时间。时间的格式相同。
  • 你也-t可以使用-to,指定结束时间。
  • -map 0 映射所有流、音频、视频和字幕

您必须了解,通常情况下,会将输入视频的时间戳在剪切点后重置为 0,因此默认情况下,使用或-ss都没有关系。如果您想-t-to-ss不是将时间戳重置为0,-copyts可以使用该选项。这使得-to行为更加直观。

例如:

ffmpeg -ss 5 -i in.mp4 -t 30 -map 0 -c copy out.mp4

这将使输入向前移动 5 秒并生成 30 秒长的输出文件。换句话说,您将获得输入视频的 5 到 35 秒部分。

或者:

ffmpeg -ss 5 -i in.mp4 -to 30 -map 0 -c copy out.mp4

这与上面的效果相同,因为在输入中搜索 5 秒后时间戳会重置为 0。输出仍为 30 秒长。

如果我们改用-copyts,并且我们想要 5 到 35 秒之间的部分,我们应该使用:

ffmpeg -copyts -ss 5 -i in.mp4 -to 35 -map 0 -c copy out.mp4

最后,我们使用了该-c copy选项。-c copy将第一个视频、音频和字幕比特流从输入复制到输出文件而不重新编码。这不会损害质量并使命令在几秒钟内运行。

有关寻求的更多信息,请参阅https://trac.ffmpeg.org/wiki/Seeking

如何剪切视频并重新编码

有时,使用-c copy会导致某些播放器无法处理的输出文件(它们会显示黑框或出现音频-视频同步错误)。

如果您忽略该-c copy选项,ffmpeg将根据您选择的格式自动重新编码输出视频和音频。如需高质量视频和音频,请阅读x264 编码指南AAC 编码指南, 分别。

例如:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c:v libx264 -crf 23 -c:a aac -b:a 192k out.mp4

您可以更改 CRF 和音频比特率参数来改变输出质量。CRF 越低,质量越好,反之亦然。合理的值介于 18 到 28 之间。

答案2

我认为您现在可以使用以下命令。

ffmpeg -i inputFile -vcodec copy -acodec copy -ss 00:09:23 -to 00:25:33 outputFile

也看看ffmpeg 文档, 或者此维基页面

答案3

奇怪的是,没有人建议trim 筛选

删除除第二分钟的输入之外的所有内容:

ffmpeg -i INPUT -vf trim=60:120

仅保留第一秒:

ffmpeg -i INPUT -vf trim=duration=1

删除除第 13 秒到第 58 秒之外的所有内容:

ffmpeg -i INPUT -vf trim=13:58 OUTPUT

答案4

我使用以下语法通过 ffmpef 剪切视频:

ffmpeg -sameq -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile]

-t 用于设置持续时间(以秒为单位) - 您无法指定结束时间,但这应该对您有用。

相关内容