2010-09-15 10 views

Odpowiedz

2

Prawdopodobnie Najprostszym sposobem jest stworzenie filtra SampleGrabber z niestandardowym zwrotnego i obliczyć samodzielnie.

Patrz:

ISampleGrabber

ISampleGrabber::SetCallback

ISampleGrabberCB

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.

1

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.

2

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; 
}