当你想在你的代码中找到一个错误时,这很难;当你认为你的代码是不会有错误时,这就更难了。

音频-如何在Delphi中同时播放多个.wav文件

admin 98℃
我希望在Delphi中同时有多个.wav文件。

当我打开盘子的时候,第一件事就好了。 但是,第二个在尝试打开时会导致错误。

看来我一次只能使用一个媒体播放器…有办法吗?我该怎么办?

你怎么弹一个音?当我想要更好的控制时,我使用 waveOut 函数,如this answer中的函数。我的答案还允许您使用线程播放声音(即,除其他外,异步播放)。我认为你可以同时播放两个声音,只要同时启动两个这样的线程,如果你只替换global var S与全球 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.

只播放后一个wave文件。

更新3

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

否则:DirectX?

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

或者可以使用WaveMix DLL这是一个允许同时播放多个wav文件的实用程序。它的设计尽可能简单易用,但仍然有能力做游戏所要求的事情。动态链接库支持8个通道的同步波形播放,能够沿同一通道排队波形并发出波形完成通知。

我是这样做的:

//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;

我想我们可以使用

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);

转载请注明:我的代码 » 音频-如何在Delphi中同时播放多个.wav文件