كيفية التقاط الإطارات باستخدام دلفي/DSPack دون عرضها على TVideoWindow؟
-
12-12-2019 - |
سؤال
يحتوي DSpack على رمز مثال لتشغيل جهاز فيديو متوافق مع DirectShow والتقاط إطارات الفيديو في وقت واحد.يتم إرفاق TVideoWindow بـ FilterGraph لعرض الفيديو (Firgure-1).إذا قمت بإزالة TVideoWindow، فسيقوم نظام التشغيل (Windows) تلقائيًا بإحضار ActiveMovie وعرض الفيديو في نافذة منفصلة (الشكل-2).
هل هناك طريقة لاستخدام DSPack لالتقاط إطارات الفيديو دون استخدام أي من مكونات واجهة المستخدم الرسومية ودون عرض الفيديو؟
يحتوي منتدى DSPack على بعض الإشارات حول مرشح NullRenderer ولكن لا توجد وثائق أو أمثلة حول كيفية استخدامه.يبدو أنه يمكننا تحقيق ذلك إذا استبدلنا Video Renderer يدويًا بـ Null Render مباشرة في GraphEdit (الشكل 3).
كيف يمكننا تحقيق النتيجة الموضحة في الشكل 3 عن طريق إجراء جميع المعالجات داخل الكود؟لا يشرح DSPack كيفية إنشاء Null Renderer.
Figure-1: The graph of the default example code
Figure-2: Shows what happens if I remove the TVideoWindow
Figure-3: Shows what happens if I replace Video Renderer with a
Null Renderer and manually connect them in the GraphEdit.
وهذا ما انتهى بي الأمر إلى فعله (حتى الآن)
اتصل بما يلي ReassignSampleGrabberOutput
فقط قبل filterGraph.Play;
procedure TForm1.ReassignSampleGrabberOutput;
var
nullRenderer : IBaseFilter;
nullRendererPins: IEnumPins;
nullRendererPin : IPin;
graph: IGraphBuilder;
begin
nullRenderer := CreateComObject(CLSID_NullRenderer) as IBaseFilter;
FilterGraph1.QueryInterface(IID_IGraphBuilder, graph);
graph.AddFilter(nullRenderer, 'Null Renderer');
nullRenderer.EnumPins(nullRendererPins);
nullRendererPins.Reset;
if nullRendererPins.Next(1, nullRendererPin, nil) = S_OK then
begin
//SampleGrabber1.OutPutPin.Disconnect;
//SampleGrabber1.OutPutPin.Connect(nullRendererPin, nil);
graph.Disconnect(SampleGrabber1.OutPutPin);
graph.FindFilterByName('Video Renderer', filter);
graph.RemoveFilter(filter);
graph.Connect(SampleGrabber1.OutPutPin, nullRendererPin);
end;
end;
المحلول
Null Renderer Filter
هو مرشح/فئة قياسية.في الكود تحتاج فقط إلى إنشاء مثيل له (CoCreateInstance
)، قم بإضافته إلى الرسم البياني، وقم بتوصيل طرف الإدخال الخاص به بمنفذ الإخراج غير المتصل الخاص بـ Sample Grabber.
في دلفي/DSPack يجب أن يكون مثل هذا:
Renderer := CreateComObject(CLSID_NullRenderer) as IBaseFilter;