我正在使用Firemonkey编写一个Android应用。
由于这个原因,我无法使用MMSystem的功能sndPlaySound来播放资源文件,因为那只是Windows。
Firemonkey支持媒体播放器的工作和资源。但媒体播放器无法直接使用资源文件。
如何使用TMediaPlayer播放资源中的声音?
答案 0 :(得分:3)
播放不在文件中的媒体
TMediaPlayer本身不实现任何非文件系统数据源, 因此,您必须实现自己的自定义编解码器/媒体类才能访问 (并播放)您想要的资源数据。 TMediaPlayer本身就是 不关心文件系统上是否存在FileName。它简单地问了 TMediaCodecManager类可以检索一个合适的TMedia对象来访问和 播放FileName引用的任何来源的数据。
创建一个派生自FMX.Media.TMedia的自定义类并实现它 根据需要抽象方法(DoPlay(),DoStop(),GetDuration()等)。这个 class访问并播放实际的媒体数据,因此您可以传递所需的 FileName到它并让它根据需要加载/访问您的资源流。看 在默认的TMedia实现示例(FMX.Media.Win.TWindowsMedia, FMX.Media.Mac.TQTMedia等。)
创建一个派生自FMX.Media.TCustomMediaCodec并实现的自定义类 它的抽象CreateFromFile()方法返回自定义的实例 TMedia课程。然后,您可以在程序启动时使用注册此类 FMX.Media.TMediaCodecManager.RegisterMediaCodecClass()。诀窍在于 你必须使用文件扩展名注册该类,所以选择一些东西 这是唯一的,不能混淆真实的文件。
例如:
unit PlayMediaFromResource;
uses
..., FMX.Media;
type
TMyResourceMedia = class(TMedia)
...
protected
function GetDuration: TMediaTime; override;
function GetCurrent: TMediaTime; override;
procedure SetCurrent(const Value: TMediaTime); override;
function GetVideoSize: TPointF; override;
function GetMediaState: TMediaState; override;
function GetVolume: Single; override;
procedure SetVolume(const Value: Single); override;
procedure UpdateMediaFromControl; override;
procedure DoPlay; override;
procedure DoStop; override;
public
constructor Create(const AFileName: string); override;
destructor Destroy; override;
end;
TMyResourceMediaCodec = class(TCustomMediaCodec)
public
function CreateFromFile(const AFileName: string): TMedia; override;
end;
function TMyResourceMediaCodec.CreateFromFile(const AFileName: string): TMedia;
begin
Result := TMyResourceMedia.Create(AFileName);
end;
constructor TMyResourceMedia.Create(const AFileName: string);
var
ResName: string;
begin
ResName := ChangeFileExt(AFileName, ''); // strip off '.myres' file extension
// load resource identified by ResName as needed...
end;
....
initialization
TMediaCodecManager.RegisterMediaCodecClass('.myres', 'My Resource Stream',
TMediaType.Audio, TMyResourceMediaCodec);
然后你可以这样做:
MediaPlayer1.FileName := 'MyResourceName.myres';
MediaPlayer1.Play;
end;
-
或者您可以将资源保存到文件
如果你能以某种方式将资源保存到文件并从那里播放,那么一切都会更容易。您可以使用库存TMediaPlayer
当你完成游戏时别忘了删除文件,否则你将填满磁盘。