Delphi如何将MP3 / MP4文件或其他资源(如资源)插入可执行文件并在MediaPlayer中播放(Delphi FireMonkey / VCL)。欢迎加入Delphi知识局QQ群:32422310
注意1:别忘了,在Android / iOS中,您需要特权,例如:在存储(内部或外部)中读取/写入资源,播放某些资源等。研究在您的应用程序中使用“特权”!
注意2:糟糕的做法是在颈椎枕可执行文件中插入一个大文件!
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.