كيفية الحفاظ على DirectShow الرسم البياني لقطة من تجميع عند استخدام laggy الفلتر ؟

StackOverflow https://stackoverflow.com/questions/445588

  •  22-07-2019
  •  | 
  •  

سؤال

لدي DirectShow الرسم البياني مع SampleGrabber مرشح القيام ببعض المعالجة.تجهيز يستغرق فترة تصل إلى 50ms في كثير من الأحيان سرعة تشغيل أبطأ.المعالجة يمكن أن تحول على نحو متقطع.

مشكلتي هي أنه إذا كان يعالج منذ فترة عندما كنت إيقاف تشغيله تشغيل الفيديو في أسرع وقت ممكن حتى تصل إلى نقطة معينة.ويفترض في هذه النقطة حيث الإطار المباريات في الوقت تيار الزمن و لم يعد هناك أي تأخير.

كيف يمكن وقف هذا من الحدوث ، حتى عندما أنتقل تجهيز إيقاف التشغيل العادي السرعة ؟ هل يمكنني إيقاف تيار على مدار الساعة أثناء معالجة البيانات ؟ أو ربما الزمني العينات الخروج من SampleGrabber مرشح مرة أخرى ، الإضافية تأخر المضافة ؟

لا أحد يعرف الطريقة الصحيحة للقيام بذلك ؟

تحرير:

أنا استخدم طريقة تغيير عينة مرات كما هو مبين في الجواب أدناه ، ولكن لديه بعض المشاكل مع السعي فضلا عن احتساب عينة الطوابع الزمنية.

لقد وجدت أفضل طريقة لتنفيذ بلدي إشارة عقارب الساعة إلى وقف عقارب الساعة إذا كان التجهيز استغرق وقتا طويلا.

هل كانت مفيدة؟

المحلول

طالما كنت تستخدم ISampleGrabberCB::SampleCB و لا ISampleGrabberCB::BufferCallback يمكنك ببساطة تحديث IMediaSample عرض الطوابع الزمنية إلى ما تريد باستخدام IMediaSample::SetTime.تحتاج إلى استخدام SampleCB لأنها تعطيك مؤشر إلى عينات الفعلية بينما BufferCB نسخ العينات قبل الحصول عليها ، مما يعني أنك فقط تحديث النسخة.

إيقاف عقارب الساعة ربما لن تساعدك لأنها سوف تجعل مجرد الرسم البياني تشغيل في أسرع وقت ممكن.قد تتمكن من محاولة تغيير معدل التشغيل باستخدام IMediaSeeking::SetRate, ولكن نضع في اعتبارنا أن العديد من الفلاتر لا تدعم معدل التغييرات.يمكن أيضا تطبيق مخصص على مدار الساعة يختلف الر لمتطلباتك بالضبط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top