如何将 -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)
如果谁有更方便的方法,请告诉我,谢谢!
是否有任何方法可以将 -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)
如果谁有更方便的方法,请告诉我,谢谢!