2017-02-15 59 views
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()的正確方法。

很傷心,沒有便攜的方式。

+0

*在Windows *上實現媒體播放器的唯一方法是,不,例如,我們有一個自定義媒體播放器需要幀校正,所以不要使用定時器/睡眠,而只需依靠渲染器的同步垂直刷新。順便說一句,也可以在文檔中看到第一句話:http://en.cppreference.com/w/cpp/thread/sleep_for – stijn

回答

0

是使用定時器(像這樣的?)是實現對媒體播放器的唯一途徑...

使用高精度計時器,如連接的一種,是一種選擇。另一個(但不好的)選項是在繁忙的等待中浪費CPU週期。