2012-04-15 4 views
0

Я хочу использовать фильтр PushSource для захвата, но мне нужно «подключить» его к образцу «videocap». Этот фильтр не является автономным фильтром, поэтому его нельзя перечислить как устройство захвата, также я не хочу, чтобы он конвертировался так, какDSPack: как подключить PushSource к видеокамере?

+0

Я использую DSPack много. Можете быть более конкретными? Вы пытаетесь захватить неподвижные изображения? –

+0

Я пытаюсь захватить видео. (PushSourceDesktop) Я попробовал его с помощью GraphEdit, и он работал, его просто не фильтр для подключения, но я знаю, что есть методы включения фильтров в ваше собственное приложение вместо регистрации в файловой системе. –

+0

похоже на эту тему http://stackoverflow.com/questions/3560855/how-to-use-install-custom-directshow-filter Я просто не знаю, как включить его ... –

ответ

2

Ну, я использую фильтр энкодера 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; 

Надежда это помогает. Мы все были новичками один раз;)

+0

thanx за ответы на данный момент. Не могли бы вы подробно описать часть «подключиться к любому фильтру»? :) Я понятия не имею, как подключить его к компоненту VideoSourceFilter ... или что делать до –

+1

Конечно. Я использую для шифрования видео, а затем подключаю этот фильтр к фильтру MatroskaMuxer, который я создаю, а затем подключаю его к фильтру записи файлов, и у меня есть график, который записывает видео в формате H264 в файл Matroska. Используйте метод подключения IGraphBuilder для подключения контактов. Подсказка: GraphBuilder: = FilterGraph1 Как IGraphBuilder; –

+0

mmmm can not you link рабочий код? Im очень newbee об этом –