Direct Show graph - как получить текущий fps? - PullRequest
5 голосов
/ 15 сентября 2010

У меня есть экземпляр IFilterGraph - мой собственный граф с видеофильтрами (источник, transofrm и рендерер). Как я могу получить текущую частоту кадров (частоту кадров видео) работающего графика?

С уважением Dominik

Ответы [ 3 ]

2 голосов
/ 13 октября 2010

Надеюсь, это поможет.Это рутина, которую я написал много месяцев назад, чтобы получить частоту кадров видео, которое я транслировал.Работает для различных типов носителей, но вы должны быть в состоянии выяснить, как поддерживать другие типы носителей с этим, если вам нужно.См. Страницу MSDN на 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;
}
2 голосов
/ 18 сентября 2010

Вероятно, самый простой способ - создать фильтр SampleGrabber с пользовательским обратным вызовом и рассчитать его самостоятельно.

См:

ISampleGrabber

ISampleGrabber :: SetCallback

ISampleGrabberCB

Каждый раз, когда вызывается ваша функция обратного вызова, вы получаете новый кадр. Вы, вероятно, должны поместить это непосредственно перед средством визуализации.

Кроме того, в зависимости от вашего графика, некоторые фильтры могут содержать информацию о частоте кадров, но метод SampleGrabber будет работать с любым графиком.

1 голос
/ 20 сентября 2010

Не каждое видео имеет постоянный FPS, поэтому использование граббера сэмплов является наиболее точным, хотя и не самым простым способом.Если вы знаете формат своего видео и уверены, что оно имеет постоянный FPS, вы можете получить фильтр преобразования или рендерера, получить один из его выводов, вызвать IPin :: ConnectionMediaType, посмотреть тип формата мультимедиа: FORMAT_VideoInfo или FORMAT_VideoInfo2,приведите указатель формата к VIDEOINFOHEADER или VIDEOINFOHEADER2 соответственно и посмотрите на поле AvgTimePerFrame.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...