使用 FFmpeg 从图像中查找视频中的某一帧

使用 FFmpeg 从图像中查找视频中的某一帧

我有一个 30 秒的小视频,是从 10 小时长的长视频中截取并经过处理的。我试图在 10 小时长的长视频中找到 30 秒视频中第一帧的位置。由于小视频已经过处理,因此无法对帧进行校验,因此我尝试将第一帧保存为图像,

ffmpeg -i clip.mp4 -qmin 1 -qscale:v 1 -vframes 1 -f image2 firstframe.jpg

然后使用该图像进行搜索,如下所示:

ffmpeg -i original_stream.ts -loop 1 -i firstframe.jpg -an -filter_complex "blend=difference:shortest=1,blackframe=99:32" -f null -

这有时会有效,但有时无论blackframe我使用什么,它都会返回超过 1 帧。

此外,如果我尝试-ss跳过部分流,它不会返回精确的时间。例如,

  1. 没有-ss
    [Parsed_blackframe_1] frame:44250 pblack:99 pts:66375000 t:737.500000 type:P last_keyframe:44160
    
  2. -ss 735
    [Parsed_blackframe_1] frame:90 pblack:99 pts:227820 t:2.531333 type:P last_keyframe:0
    
  3. 上述两个示例中的时间不一致。由于t示例 #1 中的时间是737.500000,因此我预计t示例 #2 中的时间是2.500000,而不是2.531333
    737.500000-735=2.500000
    
  4. 还,735 x 90000 + 227820 ≠ 66375000

我认为我可以使用帧号,因为它似乎是最准确的。

我这样做的原因是从原始流中提取与 30 秒剪辑匹配的精确音频,因此我需要精确的位置。

答案1

input_video.mp4 是要从中提取帧的视频文件的名称。output_frame.png 是要为提取的帧指定的名称。3 是要提取的帧编号。您可以将此数字更改为所需的帧。确保从 0 开始计数,因此第一帧为 0,第二帧为 1,依此类推。

谢谢,Dealsdepot

相关内容