2010-08-25 127 views
1

我希望在delphi中同時播放多個.wav文件。如何在delphi中同時播放多個.wav文件

當我打開並製作第一個東西時很好。 但是,第二個嘗試打開時會導致錯誤。

看來我一次只能使用一個媒體播放器......有沒有辦法解決這個問題我該怎麼做?

回答

4

您將如何播放單個聲音?當我需要精細控制時,我使用waveOut函數,如this answer。我的答案還允許您使用線程播放聲音(也就是說,異步地播放聲音)。我認爲,你可以同時播放兩個聲音,只需同時啓動兩個這樣的線程,如果你只用全局threadvar s代替全局var 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?

+0

與SND_ASYNC的PlaySound應該工作得很好。我猜想原始的海報使用TMediaPlayer組件。 – 2010-08-25 16:12:11

+0

@VilleK:剛試過。這是行不通的。 – 2010-08-25 20:00:24

+0

對不起,你是對的。在我首先驗證它之前,我仍然沒有學會不發佈任何東西:-) – 2010-08-26 07:25:45

2

您可以使用DirectShow變換濾波器它是一個Microsoft Windows應用程序編程接口(API),允許Windows應用程序進行交互和控制Windows的「媒體」的輸入設備,

或者你可以用WaveMix DLL它是一種實用工具允許同時播放多個WAV文件。它的設計儘可能簡單,但仍然有能力完成遊戲所需的功能。該DLL支持8個同時播放通道,可以沿同一通道排隊波形和完成波形通知。

-1

您可以使用SoX (Sound eXchange)。它可以播放和錄製音頻文件,應用各種效果,轉換各種格式....
檢查-m參數來同時播放文件。 例如:

sox -m 1.wav 2.wav -d 
+1

說明如何使用外部可執行文件來播放它們。但它並沒有回答這個問題,但是,如何在德爾福**中同時播放多個.wav文件。 – 2010-08-25 14:12:04

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

雖然這可能是解決問題的有價值的提示,但一個好的答案也可以證明解決方案。請[編輯](http://stackoverflow.com/posts/5419867/edit)提供示例代碼來展示你的意思。或者,可以考慮將其寫爲註釋 – 2017-01-16 16:59:15