2010-09-15 25 views

cevap

2

Muhtemelen en kolay yolu özel geri arama ile bir SampleGrabber filtre oluşturma ve kendiniz hesaplamaktır.

bakınız:

ISampleGrabber

ISampleGrabber::SetCallback

ISampleGrabberCB

geri arama işlevini her çağrıldığında, yeni bir çerçeve aldık. Muhtemelen bunu işleyiciden hemen önce koymalısınız. Ayrıca, grafiğinize bağlı olarak, bazı filtrelerin kare hızı hakkında bilgi olabilir, ancak SampleGrabber yöntemi herhangi bir grafikle çalışabilir.

1

Her video sabit bir FPS'ye sahip değildir, bu nedenle örnek kapmak kullanmak en kolay yöntem olmasa da en doğru yöntemdir. Videonuzun formatını biliyorsanız ve sabit bir FPS'ye sahip olduğundan eminseniz, dönüşüm veya render süzgecinizi alabilir, pinlerinden birini alabilirsiniz, IPin :: ConnectionMediaType'ı çağırın, FORMAT_VideoInfo veya FORMAT_VideoInfo2 olsun, medya türünün biçim türüne bakın. buna göre VIDEOINFOHEADER veya VIDEOINFOHEADER2'ye formatlama işaretçisi göster ve AvgTimePerFrame alanına bak.

2

Umarım bu yardımcı olur. Aktardığım videonun FPS'sini almak için birçok ay önce yazdığım bir rutin. Çeşitli medya türleri için çalışır, ancak ihtiyacınız varsa başka medya türlerini nasıl destekleyeceğinizi öğrenmelisiniz. Daha fazla bilgi için AM_MEDIA_TYPE numaralı MSDN sayfasına bakın.

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; 
} 
İlgili konular