كيفية التقاط الإطارات باستخدام دلفي/DSPack دون عرضها على TVideoWindow؟

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

  •  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-1

Figure-2: Shows what happens if I remove the TVideoWindow

Figure-2

Figure-3: Shows what happens if I replace Video Renderer with a 
         Null Renderer and manually connect them in the GraphEdit. 

Figure-3

وهذا ما انتهى بي الأمر إلى فعله (حتى الآن)

اتصل بما يلي 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;

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