2012-08-06 107 views
2

在C#中,我無法從System.Media獲取SoundPlayer類,從我的C:\ Windows \ Media文件夾中使用以下代碼播放任何wav。我得到的是沒有聲音:SoundPlayer不播放任何捆綁的Windows聲音PCM音頻文件

String filename = "C:\\Windows\\Media\\tada.wav"; 
SoundPlayer sp = new SoundPlayer(filename); 
sp.Load(); 
sp.Play(); 

我已經檢查了波形文件「tada.wav」有一個名爲「G點」節目,告訴我的音頻編解碼器是「PCM音頻」。我沒有收到任何編譯器警告或錯誤,並且在運行該程序時沒有發生異常。我只是沒有聽到任何聲音。我的揚聲器已打開,我可以使用Windows Media Player播放該文件。

將wav添加爲項目資源沒有任何區別。有人能幫我弄清楚爲什麼我聽不到任何聲音?

回答

1

您是否將此用作控制檯應用程序中main()方法的主體?該應用程序可能會結束,從而關閉播放音頻的線程。

我複製並將代碼粘貼到新的「Visual C#控制檯應用程序」的主體中。我添加了「使用System.Text;」在文件頂部的行,編譯,通過它,它的工作。當我運行它(沒有調試),我沒有聲音。

如果您添加一行:

System.Threading.Thread.Sleep(2000年);

對Play()的調用後,應用程序將保持足夠長的時間播放音頻。

+0

這就是答案,我添加了睡眠呼叫,問題解決了。非常感謝你解決這個問題。 – meschael 2012-08-06 21:49:26

+0

更正它是控制檯應用程序內部的主體。 – meschael 2012-08-06 21:51:39

+0

太棒了!另外,您還需要確保要設置的整數參數是音頻文件的長度(以毫秒爲單位)。 2000年爲2秒,但您可能需要更換較長的音頻文件。 – PaulPerry 2012-08-06 22:00:18

0

Play()方法將聲音作爲單獨的線程播放。也就是說,控制檯應用程序將創建一個新線程來播放聲音。這對Windows應用程序非常有用,這樣聲音播放不會停止Windows主線程。在控制檯應用程序中,當父線程結束時,子線程也都會死掉。 - 因此沒有聲音。

有一個PlaySync()方法不會產生一個新的線程,因此會保持控制檯應用程序線程活着,直到它完成播放聲音。