2013-10-28 64 views
1

我正在開發一款應用程序,該應用程序必須在RAD Studio XE5上使用Delphi FireMonkey在iOS,Android和W32/64上運行。我正在嘗試訪問攝像機以掃描條形碼。TVideoCaptureDevice未在Android上調用OnSampleBufferReady

我已經有例子VideoCaptureHD使用USB攝像頭在W32上運行的應用程序,但在Android上,該應用程序只顯示背景顏色,並且沒有來自相機的圖像。我已經爲SampleBufferReady方法添加了一個斷點,但它永遠不會被調用。

此外,啓用捕獲按鈕表示相機設備在某個級別被識別。

//--------------------------------------------------------------------------- 

// This software is Copyright (c) 2012 Embarcadero Technologies, Inc. 
// You may only use this software if you are an authorized licensee 
// of Delphi, C++Builder or RAD Studio (Embarcadero Products). 
// This software is considered a Redistributable as defined under 
// the software license agreement that comes with the Embarcadero Products 
// and is subject to that software license agreement. 

//--------------------------------------------------------------------------- 
unit CaptureForm; 

interface 

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

type 
    TForm1 = class(TForm) 
    Image1: TImage; 
    CaptureButton: TSpeedButton; 
    Layout1: TLayout; 
    SaveDialog1: TSaveDialog; 
    Ellipse1: TEllipse; 
    StopButton: TSpeedButton; 
    procedure FormCreate(Sender: TObject); 
    procedure CaptureButtonClick(Sender: TObject); 
    procedure StopButtonClick(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    VideoCamera: TVideoCaptureDevice; 
    procedure SampleBufferReady(Sender: TObject; const ATime: TMediaTime); 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.fmx} 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    VideoCamera := TCaptureDeviceManager.Current.DefaultVideoCaptureDevice; 
    if VideoCamera <> nil then 
    begin 
    Ellipse1.AnimateFloat('Opacity', 1, 1.0); 
    VideoCamera.OnSampleBufferReady := SampleBufferReady; 
    VideoCamera.StartCapture; 
    end 
    else 
    begin 
    CaptureButton.Enabled := False; 
    Caption := 'Video capture devices not available.'; 
    end; 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
    if VideoCamera <> nil then 
    VideoCamera.StopCapture; 
end; 

procedure TForm1.SampleBufferReady(Sender: TObject; const ATime: TMediaTime); 
begin 
    VideoCamera.SampleBufferToBitmap(Image1.Bitmap, True); 
end; 

procedure TForm1.StopButtonClick(Sender: TObject); 
begin 
    if VideoCamera <> nil then 
    begin 
    if VideoCamera.State = TCaptureDeviceState.Capturing then 
    begin 
     Ellipse1.AnimateFloat('Opacity', 0, 1.0); 
     StopButton.Text := 'Capture'; 
     VideoCamera.StopCapture; 
    end 
    else 
    begin 
     Ellipse1.AnimateFloat('Opacity', 1, 1.0); 
     StopButton.Text := 'Stop'; 
     VideoCamera.StartCapture 
    end; 
    end; 
end; 

procedure TForm1.CaptureButtonClick(Sender: TObject); 
begin 
    if SaveDialog1.Execute then 
    Image1.Bitmap.SaveToFile(SaveDialog1.FileName); 
end; 

end. 

回答

0

我在您的應用程序中找不到錯誤或錯誤。

您還應該檢查是否在項目 - >選項 - >使用權限 - > Android->相機是否爲真。

我做了類似的應用和它的作品(公共變量和你的一樣):

procedure TForm1.Button1Click(Sender: TObject); //starts capturing on click 
begin 
    VideoCamera.StartCapture; 
end; 

procedure TForm1.Button2Click(Sender: TObject); //stops capturing on click 
begin 
    VideoCamera.StopCapture; 
end; 

procedure TForm1.Button3Click(Sender: TObject); //create camera on click 
begin 
    VideoCamera := TCaptureDeviceManager.Current.DefaultVideoCaptureDevice; 
    if VideoCamera <> nil then 
    begin 
    VideoCamera.OnSampleBufferReady := SampleBufferReady; 
    end 
    else 
    begin 
    ShowMessage('Video capture devices not available.'); 
    end; 
end; 

procedure TForm1.SampleBufferReady(Sender: TObject; const ATime: TMediaTime); // copy to bitmap works perfect 
begin 
    VideoCamera.SampleBufferToBitmap(Image1.Bitmap, True); 
end; 
相關問題