赞
踩
下例利用 select 过滤器,抽取了视频中的第 86 帧,保存为 extract.png:
ffmpeg -i video.mp4 -vf 'select=eq(n\,85)' -vframes 1 extract.png
帧是从0开始的,所以要写85才是对应第86帧
如果不需要特别精确,也可以用时间戳来截取:
ffmpeg -ss 00:00:04.22 -i video.mp4 -vframes 1 extract.png
下面,以想要截取 video.mp4 视频的第2到第5分钟为例。
对于容易计算片段秒数的截取任务(本例中片段长为 (5-2)*60=180秒),可以使用 -t
参数,即指定片段长度。
ffmpeg -ss 00:02:00 -i video.mp4 -t 180 cut.mp4
其中, -ss
参数指定了起始的时间戳记,而 -t
参数指定了片段长度(秒)。传递给 -t
的片段长度可以写成 00:03:00
的形式。它也可以带有小数,比如用 180.5 表示 180.5 秒。
或者,用户可以不用 -t
指定片段长度,而是用 -to
指定终止时刻。下例中把参数 -ss
与 -to
都放在了 -i
参数之前:
ffmpeg -ss 00:02:00 -to 00:05:00 -i video.mp4 cut.mp4
需要注意,在上面的例子中, 参数 -ss
均被放在了 -i
参数之前,这称为输入(inputing)参数语法;对应的时间戳检索方式称为输入检索(inputing seek)。如果放在 -i
参数之后,则称为输出(outputing)参数与输出检索。
输入检索根据关键帧来检索,而输出检索是逐帧地检索地。因此输入检索地速度会比输出检索更快。
由于关键帧定位的特性,输入检索在执行流复制操作(如 -c copy
)时定位可能并不精确;在非流复制(即重新编码)并指定了 -accurate_seek
(默认已指定)时,则无此问题。关于为何会造成定位的不精确,请参考本小节末尾的注释。
输入检索会提前将 -ss
参数指定的时间戳设置为 0;因此,如果将 -t/-to
参数放在 -i
参数之后(作为输出参数),FFmpeg 都实质将参数值当作一个片段长度(而不是终止时刻)。例如:
ffmpeg -ss 00:02:00 -i video.mp4 -t 00:05:00 cut.mp4 ffmpeg -ss 00:02:00 -i video.mp4 -to 00:05:00 cut.mp4 # 意外的结果
这两种命令的结果是一样的,都截取了第 2 到第 7 分钟;这对于使用 -to
参数的用户来说,可能是不希望看到的。因此,推荐将 -t/-to
参数一起都作为输入参数来使用。
总结
- # 任务:截取视频的第 2 至 5 分钟。
-
- # 1. 可接受起始片段前的额外内容,可能长达数秒 —— 方案 A
- # 2. 不可接受上述精度,要求精确到给定时刻最近的关键帧 —— 方案 B
- # 3. 不可接受上述精度,要求精确到给定时刻最近的帧 —— 方案 C
-
- # 根据上述问题的回答,选择合适的方案:
-
- # A) 用快速截取(输入参数),配合流复制。该方案截取速度非常快。
- ## 以 -t 参数指定片段长,或以 -to 参数指定终止时间戳
- ffmpeg -ss 00:02:00 -t 00:03:00 -i video.mp4 -c copy cut.mp4
- ffmpeg -ss 00:02:00 -to 00:05:00 -i video.mp4 -c copy cut.mp4
-
- # B) 用快速截取,但不能使用流复制,片段会被重编码。截取速度近似于编码等长视频的速度。
- ffmpeg -ss 00:02:00 -t 00:03:00 -i video.mp4 cut.mp4
- ffmpeg -ss 00:02:00 -to 00:05:00 -i video.mp4 cut.mp4
-
- # C) 用慢速截取(输出参数),片段之前的内容也会被重编码。截取速度极慢。
- ffmpeg -i video.mp4 -ss 00:02:00 -t 00:03:00 cut.mp4
- ffmpeg -i video.mp4 -ss 00:02:00 -to 00:05:00 cut.mp4
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。