emailx45
Premium
- Thread starter
- #41
my sample: How to Insert MP3/MP4 file or other like a Resource into your executable and Play it in MediaPlayer (FireMonkey / VCL)
NOTE1: Dont forget, in Android/iOS you need privilegies like: read/write resource in Storages (internal or external), play some, etc.. study about use of "privilegies" in your apps!
[SHOWTOGROUPS=4,20]
[/SHOWTOGROUPS]
- NOTE2: Bad pratice insert a big file in your executable!
[SHOWTOGROUPS=4,20]
Code:
unit uFormMain;
interface
uses
System.SysUtils,
System.Types,
System.UITypes,
System.Classes,
System.Variants,
FMX.Types,
FMX.Controls,
FMX.Forms,
FMX.Graphics,
FMX.Dialogs,
FMX.Media,
FMX.Controls.Presentation,
FMX.StdCtrls,
FMX.Layouts,
FMX.ListBox,
FMX.ScrollBox,
FMX.Memo;
type
TfrmFormMain = class(TForm)
MediaPlayer1: TMediaPlayer;
btnReading_MP3_on_Resources: TButton;
mmMyLogs: TMemo;
btn_MediaPlayer_Stop: TButton;
procedure btnReading_MP3_on_ResourcesClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btn_MediaPlayer_StopClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmFormMain: TfrmFormMain;
implementation
{$R *.fmx}
uses
System.IOUtils,
FMX.DialogService;
var
lMyPathToResouces: string;
function fncMyExceptions(lMyExcept: Exception): string;
begin
// here, I dont worry about override my resulted ok!!!
if lMyExcept is EResNotFound then
result := '[my error EResNotFound class]';
if lMyExcept is Exception then
result := '[my error generic threat]';
if lMyExcept is EFCreateError then
result := '[my error EFCreateError class]';
if lMyExcept is EMediaException then
result := '[my error EMediaException class]';
if lMyExcept is Exception then
result := '[my error generic threat]' + #13#10;
//
result := result + #13#10 + lMyExcept.ClassName + #13#10 + lMyExcept.Message;
end;
procedure TfrmFormMain.btnReading_MP3_on_ResourcesClick(Sender: TObject);
var
lMyStream: TResourceStream;
begin
// SysInit.pas HInstance: HINST; { Handle of this instance }
// { Handle of the main(.EXE) HInstance }
//
try
lMyStream := nil; // avoid errors below!!!
//
// RT_Data = Application-defined resource (raw data)!!
// lMyStream := TResourceStream.CreateFromID( HInstance, 0, RT_RCDATA); // only if your res was indetifyed by number
lMyStream := TResourceStream.Create(HInstance, 'Musica_001', RT_RCDATA); // only if your res was indetifyed by "string"
except
on E: Exception do
begin
mmMyLogs.Lines.Add( fncMyExceptions(E) );
// exit;
end;
end;
//
if not(lMyStream = nil) then
begin
//
try
// saving my resource like a MP3 file to play it!
// NOTE: Tags stay like original file source!
//
// needs save in a file to play in TMediaPlayer
// FMX.Media.pas, line 1633
lMyStream.SaveToFile('MyResourceSaved.mp3');
//
try
// use DisposeOf and nil to new project Cross-Platform, or, use FreeAndNil(lMyStream) to MSWindows only!!!
lMyStream.DisposeOf;
lMyStream := nil; // avoid errors below!!
//
if FileExists(lMyPathToResouces + 'MyResourceSaved.mp3', false) then { MSWindows and POSIX }
begin
MediaPlayer1.FileName := lMyPathToResouces + 'MyResourceSaved.mp3'; // EMediaException can occurr here!!!
MediaPlayer1.Play;
end
else
mmMyLogs.Lines.Add('--> ' + lMyPathToResouces + 'MyResourceSaved.mp3, Dont exist!!!');
except
on E: Exception do
mmMyLogs.Lines.Add( fncMyExceptions(E) )
// exit;
end;
finally
if Assigned(lMyStream) then
begin // FreeAndNil(lMyStream)
lMyStream.DisposeOf;
lMyStream := nil;
end;
end;
end;
end;
procedure TfrmFormMain.btn_MediaPlayer_StopClick(Sender: TObject);
begin
if MediaPlayer1.State = TMediaState.Playing then
begin
MediaPlayer1.Stop;
//
try
DeleteFile(lMyPathToResouces + 'MyResourceSaved.mp3'); // MSWindows and POSIX
//
TDialogService.ShowMessage('Stopped and file deleted!'); // Verify: file is "playing" cannot be deleted!!!
except
on E: Exception do
mmMyLogs.Lines.Add( fncMyExceptions(E) )
end;
end
else
TDialogService.ShowMessage('Nothing been played!');
end;
procedure TfrmFormMain.FormCreate(Sender: TObject);
begin
mmMyLogs.Lines.Clear;
end;
initialization
lMyPathToResouces := ExtractFilePath(Paramstr(0)); // MSWindows old way!
// new Cross-Platform way!!!
// lMyPathToResouces := TPath.GetDocumentsPath + '\';
{ /storage/emulated/0/Documents }
// lMyPathToResouces := TPath.GetSharedDocumentsPath + '\';
{ /storage/emulated/0/Music }
// lMyPathToResouces := TPath.GetSharedMusicPath + '\';
finalization
end.
Last edited: