|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Захват видео - ошибка при добавлении фильтра захвата
Уважаемые господа!!
Пожалуйста, помогите советом. Хочу написать программу по захвату видео с вэбки. Под захватом подразумеваю только просмотр, хотя в дальнейшем планирую добавить ещё и фильтры записи в файл. Идея простая: на форме 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; // Далее рендеринг и работа с окном вывода... |