Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Как задать количество FPS в исходном фильтре?


Автор: Teran 27.11.2007, 03:40
Есть исходный фильтр получения скринов с экрана.
Никто не знает Как можно задать колличество FPS в этом фильтре? -  smile 
т.е. Мне наобходимо чтобы функция FillBuffer вызывалась например 3 раза в секунду (3 FPS)

Автор: sandland 2.12.2007, 02:15
ну по логике как считается FPS...есть счетчик, который прибавляется +1 с каждым обновлением сцены,с каждой пройденной секундой значению FPS присваивается значение счетчика, и счетчик начинает крутиться заного...так вот ты можешь ввести доп. переменную, считающую милисекунды...когда счетчик равен 1/3 секунды - запускаем ф-цию и обнуляем сам счетчик...

я так делаю, скорее всего можно как-то еще проще.
 

Автор: Teran 4.12.2007, 10:25
Цитата(sandland @  2.12.2007,  02:15 Найти цитируемый пост)
ну по логике как считается FPS...есть счетчик, который прибавляется +1 с каждым обновлением сцены,с каждой пройденной секундой значению FPS присваивается значение счетчика, и счетчик начинает крутиться заного...так вот ты можешь ввести доп. переменную, считающую милисекунды...когда счетчик равен 1/3 секунды - запускаем ф-цию и обнуляем сам счетчик...
я так делаю, скорее всего можно как-то еще проще.

Можеш показать небольшой примерчик.... Просто не понял что значит "Запускаеш функцию" - ведь функция FillBufer запускается автоматически.



Я думал что в исходном фильтре Fps задается иначе - а именно значением параметров для функции:
Код

REFERENCE_TIME m_rtLastTime;
.....
HRESULT CMySourceStream::FillBuffer(IMediaSample *pSample)
{
    REFERENCE_TIME rtNow;
    //REFERENCE_TIME avgFrameTime = ((VIDEOINFOHEADER*)m_mt.pbFormat)->AvgTimePerFrame;
    rtNow = m_rtLastTime;
    m_rtLastTime+=10000000 / 20;  //20 FPS
    ...........................
    pSample->SetTime(&rtNow, &m_rtLastTime);
    pSample->SetSyncPoint(TRUE);
    return NOERROR;
}

Но только в таком случаи тоже почемуто не получается - Avi файл записанный например 30секунд  -  проигрывается всего за 10секунд (видео как будто ускоренное) 
непойму что происходит??? - судя повсему выпадают кадры когда процессор не успевает

Автор: sandland 4.12.2007, 23:05
я пишу на OpenGL...к примеру есть ф-ция, которая выполняется у тебя неприрывно с некоторым FPS так сказать, зависит от параметров процессора...

double time=0;
void display(void)
{
time+=0.001;
// что-нибудь рисуем на экране..пусть тут даже ф-ции прорисовки всей сцены...к примеру drawScene();
glutSwapBuffers();
}

где параметр time - это какой-то счетчик анимации...ты же можешь замедилть или ускорить анимацию...к примеру прибавляя к нему не 0.001 а 0.002 и тогда скорость анимации возрастет...ну само собой предполагается к примеру поворот на n градусов, где n=n(t);

я делал так...задал константу real_fps - количество FPS которе мне нужно чтобы было всегда...не зависимо от процессора или размера окна....
считал текущий FPS каждую секнду...и скорость анимации умножал на отношение FPS и real_FPS тем самым ф-ция сама замедляла или ускоряла анимацию в зависимости от текущего FPS...в моем тетрисе меня такой вариант вполне устроил, но с точки зрения правильности, я не думаю, что это лучший вариант, с радостью бы послушал советы более опытных...

если надо, могу тетрис скинуть.

Автор: Teran 5.12.2007, 12:39
Цитата(sandland @  4.12.2007,  23:05 Найти цитируемый пост)
я пишу на OpenGL...к примеру есть ф-ция, которая выполняется у тебя неприрывно с некоторым FPS так сказать, зависит от параметров процессора...

Спасиб за ответ....
Но в DirectShow все подругому.... 
Интересно на форуме есть люди которые сталкивались и Исходными фильтрами под DirectShow???

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)