type
PInputOptions = ^TInputOptions;
TInputOptions = record
FileName: WideString;
FileFormat: string;
TimeStart: Int64;
ProgramID: Integer;
ExtOptions: string;
Tag: Integer;
Data: Pointer;
end;
TOptionTargetType = (ttIgnore, ttVCD, ttSVCD, ttDVD);
TOptionNormType = (ntAuto, ntPAL, ntNTSC);
TOptionNormDefault = ntPAL..ntNTSC;
TStreamInfo = record
TimeStamp: TDateTime;
Year: Integer;
Track: Integer;
Title: AnsiString;
Author: AnsiString;
Copyright: AnsiString;
Comment: AnsiString;
Album: AnsiString;
Genre: AnsiString;
end;
POutputOptions = ^TOutputOptions;
TOutputOptions = record
FileName: WideString;
FileExt: string;
FileFormat: string;
PacketSize: Integer;
MuxRate: Integer;
MuxDelay: Single;
MuxPreload: Single;
AudioCodec: string;
AudioPreset: string;
DisableAudio: Boolean;
AudioVolume: Integer;
AudioChannels: Integer;
AudioSampleRate: Integer;
AudioBitrate: Integer;
AudioBitRateTolerance: Integer;
AudioLanguage: string;
AudioSyncMethod: Integer;
AudioTag: string;
VideoCodec: string;
VideoPreset: string;
DisableVideo: Boolean;
FrameRate: string;
FrameSize: string;
FrameAspectRatio: string;
CropTop: Integer;
CropBottom: Integer;
CropLeft: Integer;
CropRight: Integer;
PadTop: Integer;
PadBottom: Integer;
PadLeft: Integer;
PadRight: Integer;
PadColor: TColor;
GroupPictureSize: Integer;
VideoBitrate: Integer;
VideoMaxRate: Integer;
VideoMinRate: Integer;
VideoBitRateTolerance: Integer;
VideoBufSize: Integer;
VideoSyncMethod: Integer;
VideoTag: string;
VideoFilters: string;
VideoLanguage: string;
SubtitleCodec: string;
SubtitlePreset: string;
DisableSubtitle: Boolean;
SubtitleLanguage: string;
CopyTimestamp: Boolean;
TimeStart: Int64;
TimeLength: Int64;
Info: TStreamInfo;
TargetType: TOptionTargetType;
NormType: TOptionNormType;
NormDefault: TOptionNormDefault;
CustomHook: Boolean;
Join: Boolean;
UseMaxRecordingTime: Boolean;
ExtOptions: string;
Tag: Integer;
Data: Pointer;
end;
PHookInfo = ^THookInfo;
THookInfo = record
TaskIndex: Integer;
Bitmap: TBitmap;
FrameNumber: Integer;
PTS: Int64;
Update: Boolean;
StopHook: Boolean;
end;
TCustomHookEvent = procedure(Sender: TObject; AHookInfo: PHookInfo) of object;
TPreviewInfo = record
TaskIndex: Integer;
Bitmap: TBitmap;
FrameNumber: Integer;
PTS: Int64;
end;
TPreviewBitmapEvent = procedure(Sender: TObject; const APreviewInfo: TPreviewInfo) of object;
PProgressInfo = ^TProgressInfo;
TProgressInfo = record
TaskIndex: Integer;
FileIndex: Integer;
FrameNumber: Integer;
FPS: Integer;
Quality: Single;
BitRate: Single;
CurrentSize: Int64;
CurrentDuration: Int64;
TotalDuration: Int64;
end;
TProgressEvent = procedure(Sender: TObject; AProgressInfo: PProgressInfo) of object;
TTerminateInfo = record
TaskIndex: Integer;
Finished: Boolean;
Exception: Boolean;
ExceptionMsg: string;
end;
TTerminateEvent = procedure(Sender: TObject; const ATerminateInfo: TTerminateInfo) of object;
TCustomFFmpegVCL = class(TComponent)
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function AVLibLoaded: Boolean;
function LoadAVLib(const APath: TPathFileName): Boolean;
procedure UnloadAVLib;
procedure SetLicenseKey(const AKey: AnsiString; ASeed: LongWord; AHex: Boolean = True);
function AddTask(const AFileName: WideString; AOptions: PInputOptions = nil): Integer; overload;
function AddTask(const AFileName: WideString; const AExtOptions: string): Integer; overload;
function AddTask(AStream: TStream; const APrivateData: string; AOptions: PInputOptions = nil): Integer; overload;
function AddInputFile(ATaskIndex: Integer; const AFileName: WideString; AOptions: PInputOptions = nil): Boolean; overload;
function AddInputFile(ATaskIndex: Integer; const AFileName: WideString; const AExtOptions: string): Boolean; overload;
function SetOutputFile(ATaskIndex: Integer; const AFileName: WideString; AOptions: POutputOptions = nil): Boolean; overload;
function SetOutputFile(ATaskIndex: Integer; const AFileName: WideString; const AExtOptions: string): Boolean; overload;
function SetOutputStream(ATaskIndex: Integer; AStream: TStream; const APrivateData: string; AOptions: POutputOptions = nil): Boolean;
procedure ClearTasks;
procedure Exchange(ATaskIndex1, ATaskIndex2: Integer);
procedure RemoveTask(ATaskIndex: Integer);
procedure Start(AThreadCount: Integer = 0);
procedure Pause;
procedure Resume;
procedure Stop(AWaitFor: Boolean = True);
property AVProbe: TAVProbe read FAVProbe;
property AVProbes[TaskIndex, FileIndex: Integer]: TAVProbe read GetAVProbes;
property FFmpegs[TaskIndex: Integer]: TFFmpeg read GetFFmpegs;
property InputFiles[TaskIndex, FileIndex: Integer]: PAVFormatContext read GetInputFiles;
property InputOptions[TaskIndex, FileIndex: Integer]: TInputOptions read GetInputOptions;
property LastErrMsg: string read FLastErrMsg;
property OutputFiles[TaskIndex, FileIndex: Integer]: PAVFormatContext read GetOutputFiles;
property OutputOptions[TaskIndex, FileIndex: Integer]: TOutputOptions read GetOutputOptions;
property TasksCount: Integer read GetTasksCount;
property Preview: Boolean read FPreview write SetPreview default False;
property PreviewBitmap: Boolean read FPreviewBitmap write SetPreviewBitmap default False;
property ProgressInterval: Integer read FProgressInterval write SetProgressInterval default CReportInterval;
property ThreadPriority: TThreadPriority read FThreadPriority write FThreadPriority default tpNormal;
property TriggerEventInMainThread: Boolean read FTriggerEventInMainThread write FTriggerEventInMainThread default True;
property UserData: Pointer read FData write FData;
property Verbose: Integer read FVerbose write FVerbose;
property OnCustomHook: TCustomHookEvent read FOnCustomHook write FOnCustomHook;
property OnPreviewBitmap: TPreviewBitmapEvent read FOnPreviewBitmap write FOnPreviewBitmap;
property OnProgress: TProgressEvent read FOnProgress write FOnProgress;
property OnTerminate: TTerminateEvent read FOnTerminate write FOnTerminate;
published
property About: string read FAbout write FAbout;
property Version: string read GetVersion;
end;
TFFmpegVCL = class(TCustomFFmpegVCL)
published
property Preview;
property PreviewBitmap;
property ProgressInterval;
property ThreadPriority;
property TriggerEventInMainThread;
property OnCustomHook;
property OnPreviewBitmap;
property OnProgress;
property OnTerminate;
end;
const
AV_NOPTS_VALUE: Int64 = $8000000000000000;
AV_TIME_BASE = 1000000;
procedure InitInputOptions(P: PInputOptions);
procedure InitOutputOptions(P: POutputOptions);
implementation
procedure InitInputOptions(P: PInputOptions);
begin
with P^ do
begin
FileName := '';
FileFormat := '';
TimeStart := AV_NOPTS_VALUE;
ProgramID := -1;
ExtOptions := '';
Tag := 0;
Data := nil;
end;
end;
procedure InitOutputOptions(P: POutputOptions);
begin
with P^ do
begin
FileName := '';
FileExt := '';
FileFormat := '';
PacketSize := -1;
MuxRate := -1;
MuxDelay := -1;
MuxPreload := -1;
AudioCodec := '';
AudioPreset := '';
DisableAudio := False;
AudioVolume := -1;
AudioChannels := -1;
AudioSampleRate := -1;
AudioBitrate := -1;
AudioBitRateTolerance := -1;
AudioLanguage := '';
AudioSyncMethod := 0;
AudioTag := '';
VideoCodec := '';
VideoPreset := '';
DisableVideo := False;
FrameRate := '';
FrameSize := '';
FrameAspectRatio := '';
CropTop := -1;
CropBottom := -1;
CropLeft := -1;
CropRight := -1;
PadTop := -1;
PadBottom := -1;
PadLeft := -1;
PadRight := -1;
PadColor := clBlack;
GroupPictureSize := -1;
VideoBitrate := -1;
VideoMaxRate := -1;
VideoMinRate := -1;
VideoBitRateTolerance := -1;
VideoBufSize := -1;
VideoSyncMethod := -1;
VideoTag := '';
VideoFilters := '';
VideoLanguage := '';
SubtitleCodec := '';
SubtitlePreset := '';
DisableSubtitle := False;
SubtitleLanguage := '';
CopyTimestamp := False;
TimeStart := AV_NOPTS_VALUE;
TimeLength := AV_NOPTS_VALUE;
Info.TimeStamp := -1;
Info.Year := -1;
Info.Track := -1;
Info.Title := '';
Info.Author := '';
Info.Copyright := '';
Info.Comment := '';
Info.Album := '';
Info.Genre := '';
TargetType := ttIgnore;
NormType := ntAuto;
NormDefault := ntPAL;
CustomHook := False;
Join := False;
UseMaxRecordingTime := False;
ExtOptions := '';
Tag := 0;
Data := nil;
end;
end;