캡쳐하려면 PushSource
필터를 사용하고 싶지만 샘플을 "비디오 캡"에 "연결"해야합니다. 이 필터는 독립형 필터가 아니므로 캡처 장치로 열거 할 수 없습니다. 그런 식으로 변환 할 필요가 없습니다.DSPack : PushSource를 비디오 캡으로 연결하는 방법?
답변
글쎄, 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;
희망이 도움이에서로 필터를이 방법을 사용할 수 있습니다. 한 번 초보자였습니다)
고맙습니다. "모든 필터에 연결"부분을 자세히 설명해 주시겠습니까? :) VideoSourceFilter 구성 요소에 연결하는 방법을 모르겠다 ... 또는 무엇을 –
확실히. 비디오를 암호화 한 다음이 필터를 내가 만든 "MatroskaMuxer"필터에 연결 한 다음 파일 작성기 필터에 연결하고 Matroska 파일에 H264로 인코딩 된 비디오를 기록하는 그래프를 사용합니다. IGraphBuilder의 Connect 메서드를 사용하여 핀을 연결합니다. 힌트 : GraphBuilder : = FilterGraph1 IGraphBuilder로; –
mmmm 작업 코드를 연결할 수 없습니까? 나는 그것에 대해 아주 새내기 –
DSPack를 많이 사용하고 있습니다. 더 자세하게 얘기해 주 시겠어요? 정지 영상을 캡처하려고합니까? –
나는 비디오를 캡처하려고합니다. (PushSourceDesktop) GraphEdit으로 시도해 보았지만 연결하기위한 필터가 아니었지만 파일 시스템에 등록하는 대신 필터를 자신의 응용 프로그램에 포함시키는 방법이 있습니다. –
이 주제와 비슷한 http://stackoverflow.com/questions/3560855/how-to-use-install-custom-directshow-filter 나는 그것을 포함시키는 법을 모른다. –