在firemonkey中播放声音

时间:2015-10-01 16:42:47

标签: android delphi media-player firemonkey

我使用Firemonkey部署一个Android应用程序,其中包含音频文件。 我有大约30个动物按钮,当用户选择它时,每个按钮都会听到动物的声音。这是第一个按钮的代码:

procedure TFMain.buttonLionClick(Sender: TObject);
begin
  MediaPlayer1.FileName := 'D:\lion.mp3';
  MediaPlayer1.Play;
end;

但它失败了。如何将声音部署到我的应用程序中?

3 个答案:

答案 0 :(得分:4)

首先,如果你想为Android构建你的应用程序,你需要将.mp3转换为.3gp才能播放它。 (您可以使用此网站:http://video.online-convert.com/convert-to-3gp;只需上传您的文件并点击转换即可。)

其次,您需要在资源中包含您的文件;转到项目>资源和图像,然后选择查看所有文件,然后选择.3gp文件并添加它们。

现在您可以制作一个程序来播放资源中的声音和音乐: (使用TMediaPlayer)

procedure TForm1.PlayAudio(ResourceID: string); //PLAY MUSIC FROM RESOURCES
var
  ResStream: TResourceStream;
  TmpFile: string;
begin

  ResStream := TResourceStream.Create(HInstance, ResourceID, RT_RCDATA);
  try

    TmpFile := TPath.Combine(TPath.GetDocumentsPath, 'tmp.3gp');

    //TPath.Combine(TPath.GetDocumentsPath, 'filename')  { Internal }
    //TPath.Combine(TPath.GetSharedDocumentsPath, 'filename')  { External }

    ResStream.Position := 0;
    ResStream.SaveToFile(TmpFile);

    MediaPlayer1.FileName := TmpFile;
    MediaPlayer1.Play;

  finally
    ResStream.Free;
  end;

end;

注意:您需要这样做,因为您无法直接从您的资产中播放文件,在部署到Android时会保存资源。

现在播放音乐只需使用例如:PlayAudio('Resource_1')

注意:在播放新音频之前,您需要使用以下命令停止前一个音频:

MediaPlayer1.Stop;
MediaPlayer1.Clear;

如果您想循环播放音乐,那么您可以使用TTimer在播放结束后重播声音。

注意:这适用于android。在Windows上使用.mp3,.wav或类似的内容和TPath.Combine(TPath.GetTempPath, 'tmp.wav')来获取您在Windows上的路径。

答案 1 :(得分:2)

Android应用程序使用Android设备上的文件。 D:\test.mp3告诉我这个文件驻留在Windows计算机上,也许是你的开发机器。这不是它的工作原理,Android不知道你的开发机器上的文件。您需要使用Android设备上的文件,并引用该路径(使用Android将识别的适当路径结构)。

您似乎希望将这些文件部署到Android设备。在那种情况下,研究:

http://docwiki.embarcadero.com/RADStudio/XE8/en/Deployment_Manager

答案 2 :(得分:1)

您的根本问题是缺乏对不同文件系统之间差异的理解。一些(Windows,DOS)使用驱动器样式通知(后跟一个字母':')但许多(例如Unix衍生产品,OS X,iOS等)没有,看到驱动器名称为只是更一般的文件结构的一部分。另外windows / dos使用' \'作为分隔符,大多数其他人使用' /'。 Fire monkey提供了许多特殊的位置和分隔符来帮助您构建通用代码。