LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

WinForm开发遇到播放声音的问题,最终采用NAudio实现

admin
2021年2月1日 10:1 本文热度 3377

做一个项目,需要播放声音,于是找了几种方法。

首先用的是Soundplayer,它在.NET 自带的类库 System.Media 下。

Soundplayer这家伙有一个特点就是只能播放一个音频文件,不论你new出多少个Soundplayer,它总是播放最后一个音频。只要其中任何一个Soundplayer被停止,马上就没声音了!

后来就换DirectSound,它需要下载并安装Micrisoft DirectX SDK。

这家伙虽然可以多个音频同时播放,但是,它有一个怪癖,就是只要窗口没有被聚焦,它就Shut up了。

后来又试了AxWindowsMediaPlayer,这个玩意呢它好像只能指定音频路径,但是,我想要直接调用资源文件里面的音频,所以,我抛弃它!

最后,无意中搜到NAudio,于是就开始研究它!

这玩意也是有点毛病,竟然没有循环播放的方法,网上找了老半天也没有人做过这个,倒是不少人抄那篇“用C#和NAudio解码库播放mp3示例”。

只能自己研究了,最终的MyPlayer代码:


  1. using System.IO;
  2. using NAudio.Wave;
  3. partial class MyPlayer {
  4. WaveOut player;
  5. WaveFileReader reader;
  6. WaveStream pcmStream;
  7. BlockAlignReductionStream blockAlignedStream;
  8. public Stream Stream {
  9. set {
  10. if(reader != null)
  11. reader.Dispose();
  12. if(pcmStream != null)
  13. pcmStream.Dispose();
  14. if(blockAlignedStream != null)
  15. blockAlignedStream.Dispose();
  16. reader = new WaveFileReader(value);
  17. pcmStream = WaveFormatConversionStream.CreatePcmStream(reader);
  18. blockAlignedStream = new BlockAlignReductionStream(pcmStream);
  19. if(player != null)
  20. player.Dispose();
  21. player = new WaveOut(WaveCallbackInfo.FunctionCallback());
  22. player.PlaybackStopped += new System.EventHandler<StoppedEventArgs>(player_PlaybackStopped);
  23. }
  24. }
  25. public MyPlayer(Stream media) {
  26. Stream = media;
  27. }
  28. public MyPlayer() { }
  29. public int Looping { get; set; }
  30. int timer;
  31. public void Play() {
  32. timer = 0;
  33. if(player != null && player.PlaybackState == PlaybackState.Playing)
  34. return;
  35. if(blockAlignedStream != null) {
  36. blockAlignedStream.Position = 0;
  37. player.Init(blockAlignedStream);
  38. player.Play();
  39. }
  40. }
  41. void player_PlaybackStopped(object sender, StoppedEventArgs e) {
  42. if(timer >= 0 && (Looping == 0 || Looping < timer)) {
  43. blockAlignedStream.Position = 0;
  44. player.Init(blockAlignedStream);
  45. player.Play();
  46. }
  47. timer++;
  48. }
  49. public void Stop() {
  50. timer = int.MinValue;
  51. if(player != null) {
  52. player.Stop();
  53. }
  54. }
  55. public void Dispose() {
  56. if(reader != null)
  57. reader.Dispose();
  58. if(pcmStream != null)
  59. pcmStream.Dispose();
  60. if(blockAlignedStream != null)
  61. blockAlignedStream.Dispose();
  62. if(player != null) {
  63. player.Stop();
  64. player.Dispose();
  65. }
  66. }
  67. }


该文章在 2021/2/1 10:01:40 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved