如何使用 ffmpeg 推断并叠加具有重复帧的视频的可变帧率?

如何使用 ffmpeg 推断并叠加具有重复帧的视频的可变帧率?

我有一个无损游戏视频录制,没有画面撕裂。视频本身的帧速率恒定为 60fps,但由于我们正在调试的性能问题,游戏帧速率在 20-30 fps 之间变化。我们可以在游戏中叠加 FPS 计数器,但这会影响性能,并且无法准确反映真正可实现的帧速率。有没有办法改用 ffmpeg 从视频文件中的重复帧中推断出帧速率,并生成一个叠加了推断出的帧速率或帧时间的新视频文件?

我从一些研究中发现,这ffmpeg -i lossless.mkv -vf "mpdecimate=hi=0:lo=0:frac=0" -loglevel debug -f null -将正确打印出所有重复帧的列表,但这不是很有用,可能需要复杂的脚本才能转换为所需的结果。如果有一种方法可以先通过组合重复帧将视频转换为可变帧速率,然后将此帧速率叠加在视频上,那就更理想了。

在我的测试中我尝试了以下命令组合:

  • ffmpeg -i lossless.mkv -vf "mpdecimate=hi=0:lo=0:frac=0" -vsync vfr -r 60 -c:v libx264 -preset medium -crf 0 -c:a copy lossless-vfr.mkv
  • ffmpeg -i lossless-vfr.mkv -vsync vfr -r 60 -vf "drawtext=fontfile='C\:\\Windows\\Fonts\\arial.ttf':x=10:y=10:fontsize=20:fontcolor=white:text='frametime\=%{expr\:pkt_duration}'" -c:v libx264 -preset medium -crf 0 -c:a copy lossless-fps.mkv

但是,尽管帧速率可变,但显示的帧时间在叠加层中始终显示相同的值 0.016000。如果我运行,ffprobe -show_frames lossless-vfr.mkv我会发现该pkt_duration_time值确实会因帧而异,因此在绘制文本叠加层时获得恒定值很奇怪。如何获得可变帧速率的精确叠加层?

相关内容