delphi - 如何在delphi中同时播放多个.wav文件

标签 delphi audio media-player pascal wav

我希望在delphi 中同时处理多个.wav 文件。

当我打开并放置时,首先一切都很好。 然而,第二个在尝试打开时会导致错误。

看来我一次只能使用一个媒体播放器......有什么办法可以解决这个问题,我该怎么办?

最佳答案

你会如何播放单个声音?当我想要精细控制时,我使用 waveOut 函数,如 this answer 中。我的回答还允许您使用线程(即,异步地)播放声音。我认为,如果您只用全局 替换全局 var,只需同时启动两个这样的线程,您就可以同时播放两种声音threadvars.

更新

播放单个声音的最简单方法是使用PlaySound。这可以异步使用,但既然你问这个问题,我假设这不允许你连续两次使用这个函数来开始同时播放两个文件。但是:如果您创建一个仅播放声音的线程(同步,以便线程在播放完成之前不会终止),那么您可能可以使用两个这样的线程线程同时播放两个音频文件。 (我现在无法访问 Delphi 编译器,所以我担心我无法测试我的假设。)

更新2

我的假设是,如果仅从两个不同的线程调用该函数,则可以使用两次对 PlaySound 的调用,但显然这还不够好。看来你确实需要两个不同的过程,这很糟糕(显而易见)。我试过了

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TSoundPlayerThread.Create(true) do
  begin
    SetFileName('C:\Users\Andreas Rejbrand\Downloads\Anna.wav');
    FreeOnTerminate := true;
    Resume;
  end;

  with TSoundPlayerThread.Create(true) do
  begin
    SetFileName('C:\Users\Andreas Rejbrand\Downloads\Mike.wav');
    FreeOnTerminate := true;
    Resume;
  end;
end;

unit SoundPlayerThread;

interface

uses
  Classes, MMSystem, Windows;

type
  TSoundPlayerThread = class(TThread)
  private
    { Private declarations }
    FAudioFileName: string;
  protected
    procedure Execute; override;
  public
    procedure SetFileName(const FileName: string);
  end;

implementation

procedure TSoundPlayerThread.Execute;
begin
  PlaySound(PChar(FAudioFileName), 0, SND_SYNC);
end;

procedure TSoundPlayerThread.SetFileName(const FileName: string);
begin
  FAudioFileName := FileName;
end;

end.

并且只播放了后一个波形文件。

更新3

我实际上写了一个小的WAV文件库。使用它,我可以加载两个 WAV 文件,合并它们,并将结果发送到音频驱动程序。但是,这里发布的代码太多。如果有一天我还有时间,我可能会编写一个更轻量级的 PlaySimultaneously 程序并将其发布。

否则:DirectX?

关于delphi - 如何在delphi中同时播放多个.wav文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3563974/

相关文章:

c# - UWP 不支持的视频类型 - 要捕获哪个事件?

delphi - 我应该如何为 TTreeNode 实现 GetLastNode?

delphi - 从通用容器中检索 TProc

apache-flex - Flex:直接从声卡录制音频

javascript - 网络音频API : smooth transitions between audio fades in/out

java - 使用特定应用程序 java 打开 mp3 文件

c++ - 如何在 Qt 中制作工作音量 slider ?

delphi - 在Windows Vista 64位环境下从命令行使用Delphi 2009进行编译

delphi - 壁纸更换

android - 如何在onPause和onResume上对其静音和取消静音