Уважаемые господа!!
Пожалуйста, помогите советом.
Хочу написать программу по захвату видео с вэбки.
Под захватом подразумеваю только просмотр, хотя в дальнейшем планирую добавить ещё и фильтры записи в файл.
Идея простая: на форме Panel1 и кнопка Button1. Жмём на кнопку и видео воспроизводиться на панели. Смотрел книгу С.А. Есенина DirectX, но там разобран пример, где пользователю предлагают выбирать устройство захвата. Я хотел бы обойтись без этого, так как у меня будет использоваться всего 1 устройство с известным TGUID.
Я попытался создать и добавить фильтр захвата как добавляют обычные фильтры (фильтр источника, фильтр вывода и т.д.). Но создать его так не получается. Пожалуйста, подскажите у кого какие мысли?
Заранее спасибо:
Код ниже:
Код:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses ActiveX, DirectShow9;
const
CLSID_CaptureUSB: TGUID='{65e8773d-8f56-11d0-a3b9-00a0c9223196}';
var
pGraphBuilder: IGraphBuilder = nil;
pMediaControl: IMediaControl = nil;
pMediaEvent: IMediaEvent = nil;
pCaptureGraphBuilder2: ICaptureGraphBuilder2 = nil;
pVideoWindow: IVideoWindow = nil;
pCaptureUSB: IBaseFilter = nil;
procedure TForm1.FormCreate(Sender: TObject);
begin
CoInitialize(nil);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
CoUninitialize;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hr: HRESULT;
evCode: Integer;
begin
If Assigned(pGraphBuilder) then pGraphbuilder:= nil;
if Assigned(pMediaControl) then pMediaControl:= nil;
If Assigned(pMediaEvent) then pMediaEvent:= nil;
IF Assigned(pCaptureGraphBuilder2) then pCaptureGraphBuilder2:= nil;
If Assigned(pVideoWindow) then pVideoWindow:= nil;
If Assigned(pCaptureUSB) then pCaptureUSB:= nil;
hr:= CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC, IID_IGraphBuilder, pGraphBuilder);
if FAILED(hr) then begin
ShowMessage('Не удаётся создать GraphBuilder');
exit;
end;
hr:= CoCreateInstance(CLSID_CaptureGraphBuilder2, nil, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, pCaptureGraphBuilder2);
if FAILED(hr) then begin
ShowMessage('Не удаётся создать CaptureGraphBuilder');
exit;
end;
hr:= pCaptureGraphBuilder2.SetFiltergraph(pGraphBuilder);
if FAILED(hr) then begin
exit;
end;
hr:= CoCreateInstance(CLSID_CaptureUSB, nil, CLSCTX_INPROC, IID_IBaseFilter, pCaptureUSB);
if FAILED(hr) then begin
ShowMessage('Не удаётся создать CaptureUSB');
exit;
end;
hr:= pGraphBuilder.AddFilter(pCaptureUSB,'CaptureUSB');
if FAILED(hr) then begin
ShowMessage('Не удаётся добавить фильтр источника к графу');
exit;
end;
Админ: пользуемся тегами для оформления кода!
// Далее рендеринг и работа с окном вывода...