如何单次执行命令获取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
相关产品推荐
相关产品推荐

