Qt Video Recorder

Qt Video Recorder

本文关键字:Recorder Video Qt      更新时间:2023-10-16

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

我将计时器的信号timeout()连接到我的自定义插槽,该插槽获取快照并将其保存到我的tmp文件夹中。计时器的间隔为1000/30。应该是每秒30次。但是1000/30比33毫秒多一点,所以我真的不能达到30帧/秒。它有点多。

我用录音机录制了一段youtube视频,一切都很顺利,但根据间隔的不同,速度会快一点/慢一点。

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

  1. 启动捕获时启动QElapsedTimer。

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

  3. 请致电QElapsedTimer上的elapsed()。将此值称为current_timestamp

  4. 调用静态函数QTimer::singleShot()next_timestamp - current_timestamp休眠。再次将插槽参数设置为快照插槽。请注意,如果睡眠时间为<=0,你落后了;你的系统跟不上这么快捕捉的负荷。

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