3

私はNAudioの使用に少し慣れていないので、確かに重要な何かが欠けているので、この質問があります。

サンプル/デモコードから始めて、MP3またはWAVファイルを再生できるようにできる限り単純なクラスをまとめました。

public class AudioPlayer : IDisposable
{
    WaveStream _waveStream; // sound data stream
    WaveChannel32 _waveChannel32; // sound channel ??
    IWavePlayer _iWavePlayer; // sound output driver

    public bool IsPlaying
    {
        get { return _iWavePlayer != null 
                     && _iWavePlayer.PlaybackState 
                         != Wave.PlaybackState.Stopped; }
    }

    public PlaybackState PlaybackState
    {
        get { return _iWavePlayer.PlaybackState; }
    }

    public void LoadMp3(byte[] mp3Bytes)
    {
        Load(CreateInputStreamFromMp3Bytes(mp3Bytes));
    }

    public void LoadFile(string filename)
    {
        Load(CreateInputStream(filename));
    }

    void Load(WaveStream waveStream)
    {
        if (_iWavePlayer != null)
            Dispose();
        _iWavePlayer = new WaveOut();
        _iWavePlayer.PlaybackStopped += 
            new EventHandler(_iWavePlayer_PlaybackStopped);
        _waveStream = waveStream;
        _waveChannel32 = new WaveChannel32(_waveStream);
        _waveChannel32.PadWithZeroes = false;
        _iWavePlayer.Init(_waveChannel32);
    }

    void _iWavePlayer_PlaybackStopped(object sender, EventArgs e)
    {
        Stop();
    }

    static WaveStream CreateInputStreamFromMp3Bytes(byte[] mp3Bytes)
    {
        return new Mp3FileReader(new MemoryStream(mp3Bytes), false);
    }

    static WaveStream CreateInputStream(string fileName)
    {
        if (fileName.EndsWith(".wav"))
            return new WaveFileReader(fileName);
        else if (fileName.EndsWith(".mp3"))
            return new Mp3FileReader(fileName);
        else
            throw new InvalidOperationException("Unsupported extension");
    }

    public void Play()
    {
        _iWavePlayer.Play();
    }

    public void Stop()
    {
        if (_iWavePlayer != null 
                && _iWavePlayer.PlaybackState != PlaybackState.Stopped) { 
            _iWavePlayer.Stop();
            _waveStream.Position = 0;
        }
    }

    public void Dispose()
    {
        Stop();
        if (_iWavePlayer != null) {
            _iWavePlayer.Dispose();
            _iWavePlayer = null;
        }
        if (_waveChannel32 != null) {
            _waveChannel32.Dispose();
            _waveChannel32 = null;
        }
        if (_waveStream != null) {
            _waveStream.Dispose();
            _waveStream = null;
        }
    }
}

問題のコードを使用してMP3ファイル(WAVではない)を再生しています。

ほとんどの部分で問題なく動作します。プロジェクトでMediaElementsを置き換えることができることを考えると、これは非常にすばらしいことです。私が抱えている問題は、PlaybackStoppedが起動すると、に変更されるのではなく、そのPlaybackStateままになることです。それを回避するために、私はサブスクライブしてそこから電話をかけます。PlayingStoppedPlaybackStoppedStop()

私がそのように呼ばなければならないのは普通ですStop()か、それとも私がここで欠けているものがありますか?

4

2 に答える 2

2

バグのようです。NAudioコードを見ると、でWaveOut変更PlaybackStateされませんRaisePlaybackStoppedEvent。ただしDirectSoundOut、停止に変更します。ちょっとおかしい。

于 2012-08-09T14:24:08.200 に答える
1

これを試して:

Loadメソッドで、次の行を変更します。

_iWavePlayer = new WaveOut(); 

これで:

_iWavePlayer = new WaveOut(WaveCallbackInfo.FunctionCallback());
于 2014-05-29T14:01:25.820 に答える