做一個(gè)項(xiàng)目,需要播放聲音,于是找了幾種方法。
首先用的是Soundplayer,它在.NET 自帶的類庫 System.Media 下。
Soundplayer這家伙有一個(gè)特點(diǎn)就是只能播放一個(gè)音頻文件,不論你new出多少個(gè)Soundplayer,它總是播放最后一個(gè)音頻。只要其中任何一個(gè)Soundplayer被停止,馬上就沒聲音了!
后來就換DirectSound,它需要下載并安裝Micrisoft DirectX SDK。
這家伙雖然可以多個(gè)音頻同時(shí)播放,但是,它有一個(gè)怪癖,就是只要窗口沒有被聚焦,它就Shut up了。
后來又試了AxWindowsMediaPlayer,這個(gè)玩意呢它好像只能指定音頻路徑,但是,我想要直接調(diào)用資源文件里面的音頻,所以,我拋棄它!
最后,無意中搜到NAudio,于是就開始研究它!
這玩意也是有點(diǎn)毛病,竟然沒有循環(huán)播放的方法,網(wǎng)上找了老半天也沒有人做過這個(gè),倒是不少人抄那篇“用C#和NAudio解碼庫播放mp3示例”。
只能自己研究了,最終的MyPlayer代碼:
BlockAlignReductionStream blockAlignedStream;
if(blockAlignedStream != null)
blockAlignedStream.Dispose();
reader = new WaveFileReader(value);
pcmStream = WaveFormatConversionStream.CreatePcmStream(reader);
blockAlignedStream = new BlockAlignReductionStream(pcmStream);
player = new WaveOut(WaveCallbackInfo.FunctionCallback());
player.PlaybackStopped += new System.EventHandler<StoppedEventArgs>(player_PlaybackStopped);
public MyPlayer(Stream media) {
public int Looping { get; set; }
if(player != null && player.PlaybackState == PlaybackState.Playing)
if(blockAlignedStream != null) {
blockAlignedStream.Position = 0;
player.Init(blockAlignedStream);
void player_PlaybackStopped(object sender, StoppedEventArgs e) {
if(timer >= 0 && (Looping == 0 || Looping < timer)) {
blockAlignedStream.Position = 0;
player.Init(blockAlignedStream);
if(blockAlignedStream != null)
blockAlignedStream.Dispose();
該文章在 2021/2/1 10:01:40 編輯過