我正在尝试使用Qt创建录像机。到目前为止我所做的是在屏幕上截取一个矩形的截图并保存。最后,我使用ffmpeg从图像中获取视频文件。
我将计时器的信号timeout()
连接到我的自定义插槽,该插槽拍摄快照并将其保存到我的tmp文件夹中。计时器的间隔为1000 / 30.这应该是每秒30次。但是1000/30有点超过33毫秒,所以我无法真正获得30 fps。还有一点。
我用录音机录制了一个YouTube视频,一切都很流畅但速度稍快/慢一些,具体取决于intervall。
所以我的问题基本上是如何获得真正的30/40/50 / ... fps?
答案 0 :(得分:1)
开始捕获时启动QElapsedTimer。
完成捕获帧后(在快照槽的末尾),将 next 帧编号乘以近似帧持续时间(双精度浮点值),以毫秒为单位(例如,对于30 fps,它是~33.33333333333
,但不写 - 写(double)1000/30
)。请将此值next_timestamp
。
在QElapsedTimer上调用elapsed()
。请将此值current_timestamp
。
调用静态函数QTimer::singleShot()
为next_timestamp - current_timestamp
休眠。再次将slot参数设置为快照槽。请注意,如果睡眠时间<= 0,那么你就会落后;你的系统无法跟上快速捕获的负担。
当QTimer::singleShot()
触发时,将再次调用您的快照槽,并在计时中出现一些错误。但是,在非实时操作系统(如Windows和Unix(OS X / Linux /等))下,此错误是不可避免的。这是因为您无法决定何时执行代码 - 操作系统内核可以执行。但是,平均而言,你最终会得到每秒30帧(假设你的计算机可以跟上负载!),因为QElapsedTimer报告的时间过长会非常准确,如果系统落后,它将会更快地捕获帧,如果它超前,它将更慢地捕获帧。