赞
踩
https://trac.ffmpeg.org/wiki/Seeking
如果只需要提取输入的特定部分,需要使用seeking选项来获取输入中的特定部分。参数-ss用于在输入中查找,它可以以几种方式使用。
-ss 参数在-i之前指定时:
-i 后面跟输入资源的路径
-frames:v 25 指定输出的帧数
ffmpeg -ss 00:23:00 -i Mononoke.Hime.mkv -frames:v 1 out1.jpg
这个示例将在影片开始的第23分钟生成一个图像帧(out1.jpg)。
输入将使用关键帧进行解析,这非常快。
从FFmpeg 2.1版本开始,当使用FFmpeg进行转码(即:不仅是流复制)时,-ss现在也是“帧精确”的,即使用-ss作输入选项。
之前的行为(即使不精确,也只搜索最近的关键帧)可以通过-noaccurate_seek选项恢复。
-ss参数在-i后面指定时:
ffmpeg -i Mononoke.Hime.mkv -ss 00:23:00 -frames:v 1 out2.jpg
这个示例也是在电影将开始的第23分钟生成一个图像帧(out2.jpg)。
此时,输入将被解码(并且丢弃掉),一直到-ss给出的时间位置为止。
这个过程会很慢,一帧接着一帧。
从 FFmpeg 2.1 开始,主要优点是在对输出流应用过滤器时,时间戳不会在过滤之前重置(即,在将字幕刻录到视频中时,您不需要修改字幕时间戳),但是缺点是最终到达那个时间点则需要很长时间。
寻找的时间越长,等待的时间就越长。
这回,我们在-i之前和-i之后都指定-ss参数:
ffmpeg -ss 00:22:30 -i Mononoke.Hime.mkv -ss 00:00:30 -frames:v 1 out3.jpg
从 FFmpeg 2.1 开始,组合搜索仍然是可能的,但我还没有找到有效的用例,因为 -ss 作为输入选项既快速又准确。
这种方法使用关键帧查找到00:22:30,然后再逐帧查找直到00:23:00 (00:22:30 + 00:00:30)
请注意,由前面的命令创建的所有图像都应该是相同的。
如何正确地为-ss选项设置两个时间点,还没有通用的规则,因为这些时间点取决于输入编码时使用的关键帧间隔。
但是为了提供一些方向,x264编码器在默认情况下使用GOP大小为250(如果输入帧速率为 25 fps,这意味着每 10 秒 1 个关键帧)。
当在电影中间只提取一小段,可以与-t组合使用,-t指定持续时间,
如-ss 60 -t 10捕捉60到70秒。
或者您可以使用 -to 选项 指定一个出点,如 -ss 60 -to 70 从第二个 60 到 70 捕获。-t 和 -to 是互斥的。 如果两者都使用,将使用 -t。
请注意,如果只在-i之前指定-ss,时间戳将被重置为零,因此-t和-to将具有相同的效果。若保留原始的时间戳,请添加 -copyts 选项。
ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy cut.mp4
ffmpeg -i video.mp4 -ss 00:01:00 -to 00:02:00 -c copy cut.mp4
ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4
第一个命令将从 00:01:00 截取到 00:03:00(原始),使用更快的搜索。
第二个命令将从 00:01:00 截取到 00:02:00,使用较慢的搜索。
第三个命令将从 00:01:00 截取到 00:02:00。使用更快的搜索。保留原始时间戳。
如果您使用流复制(-c copy
)进行剪切,如果您想将该段与 concat demuxer 一起使用,则需要使用 -avoid_negative_ts 1
选项。
举例:
ffmpeg -ss 00:03:00 -i video.mp4 -t 60 -c copy -avoid_negative_ts 1 cut.mp4
如果你必须要重新编码,例如,应用滤镜如阴影,这可能会非常慢,请确保使用,例如 -ss 120 -i some Mov - 60
从120秒到120+60秒的一分钟,不是-to 180
不是从120秒到180分钟的三分钟。
请注意,您可以使用两种不同的时间单位格式:
六十进制(HOURS:MM:SS. MILLISECONDS,如 01:23:45.678)或以秒为单位。 如果使用分数,例如 02:30.05,这将被解释为“5个百分之一秒”,而不是第 5 帧。例如,02:30.5 将是 2 分 30 秒半秒,即 将与在几秒钟内使用 150.5 相同。
使用 -ss
作为输入选项和 -c:v copy
可能不准确,因为 ffmpeg 被强制在 i-frames 上只使用/只拆分。
尽管它会(如果可能的话)将流的开始时间调整为负值来弥补这一点。
基本上,如果您指定“第 157 秒”并且在第 159 秒之前没有关键帧,它将在开始时包含2秒的音频(没有视频),然后从第一个关键帧开始。 因此,在拆分和进行编解码器复制时要小心。
https://www.bilibili.com/read/cv630416/
https://www.cnblogs.com/codecjia/p/15191118.html
https://blog.csdn.net/liuchen1206/article/details/79461434
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。