我有一个30分钟的视频文件,但我想提取从00:09:23到00:25:33的视频。
我可以用 定义起始位置-ss
,但找不到终止位置。有什么可以帮忙的吗?
答案1
安装 ffmpeg
确保你下载最新版本的ffmpeg
,不要使用发行版自带的版本(例如 Ubuntu)。各种发行版的打包版本通常都已过时,并且无法按预期运行。
或者自己编译。在 macOS 下,您可以使用 Homebrew和brew 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
解释选项
各选项含义如下:
您必须了解,通常情况下,会将输入视频的时间戳在剪切点后重置为 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
答案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 用于设置持续时间(以秒为单位) - 您无法指定结束时间,但这应该对您有用。