使用 FFmpeg 获取给定时间戳之前的关键帧的时间戳

使用 FFmpeg 获取给定时间戳之前的关键帧的时间戳

我想剪切视频文件的长片段,然后将它们连接起来。但是如果不重新编码,就无法进行精确剪切,因为 ffmpeg 会寻找我列出的时间戳之前的关键帧并从该关键帧剪切,或者在某些情况下从该关键帧剪切并使用某种表格按预期播放视频。当我连接这些剪切片段时,连接的文件会显示那些不需要的部分,我猜是因为无法进行连接。这就是我尝试连接这些片段的方法:

ffmpeg -f concat -i Cam01.txt -c copy Cam01.mp4

为了通过较少的重新编码解决这个问题,我考虑将视频分成两部分;首先从头到尾剪切而不进行重新编码,这样速度会更快,然后在第二部分中从关键帧重新编码到我想要的帧,这将需要几秒钟,然后将这两部分合并起来得到我的片段。

我现在有两个问题:

1:如何获取任何时间戳之前的关键帧的时间戳?

2:我在连接片段时是否存在问题,以至于在某些情况下会在连接的文件中显示那些不需要的部分?

或者,如果无法在任何时间戳之前到达关键帧,我可以通过某种方式获取输入时间范围内关键帧的时间戳。

答案1

对于 1. 你可以使用

 ffprobe -select_streams v -show_frames youfile.mp4

为了获取帧列表,关键帧将标有“key_frame=1”及其时间戳,以便您可以解析它以找到最近的关键帧。

对于 2. 你将它们连接得很好,我在使用 concat muxer 生成的流中快速搜索(-ss 之前 -i)时遇到了类似的问题,最后我只是计算了在 ffmpeg 之外使用哪些段,然后忍受慢速搜索(-ss 之后 -i)

相关内容