Я хочу использовать фильтр PushSource
для захвата, но мне нужно «подключить» его к образцу «videocap». Этот фильтр не является автономным фильтром, поэтому его нельзя перечислить как устройство захвата, также я не хочу, чтобы он конвертировался так, какDSPack: как подключить PushSource к видеокамере?
ответ
Ну, я использую фильтр энкодера Nvidia, который не отображается в GraphEdit. Чтобы сделать это, я просто определить 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;
Надежда это помогает. Мы все были новичками один раз;)
thanx за ответы на данный момент. Не могли бы вы подробно описать часть «подключиться к любому фильтру»? :) Я понятия не имею, как подключить его к компоненту VideoSourceFilter ... или что делать до –
Конечно. Я использую для шифрования видео, а затем подключаю этот фильтр к фильтру MatroskaMuxer, который я создаю, а затем подключаю его к фильтру записи файлов, и у меня есть график, который записывает видео в формате H264 в файл Matroska. Используйте метод подключения IGraphBuilder для подключения контактов. Подсказка: GraphBuilder: = FilterGraph1 Как IGraphBuilder; –
mmmm can not you link рабочий код? Im очень newbee об этом –
Я использую DSPack много. Можете быть более конкретными? Вы пытаетесь захватить неподвижные изображения? –
Я пытаюсь захватить видео. (PushSourceDesktop) Я попробовал его с помощью GraphEdit, и он работал, его просто не фильтр для подключения, но я знаю, что есть методы включения фильтров в ваше собственное приложение вместо регистрации в файловой системе. –
похоже на эту тему http://stackoverflow.com/questions/3560855/how-to-use-install-custom-directshow-filter Я просто не знаю, как включить его ... –