You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何单次执行命令获取ffprobe输出的I帧时间戳中间值(偶数行取首)

问题:提取视频I帧时间戳的中间值

现有命令可列出视频文件中I帧的时间戳:

ffprobe -i ./test.mp4 -v quiet -skip_frame nokey -select_streams v:0 -of flat -show_entries frame=pkt_pts_time | awk -F'=' '{gsub(/"/, "", $NF); print $NF}'

输出示例:

0.066667
2.066667
4.066667
9.066667
14.066667
19.066667
24.066667

需求:获取输出的中间值(如示例中的9.066667);若输出行数为偶数(比如仅2行),取第一个中间值。此前通过wc统计行数结合sed提取的方法需要重复执行命令,希望找到无需重复执行的管道实现方式。


解决方案

可以通过awk一次性完成数据收集、中间值计算和输出,无需重复调用ffprobe:

ffprobe -i ./test.mp4 -v quiet -skip_frame nokey -select_streams v:0 -of flat -show_entries frame=pkt_pts_time | awk -F'=' '{gsub(/"/, "", $NF); arr[NR] = $NF} END {n = NR; print (n % 2 == 1) ? arr[int(n/2)+1] : arr[int(n/2)]}'

工作原理

  • 遍历输出时,将每一行的时间戳存入数组arr,用行号NR作为数组索引
  • 在处理完所有行后的END块中,获取总行数n
  • 若行数为奇数,取第int(n/2)+1个元素(7行时对应第4个元素,即示例中的9.066667)
  • 若行数为偶数,取第int(n/2)个元素(2行时对应第1个元素,即第一个中间值)

这种方式只需要执行一次ffprobe,避免了重复执行带来的性能损耗。

内容的提问来源于stack exchange,提问作者Kishore T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 21:25:27