我一直在使用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周期忙于等待。