我希望在delphi中同时使用多个.wav文件。
当我打开并平台时,第一件事情都很好。 但是,第二个尝试打开时会导致错误。
看来我一次只能使用一个媒体播放器....有什么方法可以解决这个问题吗?
答案 0 :(得分:4)
你会怎么播放一个声音?当我需要精确控制时,我使用waveOut
函数,如this answer中所示。我在那里的答案也允许你使用一个线程(也就是异步)来播放声音。我认为你可以同时播放两个声音,只需要同时启动两个这样的线程,如果你只用全局var
替换全局threadvar
s
播放单个声音的最简单方法是使用PlaySound
。这可以异步使用,但是因为你问这个问题,我认为这不允许你连续两次使用这个函数来开始同时播放两个文件。但是:如果你创建一个只播放声音的线程(同步以便线程在播放完成之前不会死亡),那么你可以可能使用两个这样的线程同时播放两个音频文件。 (我现在无法访问Delphi编译器,所以我担心我无法测试我的假设。)
我的假设是,如果仅从两个不同的线程调用该函数,则可以使用两次调用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.
并且只播放了后一个波形文件。
我实际上已经编写了一个小型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