FFmpeg Seeking 核心要点与使用

Ref: https://trac.ffmpeg.org/wiki/Seeking

介绍

如果你需要提取只有你输入的特定部分,你需要使用seeking选项来获得在输入第一个特定组成部分。该参数-ss用于输入内seeking,它可以用来在多个地方。

输入seeking

-ss参数需要在某处指定之前-i

ffmpeg -ss 00:23:00 -i Mononoke.Hime.mkv -frames:v 1 out1.jpg

“使用 FFmpeg seeking”的示例输出。

此示例将在电影开始的第 23 分钟生成一个图像帧 (out1.jpg)。输入将使用关键帧解析,这非常快。从 FFmpeg 2.1 开始,当使用ffmpeg(即不仅仅是流复制)进行转码时,-ss即使用作输入选项,现在也是“帧精确”。可以使用该-noaccurate_seek选项恢复以前的行为(仅寻找最近的前一个关键帧,即使不准确)。

输出seeking

-ss后面指定参数的需求-i

ffmpeg -i Mononoke.Hime.mkv -ss 00:23:00 -frames:v 1 out2.jpg

“使用 FFmpeg seeking”的示例输出。

此示例还将在电影开始的第 23 分钟精确生成一个图像帧 (out2.jpg)。

在这里,输入将被解码(并丢弃),直到它到达由 给出的位置-ss。这将非常缓慢地逐帧完成 。由于FFmpeg的2.1,主要优点是应用过滤器到输出流时,时间戳不重置过滤(即当前烧字幕成视频,你并不需要修改字幕时间戳),但缺点是需要很长时间才能最终到达该时间点。寻道时间越长,等待的时间就越长。

联合seeking

为此,我们指定-ssbefore 和 after 参数-i

ffmpeg -ss 00:22:30 -i Mononoke.Hime.mkv -ss 00:00:30 -frames:v 1 out3.jpg

“使用 FFmpeg seeking”的示例输出。

从 FFmpeg 2.1 开始,组合seeking仍然是可能的,但我还没有找到有效的用例,因为-ss作为输入选项现在既快速又准确。

这种方法使用关键帧seeking直到 00:22:30,然后逐帧seeking直到到达 00:23:00 (00:22:30 + 00:00:30)

请注意,由前面的命令创建的所有图像都应该相同。

关于如何正确设置-ss选项的两个时间点没有一般规则,因为这些取决于输入编码时使用的关键帧间隔。为了提供一些方向,默认情况下 x264 编码器使用 250 的 GOP 大小(如果输入帧速率为 25 fps,这意味着每 10 秒有 1 个关键帧)。

笔记

切割一小段

只提取电影中间的一小段,可以和-twhich指定时长结合使用,比如-ss 60 -t 10从60秒到70秒捕获。或者你可以使用-to选项指定一个出点,比如-ss 60 -to 70从第二个 60 到 70。-t并且-to是相互排斥的。如果同时使用,-t将使用。

请注意,如果您只-ss在之前指定-i,时间戳将重置为零,因此-t-to将具有相同的效果。如果要保留原始时间戳,请添加该-copyts选项。

第一个命令将从 00:01:00 剪切到 00:03:00(在原始中),使用更快的seeking。
第二个命令将按照预期从 00:01:00 剪切到 00:02:00,使用较慢的seeking。
第三个命令将按照预期从 00:01:00 剪切到 00:02:00,使用更快的seeking。

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

如果你切断与流拷贝(-c copy),您需要使用-avoid_negative_ts 1个选项,如果你想使用该段与[CONCAT分路器](https://trac.ffmpeg.org/wiki/How to concatenate (join, merge) media files#demuxer)。

例子:

ffmpeg -ss 00:03:00 -i video.mp4 -t 60 -c copy -avoid_negative_ts 1 cut.mp4

如果您无论如何都必须重新编码,例如应用像afade这样的过滤器,这可能会很慢,请确保使用,例如,-ss 120 -i some.mov -to 60从 120 秒到 120+60 秒获得一分钟,而不是从 120 秒-to 180开始的三分钟。

时间单位语法

请注意,您可以使用两种不同的时间单位格式:六十进制(HOURS:MM:SS.MILLISECONDS,如 in 01:23:45.678)或以秒为单位。如果使用分数,例如02:30.05,则将其解释为“5 100ths of a second”,而不是第 5 帧。例如,02:30.5将是 2 分 30 秒和半秒,这与使用相同150.5片刻之间。

在进行编解码器复制时寻找

使用-ss加上作为输入的选项-c:v copy,因为可能不准确ffmpeg被迫起用/分在I帧。尽管它会(如果可能的话)将流的开始时间调整为负值以对此进行补偿。基本上,如果您指定“second 157”并且在第二个 159 之前没有关键帧,它将在开始时包含两秒的音频(没有视频),然后将从第一个关键帧开始。所以在拆分和进行编解码器复制时要小心。

最后修改于 10 个月前

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开源技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值