Как захватить и сохранить в файл с веб-камеры, используя DSPack и Delphi 5

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

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

У меня есть 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.

1 ответ

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

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

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

Другие вопросы по тегам