如何使用FFmpeg从TS文件的指定帧索引中提取PTS(时间戳)?
如何使用FFmpeg从TS文件的指定帧索引中提取PTS(时间戳)?
嘿,我来帮你搞定这个问题!你原来的命令有几个小问题,导致没有输出,咱们一步步修正过来:
首先,你的命令里混用了一些更适配ffprobe的参数,而且select滤镜的逻辑可以更精准——你要的是特定索引的单帧,而不是从该索引开始的所有帧。另外FFmpeg的参数顺序很关键,输出相关的参数得放在正确位置。
方法1:用FFmpeg直接提取(适合快速验证)
调整后的命令会精准选中目标帧,只输出它的PTS时间:
ffmpeg -i 0.ts -vf "select=eq(n\,5)" -vframes 1 -show_entries frame=pkt_pts_time -v quiet -of csv=p=0
关键改动说明:
eq(n\,5):n代表帧索引(从0开始计数),eq表示只选中索引等于5的帧,比你原来用的gte更精准,不会输出后续多余帧-vframes 1:告诉FFmpeg只处理1帧,避免不必要的计算- 去掉了
output.txt、-stats、-y这些无关参数,直接把结果输出到控制台;如果要保存到文件,在命令末尾加> output.txt即可
运行后你会得到类似15.000000的纯数字结果,完全符合你要的简洁输出形式。
方法2:用ffprobe提取(更高效,推荐)
其实用ffprobe来提取帧元数据会更直接,不需要解码整个视频,大文件场景下速度快很多:
ffprobe -i 0.ts -select_streams v:0 -show_entries frame=pkt_pts_time,frame_index -v quiet -of csv=p=0 | grep ",5$" | cut -d',' -f1
逻辑拆解:
-select_streams v:0:指定只处理视频流,避免音频流的干扰-show_entries frame=pkt_pts_time,frame_index:同时输出帧索引和对应的PTS时间- 用
grep ",5$"筛选出索引为5的那一行,再用cut提取出PTS时间部分
同样能得到你需要的纯数字结果,性能表现更优。
最后提醒下:帧索引是从0开始计数的!如果你要的是第6帧(从1开始数),那索引就是5,和你原来的设置一致;如果是第5帧(从1数),记得把数字改成4哦。
备注:内容来源于stack exchange,提问作者Aven




