我正在试验如何使用Naudio播放mp3。我的简单应用程序有一个windows窗体和一个播放/暂停音乐的按钮。然而,这款应用有两个主要问题:
虽然它的目的是,如果音乐正在播放,并按下播放按钮,应用程序应该停止播放。相反,当按钮被重新按下时,应用程序会重新启动音乐,然后(有时)会抛出一个异常如果按钮被按下两三次(并且没有任何延迟),应用程序会抛出一个NAudio.MmException (Message=InvalidParameter Can )谁能告诉我我的代码出了什么问题?下面是我的代码:
using System;
using System.Windows.Forms;
namespace NaudioTesting
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private NAudio.Wave.BlockAlignReductionStream stream = null;
private NAudio.Wave.DirectSoundOut output = null;
public void LoadFile(string filePath)
{
DisposeWave();
if (filePath.EndsWith(".mp3"))
{
NAudio.Wave.WaveStream pcm =
NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(new NAudio.Wave.Mp3FileReader(filePath));
stream = new NAudio.Wave.BlockAlignReductionStream(pcm);
}
else if (filePath.EndsWith(".wav"))
{
NAudio.Wave.WaveStream pcm = new NAudio.Wave.WaveChannel32(new NAudio.Wave.WaveFileReader(filePath));
stream = new NAudio.Wave.BlockAlignReductionStream(pcm);
}
else throw new InvalidOperationException("Not a correct audio file type.");
output = new NAudio.Wave.DirectSoundOut();
output.Init(stream);
output.Play();
}
private void playPauseButton_Click(object sender, EventArgs e)
{
string filePath = "GetLoud.mp3";
LoadFile(filePath);
if (output != null)
{
if (output.PlaybackState == NAudio.Wave.PlaybackState.Playing) output.Pause();
else if (output.PlaybackState == NAudio.Wave.PlaybackState.Paused) output.Play();
}
}
private void DisposeWave()
{
try
{
if (output != null)
{
if (output.PlaybackState == NAudio.Wave.PlaybackState.Playing) output.Stop();
output.Dispose();
output = null;
}
if (stream != null)
{
stream.Dispose();
stream = null;
}
}
catch (NAudio.MmException)
{
throw;
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
DisposeWave();
}
}
}发布于 2011-12-30 11:54:52
查看DirectSoundOut源代码,Play和Pause的实现不支持恢复。也就是说,发生在你身上的事情正是它应该发生的。调用play将始终从流的开始处开始。您应该改用WaveOut。它支持通过再次调用Play来恢复,就像您在代码中所做的那样。
output = new NAudio.Wave.WaveOut();https://stackoverflow.com/questions/8675891
复制相似问题