gpt4 book ai didi

c# - 为什么在 PlaybackStopped 触发后 PlaybackState 仍保持在 Playing?

转载 作者:行者123 更新时间:2023-11-30 16:25:06 26 4
gpt4 key购买 nike

我对使用 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,这非常棒。我遇到的问题是 PlaybackState 停留在 Playing 而不是在 PlaybackStopped 触发后更改为 Stopped。为了解决这个问题,我订阅了 PlaybackStopped 并从那里调用 Stop()

我必须像那样调用 Stop() 是正常的,还是我在这里遗漏了什么?

最佳答案

看起来像一个错误。如果您查看 NAudio 代码,WaveOut 将不会更改 RaisePlaybackStoppedEvent 中的 PlaybackState。但是 DirectSoundOut 会将其更改为已停止。有点疯狂。

关于c# - 为什么在 PlaybackStopped 触发后 PlaybackState 仍保持在 Playing?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10243031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com