0
我一直在使用C++ 11 sleep來給出視頻幀之間的間隔。我一直使用的這種方法使得播放在Windows上延長。在Windows上使用C++ 11的不準確睡眠
#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()
沒有效果。是否使用計時器(如此one?)是在Windows上實現媒體播放器的唯一方式?在Linux上怎麼樣?我認爲這是考慮到ffplay使用av_usleep()
的正確方法。
很傷心,沒有便攜的方式。
*在Windows *上實現媒體播放器的唯一方法是,不,例如,我們有一個自定義媒體播放器需要幀校正,所以不要使用定時器/睡眠,而只需依靠渲染器的同步垂直刷新。順便說一句,也可以在文檔中看到第一句話:http://en.cppreference.com/w/cpp/thread/sleep_for – stijn