vložil Radek Červinka
5. září 2012 23:03
V nové verzi FireMonkey, jak jsem již psal, je implementována multiplatformní podpora pro audio a video a to jak pro zachytávání, tak pro přehrávání. Na Windows je používán DirectShow, na OSX pro změnu QuickTime.
Základem je jednotka FMX.Media, která obsahuje TVideoCaptureDevice, TAudioCaptureDevice (oboje poděděné z TCaptureDevice), TCaptureDeviceManager, TMediaPlayer (slouží pro přehrávání) a vizuální komponentu TMediaPlayerControl.
Dále ještě TMediaCodecManager, který podporuje správu kodeků. Podporovány jsou:
Windows:
- audio formáty: .wma, .mp3, .wav.
- video formáty: .avi, .wmv.
Mac OS:
- audio formáty: .mp3.
- video formáty: .mov, .m4v, .mp4.
Kromě toho je zde definován prototyp metody
TSampleBufferReadyEvent = procedure (Sender: TObject; const ATime: TMediaTime) of object;
Ukáži jednoduchý příklad na zachycení a zobrazení videa. Mějme formulář s následujícími komponentami:
TForm1 = class(TForm)
Button1: TButton;
ImageControl1: TImageControl;
Button2: TButton;
Label1: TLabel;
Button3: TButton;
Memo1: TMemo;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure SampleBufferReady(Sender: TObject; const ATime: TMediaTime);
end;
a následující kód:
implementation
var
VideoCamera : TVideoCaptureDevice = nil;
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
begin
// Get access to default video capture device
VideoCamera := TCaptureDeviceManager.Current.DefaultVideoCaptureDevice;
if VideoCamera <> nil then
begin
VideoCamera.OnSampleBufferReady := SampleBufferReady;
VideoCamera.StartCapture;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
VideoCamera.StopCapture;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to TCaptureDeviceManager.Current.Count - 1 do
begin
Memo1.Lines.Add(TCaptureDeviceManager.Current.Devices[i].Name);
end;
end;
procedure TForm1.SampleBufferReady(Sender: TObject; const ATime: TMediaTime);
begin
// just copy frame buffer to TBitmap
VideoCamera.SampleBufferToBitmap(ImageControl1.Bitmap, True);
Label1.Text := IntToStr(ATime);
end;
Button1 je začátek zachytávání, Button2 je stop a Button3 je vypíše zařízení pro zachytávání.
Metoda SampleBufferReady je vyvolána když je buffer zařízení připraven s daty a uvedený kód ho zobrazí. Samozřejmě s tím bufferem můžete dělat libovolné věci. Např. aplikovat libovolný filtr z FireMonkey před zobrazením nebo uložit data na disk.