我希望在delphi 中同时处理多个.wav 文件。
当我打开并放置时,首先一切都很好。 然而,第二个在尝试打开时会导致错误。
看来我一次只能使用一个媒体播放器......有什么办法可以解决这个问题,我该怎么办?
最佳答案
你会如何播放单个声音?当我想要精细控制时,我使用 waveOut
函数,如 this answer 中。我的回答还允许您使用线程(即,异步地)播放声音。我认为,如果您只用全局 替换全局
s.var
,只需同时启动两个这样的线程,您就可以同时播放两种声音threadvar
更新
播放单个声音的最简单方法是使用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/