Pergunta

DSpack possui código de exemplo para reproduzir um dispositivo de vídeo compatível com DirectShow e capturar os quadros de vídeo simultaneamente.Uma TVideoWindow é anexada ao FilterGraph para exibir o vídeo (Figura 1).Se você remover o TVideoWindow, o Sistema Operacional (Windows) abrirá automaticamente o ActiveMovie e exibirá o vídeo em uma janela separada (Figura 2).

Existe uma maneira de usar o DSPack para capturar quadros de vídeo sem usar nenhum componente da GUI e sem exibir o vídeo?

O fórum DSPack menciona o filtro NullRenderer, mas não há documentação ou exemplos sobre como usá-lo.Parece que podemos conseguir isso se substituirmos manualmente o Video Renderer por Null Render diretamente no GraphEdit (Figura 3).

Como podemos obter o resultado mostrado na Figura 3 fazendo todas as manipulações dentro do código?DSPack não explica como criar um renderizador nulo.

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

Foi isso que acabei fazendo (até agora)

Ligue para o seguinte ReassignSampleGrabberOutput pouco antes 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;
Foi útil?

Solução

Null Renderer Filter é um filtro/classe padrão.No código você só precisa instanciá-lo (CoCreateInstance), adicione-o ao gráfico e conecte seu pino de entrada ao pino de saída não conectado do Sample Grabber.

No Delphi/DSPack deveria ser assim:

Renderer := CreateComObject(CLSID_NullRenderer) as IBaseFilter;

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top