2013-08-27 38 views
2

прямо сейчас Я пытаюсь сделать программу с помощью Delphi 5, чтобы сделать снимок с веб-камеры. Я использую delphi 5 и DSPack 2.3.1, потому что многие люди предлагают это, и да, это мое первое программирование мультимедиа с delphi.Как захватить и сохранить в файл с веб-камеры с помощью DSPack и Delphi 5

Я смог перечислить и добавить камеру, которая динамически подключается к моему компьютеру. Я также могу показать, что веб-камера «видит», открывая видео и захватывая его. Но теперь я не могу захватить изображение с веб-камеры.

У меня есть TImage, который я назвал «Изображение», чтобы проверить, что изображение захвачено или нет. Когда я использую свой код для открытия видео и его захвата, он отображается в TImage. Но когда я пытаюсь захватить веб-камеру, она просто пустая и ничего не захватывает. Файл, который я сохранил, также пуст.

Может кто-нибудь проверить, какая часть моего кода идет не так? Благодаря прежде ...

вот часть моего кода

var SysDev: TSysDevEnum; 
    FotoBitmap: TBitmap; 

implementation 

{$R *.DFM} 

procedure Form1.FormCreate(Sender: TObject); 
var 
    i: integer; 
    Device: TMenuItem; 
begin 
    SysDev:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory); 
    if SysDev.CountFilters > 0 then 
    for i := 0 to SysDev.CountFilters - 1 do 
    begin 
     Device := TMenuItem.Create(Devices); 
     Device.Caption := SysDev.Filters[i].FriendlyName; 
     Device.Tag := i; 
     Device.OnClick := OnSelectDevice; 
     Devices.Add(Device); 
    end; 
end; 

procedure Form1.FormCloseQuery(Sender: TObject; 
    var CanClose: Boolean); 
begin 
    SysDev.Free; 
    FilterGraph.ClearGraph; 
    FilterGraph.Active := false; 
end; 

procedureForm1.OnSelectDevice(sender: TObject); 
var 
    CaptureGraph: ICaptureGraphBuilder2; 
    SourceFilter, DestFilter: IBaseFilter; 
begin 
    FilterGraph.ClearGraph; 
    FilterGraph.Active := false; 

    Filter.BaseFilter.Moniker := SysDev.GetMoniker(TMenuItem(Sender).tag); 
    Filter.FilterGraph := FilterGraph; 

    FilterGraph.Active := true; 

    FilterGraph.QueryInterface(ICaptureGraphBuilder2, CaptureGraph); 

    Filter.QueryInterface(IBaseFilter, SourceFilter); 

    VideoWindow.QueryInterface(IBaseFilter, DestFilter); 

    if Filter.BaseFilter.DataLength > 0 then 
    CaptureGraph.RenderStream(nil, nil, SourceFilter, nil, DestFilter); 

    FilterGraph.Play; 
    CaptureGraph := nil; 
    SourceFilter := nil; 
    DestFilter := nil; 
end; 

procedure Form1.SnapshotClick(Sender: TObject); 
var dir : String; 
begin 
    if edt_nama_foto.Text <> '' then begin 
    dir := ExtractFilePath(Application.ExeName); 
    FotoBitmap := TBitmap.Create; 

    try 
     SampleGrabber.GetBitmap(FotoBitmap); 
     SampleGrabber.GetBitmap(Image.Picture.Bitmap); 
     showmessage(dir + 'Image\Foto\' + edt_nama_foto.Text + '.bmp'); 
     FotoBitmap.SaveToFile(dir + 'Image\Foto\' + edt_nama_foto.Text + '.bmp'); 
    finally 
     FotoBitmap.Free; 
    end; 
    end; 
end; 

procedure Form1.btn_batalClick(Sender: TObject); 
begin 
    modalresult:=mrCancel; 
end; 

procedure Form1.btn_simpanClick(Sender: TObject); 
begin 
    If CheckbeforeOK then 
    begin 
    ModalResult :=mrOK; 
    end else begin 
    ModalResult := mrNone; 
    end; 
end; 

function Form1.CheckbeforeOK:Boolean; 
var flag:boolean; 
    MasterDataSet:TQuery; 
begin 
    Flag:=True; 

    if flag and not(checkedit(nil, nil, edt_nama_foto, edt_nama_foto.Text, 'Nama Foto')) 
    then begin 
    flag := False; 
    end else begin 
    Snapshot.Click; 
    end; 
    Result := flag; 
end; 

procedure Form1.SampleGrabberBuffer(sender: TObject; 
    SampleTime: Double; pBuffer: Pointer; BufferLen: Integer); 
begin 
    Image.Picture.Bitmap.Canvas.Lock; 
    try 
    SampleGrabber.GetBitmap(Image.Picture.Bitmap, pBuffer, BufferLen); 
    finally 
    Image.Picture.Bitmap.Canvas.UnLock; 
    end; 
end; 

end. 

ответ

0

Объект, который "передает" кадр видео в изображение объекта SampleGrabber:

SampleGrabber.GetBitmap (Image.Picture. Bitmap, pBuffer, BufferLen);

Однако он должен быть вставлен в отфильтровывать график, когда вы строите его, и вы, по-видимому, не делает его в OnSelectDevice: нет никакого упоминания о SampleGrabber там вообще. Вам нужно включить его в звонок RenderStream или иным образом установить его там, чтобы через него транслировалось видео, а ваш обратный вызов называется копированием данных в TImage.