Тему можно закрывать. Проблема решена. Перерыв кучу интернет ссылок нашел прогу на C# для TVTuner и переделал ее под камеру, попутно переводя ее в Delphi.
Также помог Есенин С.А. (Не тот что поэтом был, а другой, автор книги "DirectX и Delphi. Разработка графических и мультимедийных приложений").
В общем вот решение проблемы - вдруг кому пригодится.
function BuildOfGraph: HResult;
begin
ResetGraph();
// Создаем объект для построения графа фильтров
Result := CoCreateInstance(CLSID_FilterGraph,
NIL,
CLSCTX_INPROC_SERVER,
IID_IGraphBuilder,
FGraphBuilder);
if FAILED(Result) then EXIT;
// Создаем объект для построения графа захвата
Result := CoCreateInstance(CLSID_CaptureGraphBuilder2,
NIL,
CLSCTX_INPROC_SERVER,
IID_ICaptureGraphBuilder2,
FCaptureGraphBuilder);
if FAILED(Result) then EXIT;
// Задаем граф фильтров для использования в построении графа захвата
Result := FCaptureGraphBuilder.SetFiltergraph(FGraphBuilder);
if FAILED(Result) then EXIT;
// Получение устройтва захвата видео
FVideoCaptureFilter := EnumerateDevices(CLSID_VideoInputDeviceCategory, VideoCaptureDeviceName, NIL, TRUE);
if FVideoCaptureFilter <> NIL then begin
FGraphBuilder.AddFilter(FVideoCaptureFilter, 'VideoCaptureFilter');
Result := FCaptureGraphBuilder.RenderStream(@PIN_CATEGORY_PREVIEW, @MEDIATYPE_Video, FVideoCaptureFilter, NIL, nil);
if FAILED(Result) then EXIT;
SetParamAndRouteCrossBar();
if FVideoHandle > 0 then begin
FGraphBuilder.QueryInterface(IID_IVideoWindow, FVideoWindow);
if FVideoWindow <> NIL then begin
FVideoWindow.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS);
FVideoWindow.put_Owner(FVideoHandle);
FVideoWindow.SetWindowPosition(FVideoRect.Left, FVideoRect.Top,
FVideoRect.Right - FVideoRect.Left,
FVideoRect.Bottom - FVideoRect.Top);
FVideoWindow.put_Visible(TRUE);
end;
end;
end;
if FPlayed then begin
// Запрашиваем интерфейс управления графом
Result := FGraphBuilder.QueryInterface(IID_IMediaControl, FMediaControl);
if FAILED(Result) then EXIT;
// Запускаем граф
Result := FMediaControl.Run();
end;
end;
Основная проблема решается здесь посредством функции:
function SetParamAndRouteCrossBar(PAL_MODE: bool = true): bool;
var
hr: HRESULT;
i: integer;
pct: TPhysicalConnectorType;
CrossBar: IUnknown;
numOutPin, numInPin: Integer;
nOutputVideoLink : integer;
nInputVideoLink : integer;
pIdxRel : integer;
AnalogVideoDecoder: IUnknown;
begin
hr := FCaptureGraphBuilder.FindInterface(nil, nil, FVideoCaptureFilter, IID_IAMCrossbar, CrossBar);
if (hr >= 0) then begin
nOutputVideoLink := -1;
nInputVideoLink := -1;
(CrossBar as IAMCrossbar).get_PinCounts(numOutPin, numInPin);
for i := 0 to numInPin do begin
(CrossBar as IAMCrossbar).get_CrossbarPinInfo(true, i, pIdxRel, pct);
if (pct = PhysConn_Video_Composite) then nInputVideoLink := i;
if (nInputVideoLink <> -1) then break;
end;
for i := 0 to numOutPin do begin
(CrossBar as IAMCrossbar).get_CrossbarPinInfo(false, i, pIdxRel, pct);
if (pct = PhysConn_Video_VideoDecoder) then nOutputVideoLink := i;
if (nOutputVideoLink <> 1) then break;
end;
try
if ((CrossBar as IAMCrossbar).Route(nOutputVideoLink, nInputVideoLink) >= 0) then result := true else result := false;
except
result := false;
end
end;
if PAL_MODE then begin
hr := FCaptureGraphBuilder.FindInterface(nil, nil, FVideoCaptureFilter, IID_IAMAnalogVideoDecoder, AnalogVideoDecoder);
if hr >= 0 then begin
if (AnalogVideoDecoder as IAMAnalogVideoDecoder).put_TVFormat(AnalogVideo_PAL_B) >= 0 then result := true else result := false;
end else result := false;
end;
CrossBar := nil;
AnalogVideoDecoder := nil;
end;
P.S. У меня просто камера выдает сигнал стандарта PAL - потому и параметр мне потребовался. Если стандарт NTSC то нужно будет предавать PAL_MODE = false.