2012-04-15 13 views
0

캡쳐하려면 PushSource 필터를 사용하고 싶지만 샘플을 "비디오 캡"에 "연결"해야합니다. 이 필터는 독립형 필터가 아니므로 캡처 장치로 열거 할 수 없습니다. 그런 식으로 변환 할 필요가 없습니다.DSPack : PushSource를 비디오 캡으로 연결하는 방법?

+0

DSPack를 많이 사용하고 있습니다. 더 자세하게 얘기해 주 시겠어요? 정지 영상을 캡처하려고합니까? –

+0

나는 비디오를 캡처하려고합니다. (PushSourceDesktop) GraphEdit으로 시도해 보았지만 연결하기위한 필터가 아니었지만 파일 시스템에 등록하는 대신 필터를 자신의 응용 프로그램에 포함시키는 방법이 있습니다. –

+0

이 주제와 비슷한 http://stackoverflow.com/questions/3560855/how-to-use-install-custom-directshow-filter 나는 그것을 포함시키는 법을 모른다. –

답변

2

글쎄, GraphEdit에 표시되지 않는 Nvidia 인코더 필터를 사용합니다.

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로이 "숨겨진"필터를 볼 수 있습니다 난 그냥 GUID를 정의하는 것이 수행합니다.

편집 : 다음은 필터를 연결하는 코드입니다. 다음 필터에 연결될 수있는 모든 핀을 검색합니다. 이 코드는 오디오 출력 핀을 오디오 입력 핀에 연결하고 비디오 출력 핀을 비디오 출력 핀에 연결합니다. 매우 유연합니다.

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; 

희망이 도움이에서로 필터를이 방법을 사용할 수 있습니다. 한 번 초보자였습니다)

+0

고맙습니다. "모든 필터에 연결"부분을 자세히 설명해 주시겠습니까? :) VideoSourceFilter 구성 요소에 연결하는 방법을 모르겠다 ... 또는 무엇을 –

+1

확실히. 비디오를 암호화 한 다음이 필터를 내가 만든 "MatroskaMuxer"필터에 연결 한 다음 파일 작성기 필터에 연결하고 Matroska 파일에 H264로 인코딩 된 비디오를 기록하는 그래프를 사용합니다. IGraphBuilder의 Connect 메서드를 사용하여 핀을 연결합니다. 힌트 : GraphBuilder : = FilterGraph1 IGraphBuilder로; –

+0

mmmm 작업 코드를 연결할 수 없습니까? 나는 그것에 대해 아주 새내기 –