【发布时间】:2019-02-21 00:14:25
【问题描述】:
我目前正在编写一些从视频文件中读取的 C++ 代码,将视频/音频流解析为其组成单元(例如 FLV tag)并将其发送回以“重新流式传输”它。
因为我的输入来自文件,但我想在重新流式传输此数据时模拟适当的帧速率,所以我正在考虑我可能会休眠在文件上执行 read 的线程以尝试提取以通常 30 或 60 FPS 的给定速率帧。
一种解决方案是使用明显的 std::this_thread::sleep_for 调用并根据我的 FPS 传递毫秒数。我正在考虑的另一个解决方案是使用条件变量,并以相同的想法使用std::condition_variable::wait_for。
我有点卡住了,因为我知道第一个解决方案不能保证精确的精度——只要我传入的参数,睡眠就会持续一段时间,但理论上可能会更长。而且我知道std::condition_variable::wait_for 调用将需要重新获取锁,这也需要一些时间。有比我正在考虑的更好的解决方案吗?否则,尝试以尽可能精确的粒度暂停执行的最佳方法是什么?
【问题讨论】:
-
比以精确粒度暂停执行更重要的是正确计算暂停多长时间。
-
使用absolute计时:stackoverflow.com/a/47964169/3807729
-
以固定频率运行线程在游戏中很常见,例如“物理引擎”。对于 Windows,它是通过结合睡眠和轮询高频计时器来完成的。这是example fixed frequency thread Windows code 的链接。示例代码被编写为尽可能接近固定频率运行,没有漂移,(延迟基于高频定时器的一次性读数)。我认为 Linux 也有类似的东西。