Как захватывать кадры с помощью Delphi/DSPack, не отображая их в TVideoWindow?

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

  •  12-12-2019
  •  | 
  •  

Вопрос

В DSpack есть пример кода для воспроизведения видеоустройства, совместимого с DirectShow, и одновременного захвата видеокадров.TVideoWindow прикреплен к FilterGraph для отображения видео (Рисунок-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.

В Delphi/DSPack это должно быть так:

Renderer := CreateComObject(CLSID_NullRenderer) as IBaseFilter;

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top