Я экспериментирую с тем, как играть в mp3, используя Naudio. У моего простого приложения есть одна форма окна и одна кнопка для воспроизведения/паузы музыки. Однако приложение имеет две основные проблемы:NAudio.MmException
Хотя предполагалось, что если музыка воспроизводится и нажата кнопка воспроизведения, приложение должно прекратить воспроизведение. Вместо этого при повторном нажатии кнопки приложение перезапускает музыку, а затем (когда-то) генерирует исключение Если кнопка нажата два или три раза (и без каких-либо задержек), приложение выведет NAudio.MmException (Message = InvalidParameter вызов acmStreamClose) Может кто-нибудь сказать мне, что случилось с моим кодом? Ниже мой код:
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();
}
}
}
Спасибо. Я собираюсь попробовать это сразу –
Я не уверен, что я помещаю вышеуказанный фрагмент в нужное место, но всякий раз, когда я это делаю, я получаю эту синтаксическую ошибку: «Невозможно неявно преобразовать тип« NAudio.Wave.WaveOut »в« NAudio .Wave.DirectSoundOut». Означает ли это, что я не должен использовать DirectSoundOut? –
Вы должны изменить объявление 'private NAudio.Wave.DirectSoundOut output = null;' в 'private NAudio.Wave.WaveOutoutput = null;' –