Csharp/C#教程:如何使用System.Media.SoundPlayer异步播放声音文件?分享


如何使用System.Media.SoundPlayer异步播放声音文件?

这是一个看似简单的问题:

在Windows窗体中异步播放嵌入式.wav资源文件的正确方法是什么?

尝试#1:

var player = new SoundPlayer(); player.Stream = Resources.ResourceManager.GetStream("mySound"); player.Play(); // Note that Play is asynchronous 

尝试#2:

 using (var audioMemory = Resources.ResourceManager.GetStream("mySound")) { using (var player = new SoundPlayer(audioMemory)) { player.Play(); } } 

尝试#3:

 using (var audioMemory = Resources.ResourceManager.GetStream("mySound")) { using (var player = new SoundPlayer(audioMemory)) { player.PlaySync(); } } 

尝试#4:

 ThreadPool.QueueUserWorkItem(ignoredState => { using (var audioMemory = Resources.ResourceManager.GetStream("mySound")) { using (var player = new SoundPlayer(audioMemory)) { player.PlaySync(); } } }); 

似乎SoundPlayer应该有PlayAsyncCompleted事件。 不幸的是,不存在这样的事件。 我错过了什么吗? 在Windows窗体中异步播放.wav嵌入式资源的正确方法是什么?

我没有足够的声誉来评论,所以我只是回答。

如果您播放声音的要求“看似简单”(您只想在单个winform用户执行某些操作时偶尔播放声音),那么我将使用上面的尝试#4。

拉里·奥斯特曼(Larry Osterman)的“这个代码部分26有什么问题”让他的“系统”在每次按键时都会关闭一个新的线程池线程(播放声音)。 他指出,在敲打它的过程中,在大约15秒的时间内打破了默认的500线程池大小,但这也是使用异步RPC同时使用线程池的客户端/服务器应用程序。 真的不是一个“看似简单”的应用程序。

如果您尝试每秒(或更快)将声音字节排队10秒或100秒,那么它实际上不是“简单应用程序”,排队的线程/优先级子系统可能是有序的。

我仍然使用win32 API中的ol’waveOut____函数。 这是一个很好的代码示例:

https://www.codeproject.com/KB/audio-video/cswavplay.aspx

编辑 :一个更简单的问题解决方案是提取嵌入的资源,将其保存为某个地方的真实文件,然后使用SoundPlayer播放该文件。 有点笨重,但很简单,你不会有资源处理问题。

上述就是C#学习教程:如何使用System.Media.SoundPlayer异步播放声音文件?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1023145.html

(0)
上一篇 2022年1月7日
下一篇 2022年1月7日

精彩推荐