2010-09-15 25 views

Trả lời

2

Có lẽ cách đơn giản nhất là để tạo ra một bộ lọc SampleGrabber với một callback tùy chỉnh, và tính toán nó cho mình.

Xem:

ISampleGrabber

ISampleGrabber::SetCallback

ISampleGrabberCB

Mỗi lần hàm callback được gọi, bạn đã nhận được một khung mới. Có lẽ bạn nên đặt nó ngay trước trình kết xuất đồ họa.

Ngoài ra, tùy thuộc vào biểu đồ của bạn, một số bộ lọc có thể có thông tin về tốc độ khung hình, nhưng phương pháp SampleGrabber sẽ hoạt động với bất kỳ biểu đồ nào.

1

Không phải mọi video đều có FPS không đổi, do đó, sử dụng mẫu grabber là phương pháp chính xác nhất mặc dù không phải là dễ nhất. Nếu bạn biết định dạng video của mình và bạn chắc chắn đó là định dạng của FPS, bạn có thể nhận bộ lọc biến đổi hoặc bộ lọc kết xuất, nhận một trong các chân của nó, gọi IPin :: ConnectionMediaType, xem loại định dạng loại phương tiện cho dù đó là FORMAT_VideoInfo hoặc FORMAT_VideoInfo2 , định dạng con trỏ tới VIDEOINFOHEADER hoặc VIDEOINFOHEADER2 tương ứng và xem trường AvgTimePerFrame.

2

Tôi hy vọng điều này sẽ hữu ích. Đó là một thói quen tôi đã viết nhiều mặt trăng trước đây để có được FPS của video tôi đang phát trực tiếp. Làm việc cho các loại phương tiện truyền thông khác nhau, nhưng bạn sẽ có thể tìm ra cách để hỗ trợ thêm các loại phương tiện truyền thông với điều này nếu bạn cần. Xem trang MSDN trên AM_MEDIA_TYPE để biết thêm thông tin.

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; 
} 
Các vấn đề liên quan