gpt4 book ai didi

c++ - Qt 录像机

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:22:43 34 4
gpt4 key购买 nike

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

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

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

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

最佳答案

  1. 开始 QElapsedTimer当您开始捕获时。

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

  3. 调用elapsed()在你的 QElapsedTimer 上。将此值称为 current_timestamp

  4. 调用静态函数QTimer::singleShot()休眠 next_timestamp - current_timestamp。再次将插槽参数设置为您的快照插槽。请注意,如果 sleep 时间<= 0,则说明您落后了;您的系统跟不上如此快速的捕获负载。

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

关于c++ - Qt 录像机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23593685/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com