我希望在delphi中同時播放多個.wav文件。如何在delphi中同時播放多個.wav文件
當我打開並製作第一個東西時很好。 但是,第二個嘗試打開時會導致錯誤。
看來我一次只能使用一個媒體播放器......有沒有辦法解決這個問題我該怎麼做?
我希望在delphi中同時播放多個.wav文件。如何在delphi中同時播放多個.wav文件
當我打開並製作第一個東西時很好。 但是,第二個嘗試打開時會導致錯誤。
看來我一次只能使用一個媒體播放器......有沒有辦法解決這個問題我該怎麼做?
您將如何播放單個聲音?當我需要精細控制時,我使用waveOut
函數,如this answer。我的答案還允許您使用線程播放聲音(也就是說,異步地播放聲音)。我認爲,你可以同時播放兩個聲音,只需同時啓動兩個這樣的線程,如果你只用全局threadvar
s代替全局var
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?
您可以使用DirectShow變換濾波器它是一個Microsoft Windows應用程序編程接口(API),允許Windows應用程序進行交互和控制Windows的「媒體」的輸入設備,
或者你可以用WaveMix DLL它是一種實用工具允許同時播放多個WAV文件。它的設計儘可能簡單,但仍然有能力完成遊戲所需的功能。該DLL支持8個同時播放通道,可以沿同一通道排隊波形和完成波形通知。
您可以使用SoX (Sound eXchange)。它可以播放和錄製音頻文件,應用各種效果,轉換各種格式....
檢查-m參數來同時播放文件。 例如:
sox -m 1.wav 2.wav -d
說明如何使用外部可執行文件來播放它們。但它並沒有回答這個問題,但是,如何在德爾福**中同時播放多個.wav文件。 – 2010-08-25 14:12:04
我做到了,做這樣的事情:
//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);
雖然這可能是解決問題的有價值的提示,但一個好的答案也可以證明解決方案。請[編輯](http://stackoverflow.com/posts/5419867/edit)提供示例代碼來展示你的意思。或者,可以考慮將其寫爲註釋 – 2017-01-16 16:59:15
與SND_ASYNC的PlaySound應該工作得很好。我猜想原始的海報使用TMediaPlayer組件。 – 2010-08-25 16:12:11
@VilleK:剛試過。這是行不通的。 – 2010-08-25 20:00:24
對不起,你是對的。在我首先驗證它之前,我仍然沒有學會不發佈任何東西:-) – 2010-08-26 07:25:45