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

时间:2010-08-25 08:10:14

标签: delphi audio media-player pascal wav

我希望在delphi中同时使用多个.wav文件。

当我打开并平台时,第一件事情都很好。 但是,第二个尝试打开时会导致错误。

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

6 个答案:

答案 0 :(得分:4)

你会怎么播放一个声音?当我需要精确控制时,我使用waveOut函数,如this answer中所示。我在那里的答案也允许你使用一个线程(也就是异步)来播放声音。我认为你可以同时播放两个声音,只需要同时启动两个这样的线程,如果你只用全局var替换全局threadvar s

更新

播放单个声音的最简单方法是使用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?

答案 1 :(得分:2)

您可以使用DirectShow转换过滤器,它是一个Microsoft Windows应用程序编程接口(API),使Windows应用程序能够与Windows“媒体”输入设备进行交互和控制,

或者您可以使用WaveMix DLL它是一个允许同时播放多个WAV文件的实用程序。它的设计尽可能简单,但仍然有能力完成游戏所需的功能。 DLL支持8个同时波播放通道,能够沿同一通道排队波和波完成通知。

答案 2 :(得分:1)

我是通过做这样的事情做到的:

//yup, i used more than 1 MediaPlayer controls.
MediaPlayer1.FileName:='song1.wav';
MediaPlayer2.FileName:='song2.wav';
MediaPlayer1.Open;
MediaPlayer2.Open;
MediaPlayer1.Play;
MediaPlayer2.Play;


//the next lines of code is checked every so often in my Timer event handler.
if MediaPlayer1.Position=MediaPlayer1.Length then begin
       MediaPlayer1.Close;
end;

if MediaPlayer2.Position=MediaPlayer2.Length then begin
       MediaPlayer2.Close;
end;

答案 3 :(得分:0)

我认为我们可以使用

sndPlaySound('filename1.wav',SND_SYN OR SND_NODEFAULT);
sndPlaySound('filename2.wav',SND_SYN OR SND_NODEFAULT);
sndPlaySound('filename3.wav',SND_SYN OR SND_NODEFAULT);
sndPlaySound('filename4.wav',SND_SYN OR SND_NODEFAULT);

答案 4 :(得分:0)

如果您希望模拟播放一个真正的异步wav文件,并且不中断其他文件, 真正的解决方案是mitov labs-audiolab。 http://mitov.com/products/audiolab sndPlaySound? mciSendString不起作用?不能按预期工作。 因此,没有简单的winapi解决方案或snd_async参数等起作用。 只有mitov audiolab表现出色。 检查并删除线程解决方案作为答案。它不能同时工作。 一波打断另一波。 mitov audiolab是为我工作的真正解决方案。所以在这里与人分享。希望这对某人有帮助。

答案 5 :(得分:-1)

您可以使用SoX (Sound eXchange)。它可以播放和录制音频文件,应用各种效果,转换各种格式.... 检查 -m 参数以同时播放文件。 例如:

sox -m 1.wav 2.wav -d