Bir örnek IFilterGraph - kendi video filtrelerle (kaynak, transofrm ve renderer) grafiğim var. Akan grafiğin mevcut fps değerini (video kare hızı) nasıl edinebilirim? Selamlar DominikDirect Göster grafiği - Şu anki fps'yi nasıl alırsınız?
cevap
Muhtemelen en kolay yolu özel geri arama ile bir SampleGrabber filtre oluşturma ve kendiniz hesaplamaktır.
bakınız:
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.
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.
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;
}