窗户上使用C 11的睡眠不准确



我一直在使用C 11睡眠来给出视频帧之间的间隔。我一直使用的这种方法使Windows上的播放拉长。

#include <iostream>
#include <thread>
#include <sstream>

int main(const int argc, const char **args)
{
    std::stringstream sb;
    if(argc < 2)
        return 1;
    int fps = 0;
    sb << args[1];
    sb >> fps;
    if(fps <= 0)
        return 1;
    int i;

    while(true)
    {
        std::chrono::high_resolution_clock::time_point start, end;
        start = std::chrono::high_resolution_clock::now();
        for(i=0; i<fps; ++i)
        {
            std::this_thread::sleep_for(std::chrono::microseconds(1000000 / fps));
        }
        end = std::chrono::high_resolution_clock::now();
        auto c = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
        std::cerr << c << std::endl;
    }
    return 0;
}

使用60运行该程序的Linux上约为1004〜1006,Windows上的1065〜1075。因此,我猜想,播放了2小时的视频后,超过一分钟的时间不仅仅2小时。

timeBeginPeriod()无效。使用计时器(像这样吗?)是在Windows上实现媒体播放器的唯一方法吗?在Linux上呢?考虑到FFPlay使用av_usleep()

,我认为这是正确的方法

太可悲了,没有便携式方法。

使用计时器(像这样吗?)是在...

上实现媒体播放器的唯一方法

使用高精度计时器(例如链接的计时器)是一个选项。另一个(但不好)的选择是浪费CPU周期忙于等待。

最新更新