FMX Delphi 10.2网络摄像头访问违规,但仅限于有时

FMX Delphi 10.2网络摄像头访问违规,但仅限于有时,delphi,firemonkey,webcam,Delphi,Firemonkey,Webcam,有人能帮我吗?我用FireMonkey在Delphi10.2中制作了一个应用程序,它在我的表单上显示来自网络摄像头的视频,并在一个动作中将其插入数据库。网络摄像头的代码如下所示: 我使用TVideoCaptureDevice类,此代码: 摄像机:=TCaptureDeviceManager.Current.DefaultVideoCaptureDevice; 如果摄像机为零,那么 开始 VideoCamera.OnSampleBufferReady:=SampleBufferReady; 摄像

有人能帮我吗?我用FireMonkey在Delphi10.2中制作了一个应用程序,它在我的表单上显示来自网络摄像头的视频,并在一个动作中将其插入数据库。网络摄像头的代码如下所示:

我使用
TVideoCaptureDevice
类,此代码:

摄像机:=TCaptureDeviceManager.Current.DefaultVideoCaptureDevice;
如果摄像机为零,那么
开始
VideoCamera.OnSampleBufferReady:=SampleBufferReady;
摄像机。开始拍摄;
结束
其他的
开始
//MessageDlg('.',TMsgDlgType.mtWarning,[TMsgDlgBtn.mbOK],0);
结束;
SampleBufferReady()
过程中,我有以下代码行:

VideoCamera.SampleBufferToBitmap(帧,真);
当我关闭应用程序时,我有以下代码:

如果摄像机为零,则
摄像机。停止捕捉;
应用程序可以正常工作数千次,但有时我会遇到访问冲突,我想是在
FMX.Media
系统中的某个地方,如您所见:

或者是这个

我怎么知道会发生什么

正如你在下面看到的,我不能改变帧速率

当我列出可用的许可设置时,我只得到30 fps

现在我的打印屏幕与调试器完全不同了

正如你所说,我做了一个新的简单项目。这是完整的代码:

unit Unit3;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Media,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, FMX.Layouts;

type
  TForm3 = class(TForm)
    layCamera1: TLayout;
    imgCamera1: TImage;
    Rectangle1: TRectangle;
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
    VideoCamera : TVideoCaptureDevice;
    procedure SampleBufferSync;
    procedure SampleBufferReady(Sender: TObject; const ATime: TMediaTime);
  end;

var
  Form3: TForm3;
  frame: TBitmap;

implementation

{$R *.fmx}

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if VideoCamera <> nil then
    VideoCamera.StopCapture;

end;

procedure TForm3.FormShow(Sender: TObject);
begin
  VideoCamera:= TCaptureDeviceManager.Current.DefaultVideoCaptureDevice;
  if VideoCamera <> nil then
  begin
      VideoCamera.OnSampleBufferReady := SampleBufferReady;
      VideoCamera.StartCapture;
  end
  else
  begin

  end;
end;

procedure TForm3.SampleBufferReady(Sender: TObject; const ATime: TMediaTime);
begin
  if frame = nil then
    frame := TBitmap.Create;

  VideoCamera.SampleBufferToBitmap(frame, true);


  imgCamera1.Bitmap.Assign(frame);

end;

procedure TForm3.SampleBufferSync;
begin
  try
     if frame = nil then
      frame := TBitmap.Create;
    VideoCamera.SampleBufferToBitmap(frame, true);
    imgCamera1.Bitmap.Assign(frame);
  except on E:Exception do
  begin
     MessageDlg(E.Message, TMsgDlgType.mtWarning, [TMsgDlgBtn.mbOK], 0);
  end;
  end;
end;

end.
单元3;
接口
使用
System.SysUtils、System.TYPE、System.UITYPE、System.Classes、System.VARIANT、FMX.Media、,
FMX.类型,FMX.控件,FMX.窗体,FMX.图形,FMX.对话框,FMX.控件.表示,FMX.StdCtrls,FMX.对象,FMX.布局;
类型
TForm3=类别(TForm)
layCamera1:TLayout;
imgCamera1:TImage;
矩形1:三角形;
程序表单显示(发送方:TObject);
过程FormClose(发送方:ToObject;var操作:TCloseAction);
私有的
{私有声明}
公众的
{公开声明}
摄像机:电视摄像设备;
程序采样缓冲同步;
程序SampleBufferReady(发送方:TObject;常量:tmeditime);
结束;
变量
表3:TForm3;
框架:TBitmap;
实施
{$R*.fmx}
程序TForm3.FormClose(发送方:ToObject;var操作:TCloseAction);
开始
如果摄像机为零,那么
摄像机。停止捕捉;
结束;
程序TForm3.FormShow(发送方:TObject);
开始
摄像机:=TCaptureDeviceManager.Current.DefaultVideoCaptureDevice;
如果摄像机为零,那么
开始
VideoCamera.OnSampleBufferReady:=SampleBufferReady;
摄像机。开始拍摄;
结束
其他的
开始
结束;
结束;
程序TForm3.SampleBufferReady(发送方:ToObject;常量:TMediaTime);
开始
如果frame=nil,则
frame:=TBitmap.Create;
摄像机。采样缓冲区到位图(帧,真);
imgCamera1.Bitmap.Assign(帧);
结束;
程序TForm3.SampleBufferSync;
开始
尝试
如果frame=nil,则
frame:=TBitmap.Create;
摄像机。采样缓冲区到位图(帧,真);
imgCamera1.Bitmap.Assign(帧);
E上除外:例外
开始
MessageDlg(例如,Message,TMsgDlgType.mtWarning,[TMsgDlgBtn.mbOK],0);
结束;
结束;
结束;
结束。
当我启动程序时,它工作了一段时间,但在使用此调试窗口几分钟后(有时2分钟,有时22分钟)意外崩溃


另一个问题是,有时,当我关闭一个程序时,它直到我按下Delphi中的停止按钮才能关闭,正如评论中所述,我构建了OP在其问题中发布的“简单新项目”

它已经运行了6个多小时,没有任何问题,并且在我做其他事情时仍然在运行。我有一个罗技C310网络摄像头。安装了所有更新的Windows 10 Pro 20H2版本19042.685。Delphi 10.4.1更新版1,版本27.0.38860.1461


我的结论是,OP使用的Delphi10.2中有一个bug。至少在我使用的Delphi 10.4.1中已经修复了该错误。

在调试器下运行应用程序,查看访问冲突发生的位置,并使用该信息编辑您的问题。当然,我做到了。但我不知道它发生在哪里。当我获得访问权限时,Violetion调试器在System unite中的位置停止,如上图所示。我几乎把断点放在代码的每一个地方,我把try也放在每一个地方,我任何时候都不会出现异常。我想不出发生了什么。您的屏幕转储没有显示正在运行的调试器。您应该查看调用堆栈(查看/调试窗口/调用堆栈),并查看自己代码的第一行。当然,您必须构建调试配置,并检查项目选项“use debug dcu”以获取尽可能多的信息。您是否使用线程?这就是我得到的。Delphi在函数SysGetMem(大小:NativeInt):指针中的1973行上引发Access Violetion并在GETMEM.INC中停止;但我不知道该怎么去那里。我不能把打印屏幕放在评论中