从资源播放.wav文件

时间:2016-03-24 13:48:53

标签: android delphi audio firemonkey

我正在使用Firemonkey编写一个Android应用

由于这个原因,我无法使用MMSystem的功能sndPlaySound来播放资源文件,因为那只是Windows。

Firemonkey支持媒体播放器的工作和资源。但媒体播放器无法直接使用资源文件。

如何使用TMediaPlayer播放资源中的声音?

1 个答案:

答案 0 :(得分:3)

To quote Remy Lebeau (TeamB):

播放不在文件中的媒体

  

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 当你完成游戏时别忘了删除文件,否则你将填满磁盘。