Delphi XE6 试用Android视频采集

FMX支持视频采集,具体见FMX.Media,提供了很类支持音频、视频的处理。

按帮助文档,用Note3做了测试,结果,效率太低,不可用。

具体可查询帮助Video Capturing一节,我就是按这个把代码复制过来做的测试.

一点进展:

对于这么低的效率,经与朋友讨论,应该是FMX完全自己处理的结果,如此说来,如果我们能调用Android内置的相机进行录像,然后取得录像文件,该问题就解决了。这样想来,Delphi XE6支持的拍照功能,就是按这个原理实现的,非常适用了!为此,XE6带做一个Standard Action,叫TTakePhotoFromCameraAction,非常快捷的支持拍照的开发,如果再提供一个TTakeVideoFromCameraAction该有多好!可惜了,现在还没有。

为了调用内置相机,朋友提醒我说,就是调用Android的Intent,怎么调用,还不会,那有没有人基于Android开发这样的控件呢?还真查到一组控件:DPF component suite for Android, 只可惜,目前还没有提供录像功能。

附测试的FMX代码:

unit Unit2;
interface
uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
  FMX.StdCtrls, FMX.Objects, FMX.ListBox,FMX.Media;
type
  TForm2 = class(TForm)
    Layout1: TLayout;
    StartButton: TButton;
    ComboBox1: TComboBox;
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure StartButtonClick(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    VideoCamera: TVideoCaptureDevice;
    procedure SampleBufferSync;
    procedure SampleBufferReady(Sender: TObject; const ATime: TMediaTime);
  end;
var
  Form2: TForm2;
implementation
{$R *.fmx}
{ TForm2 }
procedure TForm2.ComboBox1Change(Sender: TObject);
begin
  VideoCamera := TVideoCaptureDevice
    //(TCaptureDeviceManager.Current.GetDevicesByName(ComboBox1.Selected.Text));
    (TCaptureDeviceManager.Current.Devices[1]);
  if (VideoCamera <> nil) then
  begin
    StartButton.Enabled := true;
  end;
end;
procedure TForm2.FormCreate(Sender: TObject);
var
  DeviceList: TCaptureDeviceList;
  i: integer;
begin
  DeviceList := TCaptureDeviceManager.Current.GetDevicesByMediaType
    (TMediaType.Video);
  for i := 0 to DeviceList.Count - 1 do
  begin
    ComboBox1.Items.Add(DeviceList[i].Name);//这里在note3上取不到Name.
  end;
end;
procedure TForm2.FormDestroy(Sender: TObject);
begin
  if VideoCamera <> nil then
    VideoCamera.StopCapture;
end;
procedure TForm2.SampleBufferReady(Sender: TObject; const ATime: TMediaTime);
begin
  TThread.Synchronize(TThread.CurrentThread, SampleBufferSync);
  //Resize the image so that the video is buffered in its original size
//  Image1.Width:=Image1.Bitmap.Width;
//  Image1.Height:=Image1.Bitmap.Height;
end;
procedure TForm2.SampleBufferSync;
begin
  VideoCamera.SampleBufferToBitmap(Image1.Bitmap, true);
end;
procedure TForm2.StartButtonClick(Sender: TObject);
begin
  if (VideoCamera <> nil) then
  begin
    if (VideoCamera.State = TCaptureDeviceState.Stopped) then
    begin
      VideoCamera.OnSampleBufferReady := SampleBufferReady;
      VideoCamera.StartCapture;
      StartButton.Text := 'Stop';
    end
    else
    begin
      VideoCamera.StopCapture;
      StartButton.Text := 'Start';
    end;
  end
  else
  begin
    Caption := 'Video capture devices not available.';
  end;
end;
end.

http://blog.sina.com.cn/s/blog_44fa172f0101rg7p.html