0

フィルターを使用してキャプチャしたいのですがPushSource、それを「videocap」サンプルに「接続」する必要があります。このフィルターはスタンドアロン フィルターではないため、キャプチャ デバイスとして列挙することはできません。また、そのように変換したくありません。

4

1 に答える 1

2

ええと、私はGraphEditに表示されないNvidiaエンコーダーフィルターを使用しています。これを行うには、GUIDを定義するだけです。

Const
CLSID_NVIDIA_VideoEncoderFilter : TGUID = '{B63E31D0-87B5-477f-B224-4A35B6BECED6}';

次に、次のようにメモリ内にフィルタを作成します。

Var
  N: IBaseFilter;
begin
  CoCreateInstance(CLSID_NVIDIA_VideoEncoderFilter, Nil, CLSCTX_INPROC_SERVER, IID_IBaseFilter, N);
  if Assigned(N) then
  Begin
  // connect to any filter that you can use in your system
  End;

また、GraphEditでこの「非表示」フィルターを確認できます。

編集:これが私がフィルターをリンクするコードです。次のフィルターに接続されている可能性のあるすべてのピンを検索します。このコードは、オーディオ出力ピンをオーディオ入力ピンに接続し、ビデオ出力ピンをビデオ入力ピンに接続します。非常に柔軟性があります。

Procedure Connect(Builder: IGraphBuilder; SourceFilter, DestFilter: IBaseFilter);
Var
  SourceEnum, DestEnum: IEnumPins;
  SourcePin, DestPin: IPin;
  FI: _FilterInfo;
  S, D: String;
Begin
  SourceFilter.QueryFilterInfo(FI);
  S := FI.achName;
  DestFilter.QueryFilterInfo(FI);
  D := FI.achName;
  SourceFilter.EnumPins(SourceEnum);
  DestFilter.EnumPins(DestEnum);
  DestEnum.Reset;
  While DestEnum.Next(1, DestPin, Nil) = S_OK Do
  Begin
    SourceEnum.Reset;
    While SourceEnum.Next(1, SourcePin, Nil) = S_OK Do
      If Builder.Connect(SourcePin, DestPin) = S_OK Then
      Begin
        SourceEnum := Nil;
        DestEnum := Nil;
        SourcePin := Nil;
        DestPin := Nil;
        Exit;
      End;
  End;
  SourceEnum := Nil;
  DestEnum := Nil;
  SourcePin := Nil;
  DestPin := Nil;
  Raise Exception.Create(Format('There is no pin from %s to connect to %d', [S, D]));
End;

これで、次のコードのように、このメソッドをフィルターで使用できます。

Var
  SourceFilter, DestFilter: IBaseFilter;
  Builder: IGraphBuilder;
Begin
  SourceFilter := SrcFilter As IBaseFilter;
  DestFilter := DstFilter As IBaseFilter;
  Builder := FilterGraph As IGraphBuilder;
  Connect(Builder, SourceFilter, DestFilter);
End;

お役に立てれば。私たちはかつてはすべて初心者でした;)

于 2012-04-15T13:33:35.830 に答える