使用项目中的wave文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用项目中的wave文件相关的知识,希望对你有一定的参考价值。

我目前只能在我编译的exe旁边放置我的wave文件来播放我的背景声音。但我实际上想要一个带有wave文件的静态可执行文件。这在Delphi XE2中是否可行?

这是我的代码:

SndPlaySound('.Raw.wav', SND_ASYNC or SND_LOOP);
#This will play the Raw.wav that is next to my program.
答案

如果您使用PlaySound()而不是sndPlaySound(),您可以使用SND_RESOURCE标志直接从其资源播放波形声音,而无需先将其加载到内存中。

另一答案

您可以添加SND_MEMORY标志,并将TResourceStream.Memory指针作为第一个参数传递。

首先,使用XE2的Project->Resources and Images菜单项添加新资源。为它提供.wav文件的路径和文件名,资源类型为RC_DATA(它不在下拉列表中,但您可以手动输入),以及您可以在运行时使用的资源名称来引用它。 (在我的例子中,我使用C:Microsoft OfficeOffice12MEDIAAPPLAUSE.WAV,并给它一个资源名称APPLAUSE。)

procedure TForm2.Button1Click(Sender: TObject);
var
  Res: TResourceStream;
begin
  Res := TResourceStream.Create(HInstance, 'APPLAUSE', 'RC_DATA');
  try
    Res.Position := 0;
    SndPlaySound(Res.Memory, SND_MEMORY or SND_ASYNC or SND_LOOP);
  finally
    Res.Free;
  end;
end;
另一答案

刚刚测试过它适用于我的:

var
  hFind, hRes: THandle;
  Song       : PChar;
begin
  hFind := FindResource(HInstance, 'BATTERY', 'WAV');
  if (hFind <> 0) then
  begin
    hRes := LoadResource(HInstance, hFind);
    if (hRes <> 0) then
    begin
      Song := LockResource(hRes);
      if Assigned(Song) then
      begin
        SndPlaySound(Song, snd_ASync or snd_Memory);
      end;
      UnlockResource(hRes);
    end;
    FreeResource(hFind);
  end;

另一答案

在资源编辑器(Delphi 10,项目,资源和图像)中导入wav文件时键入“WAVE”作为资源类型并简单地使用

   PlaySound(resourceIndentifierName, 0, SND_RESOURCE or SND_ASYNC);

附:不再需要大写

以上是关于使用项目中的wave文件的主要内容,如果未能解决你的问题,请参考以下文章

保存在 wave 中的 NAudio 文件在文件中添加了填充

WAV 文件 (.wav) 和 WAVE 音频文件 (.wave) 有啥区别?

matlab中的FFT,出乎意料的结果

python中的wave库:2个通道和2个样本宽度

Eclipse 中的通用代码片段或模板

PCM Wave 文件中的数据长度使用 MemoryStream 和 WaveFileWriter