1

我正在使用此代码从资源中播放 WAV 文件,并且音频播放正确,但是在播放后(大约 1/2 秒)我得到了短暂的静态爆炸:

//System.Media.SystemSounds.Beep.Play();
SoundPlayer sndPlayer = new SoundPlayer();
sndPlayer.Stream = Resources.Notify;
sndPlayer.Play();

如果我取消注释System.Media.SystemSounds.Beep.Play()上面的行,那么来自我的资源的哔声和通知声音都可以正确播放,并且没有静态。我已经尝试了上述代码的一些不同变体,并且总是得到静态的。我尝试将所有变量设为静态,以防与早期垃圾收集有关,但这并没有帮助。

WAV 文件只是我从c:\WINDOWS\Media\ding.wav(在 Windows XP 上)复制的一个文件,它在 Windows Media Player 中播放良好。另外,如果我使用 new SoundPlayer("c:\WINDOWS\Media\ding.wav"),它会从文件中正确播放。

我想这与那个UnmanagedMemoryStream有关Resources.Notify,也许我需要先将它加载到托管流中?我知道如果我不使用new Bitmap(Resource.MyPNG)并尝试Resource.MyPNG直接使用 PNG 文件,我会遇到问题,所以可能与 WAV 资源类似?

更新:我最初以为每次播放声音时都会发生这种情况,但现在看来它只发生在我第一次在我的应用程序中播放声音时。所以也许需要做一些初始化?

我也试过这个,同样的问题:

SoundPlayer sndPlayer = new SoundPlayer(Resources.Notify);
sndPlayer.Play(); 
4

2 回答 2

0

只是一台PC上的问题。从来没有弄清楚,其他应用程序似乎没有这个问题,但如果到目前为止仅在 1 台 PC 上(可能已测试 15 台)不值得我花时间。如果我得到一个,我会报告一个更好的答案。

于 2012-05-29T15:28:59.210 回答
0

这是 MS 使用My.Audio.Play()的内部实现,看看他们如何实例化 SoundPlayer 类,他们利用了重载的构造函数,该构造函数采用如下所示的 filePath或流

http://msdn.microsoft.com/en-us/library/system.media.soundplayer.aspx

public void Play(string location, AudioPlayMode playMode)
{
    this.ValidateAudioPlayModeEnum(playMode, "playMode");
    SoundPlayer sound = new SoundPlayer(this.ValidateFilename(location));
    this.Play(sound, playMode);
}

您可以在实例化 SoundPlayer 时尝试传入流吗?

于 2012-05-22T00:39:36.400 回答