Qt录像机

时间:2014-05-11 14:16:46

标签: c++ qt video ffmpeg

我正在尝试使用Qt创建录像机。到目前为止我所做的是在屏幕上截取一个矩形的截图并保存。最后,我使用ffmpeg从图像中获取视频文件。

我将计时器的信号timeout()连接到我的自定义插槽,该插槽拍摄快照并将其保存到我的tmp文件夹中。计时器的间隔为1000 / 30.这应该是每秒30次。但是1000/30有点超过33毫秒,所以我无法真正获得30 fps。还有一点。

我用录音机录制了一个YouTube视频,一切都很流畅但速度稍快/慢一些,具体取决于intervall。

所以我的问题基本上是如何获得真正的30/40/50 / ... fps?

1 个答案:

答案 0 :(得分:1)

  1. 开始捕获时启动QElapsedTimer

  2. 完成捕获帧后(在快照槽的末尾),将 next 帧编号乘以近似帧持续时间(双精度浮点值),以毫秒为单位(例如,对于30 fps,它是~33.33333333333,但不写 - 写(double)1000/30)。请将此值next_timestamp

  3. 调用
  4. 在QElapsedTimer上调用elapsed()。请将此值current_timestamp

  5. 调用
  6. 调用静态函数QTimer::singleShot()next_timestamp - current_timestamp休眠。再次将slot参数设置为快照槽。请注意,如果睡眠时间<= 0,那么你就会落后;你的系统无法跟上快速捕获的负担。

  7. QTimer::singleShot()触发时,将再次调用您的快照槽,并在计时中出现一些错误。但是,在非实时操作系统(如Windows和Unix(OS X / Linux /等))下,此错误是不可避免的。这是因为您无法决定何时执行代码 - 操作系统内核可以执行。但是,平均而言,你最终会得到每秒30帧(假设你的计算机可以跟上负载!),因为QElapsedTimer报告的时间过长会非常准确,如果系统落后,它将会更快地捕获帧,如果它超前,它将更慢地捕获帧。