Mam instancji IFilterGraph - mój własny wykres z filtrami wideo (source, transofrm i renderer). Jak mogę uzyskać bieżące fps (szybkość klatek wideo) z uruchomionego wykresu?Wykres Direct Show - jak uzyskać bieżące fps?
Pozdrowienia Dominik
Mam instancji IFilterGraph - mój własny wykres z filtrami wideo (source, transofrm i renderer). Jak mogę uzyskać bieżące fps (szybkość klatek wideo) z uruchomionego wykresu?Wykres Direct Show - jak uzyskać bieżące fps?
Pozdrowienia Dominik
Prawdopodobnie Najprostszym sposobem jest stworzenie filtra SampleGrabber z niestandardowym zwrotnego i obliczyć samodzielnie.
Patrz:
każdym razem, gdy funkcja zwrotna jest wywoływana, to otrzymaliśmy nową ramkę. Prawdopodobnie powinieneś umieścić to tuż przed rendererem.
Ponadto, w zależności od wykresu, niektóre filtry mogą zawierać informacje o liczbie klatek na sekundę, ale metoda SampleGrabber będzie działała z dowolnym wykresem.
Nie każde wideo ma stałą wartość FPS, więc użycie próbnika jest najdokładniejszą metodą, choć nie jest najłatwiejsza. Jeśli znasz format pliku wideo i masz pewność, że posiadasz stały FPS, możesz uzyskać filtr transformacji lub renderowania, uzyskać jeden z jego numerów, zadzwonić na adres IPin :: ConnectionMediaType, sprawdzić typ formatu typu multimediów, czy to FORMAT_VideoInfo, czy FORMAT_VideoInfo2 , prześlij odpowiedni wskaźnik formatu do VIDEOINFOHEADER lub VIDEOINFOHEADER2 i spójrz na pole AvgTimePerFrame.
Mam nadzieję, że to pomoże. Jest to rutyna, którą napisałem wiele księżyców temu, aby uzyskać FPS z wideo, które przesyłam strumieniowo. Działa dla różnych typów mediów, ale powinieneś być w stanie dowiedzieć się, jak wesprzeć dalsze typy multimediów, jeśli zajdzie taka potrzeba. Więcej informacji można znaleźć na stronie MSDN pod adresem AM_MEDIA_TYPE.
inline static void GetVideoFramesPerSecond(const AM_MEDIA_TYPE * pVT, long *plFramesPerSecond)
{
long nTenMillion = 10000000;
long lAvgFrameDuration = 0;
if(pVT->formattype == FORMAT_VideoInfo || pVT->formattype == FORMAT_MPEGVideo)
lAvgFrameDuration = (LONG) ((VIDEOINFOHEADER *)(pVT->pbFormat))->AvgTimePerFrame;
else if(pVT->formattype == FORMAT_VideoInfo2 || pVT->formattype == FORMAT_MPEG2_VIDEO)
lAvgFrameDuration = (LONG) ((VIDEOINFOHEADER2 *)(pVT->pbFormat))->AvgTimePerFrame;
*plFramesPerSecond = (lAvgFrameDuration != 0) ? ((long)(nTenMillion/lAvgFrameDuration)) : 0;
}