如何将 -ss 行为从位置之前的最近搜索点更改为位置之后的最近搜索点

How to change the -ss behavior from closest seek point before position to closest seek point after position

是否有任何方法可以将 -ss 行为从位置之前的最近搜索点更改为位置之后的最近搜索点?

示例:

ffmpeg 有能力从 98 秒或 102 秒到 select 搜索点 in.mp4

如果我使用以下命令,ffmpeg 将 select 98 秒作为搜索点。

ffmpeg -ss 100 -i in.mp4 -c copy out.mp4

有什么方法可以添加一些选项,但保留 -ss 100 使 ffmpeg 以 select 和 102 作为搜索点?

最后,我使用 shell 脚本和 ffprobe 来实现我的目标。

因为ffmpeg -ss T会select时间T之前最近的关键帧,所以我需要使用ffprobe来获取时间 T.

后的下一个关键帧

ffprobe参考命令:

ffprobe -skip_frame nokey -select_streams v -show_frames -show_entries frame=pkt_pts_time -of csv -read_intervals T+30

以上命令将显示从开始到 T+30 的关键帧时间戳。 所以我只需要使用 bash 脚本进行一些字符串处理来获得大于时间 T 的最小时间戳。 并且不要忘记将 1 添加到下一个关键帧,将它用作 -ss 参数和 ffmpeg

我的详细bash脚本:

option="-skip_frame nokey -select_streams v -show_frames -show_entries frame=pkt_pts_time -of csv -read_intervals"
tg_file="test.mp4"
st_time=
probe_time=`expr $st_time + 20`
kf_arr=(`ffprobe ${option} %${probe_time} ${tg_file} | sed 's/.\+,//g'`)

for i in ${kf_arr[@]}
do
    if (( $(echo "$i > ${st_time}" | tr -d $'\r' | bc -l) )); then
        kf=${i%.*}
        st=`expr $kf + 1`
        break
    fi
done

</code>: 预计开始时间</p> <p><code>tr -d $'\r':去除Windows系统中的换行符。 (如果你用Linux可以忽略)

$st:新时间戳(下一个关键帧时间戳+预期开始时间后的1)

如果谁有更方便的方法,请告诉我,谢谢!