---恢复内容开始---

PCM音频网络流播放,至于用处,就不多解释了。

一个简单的类,基于NAudio,一个简单的拼装类,实例化时三个参数,依次是采样率,系统播放设备Index,播放声道,调用PlayData方法传入PCM的音频流即可,有流就传进去,数据断了,播放自动停。

接下来把代码贴出来:

  1. public class PCMPlayer
  2. {
  3. private MonoToStereoProvider16 monoToStereoProvider16;
  4. private BufferedWaveProvider bufferedWaveProvider;
  5. private WaveOut waveOut;
  6. private bool isRunning = false;
  7. private PCMPlayerChannel currentChannel;
  8.  
  9. /// <summary>
  10. ///
  11. /// </summary>
  12. /// <param name="sampleRate">采样率8K至64K</param>
  13. /// <param name="deviceNumber">通过GetPlayDevices来获取字典的KEY值</param>
  14. /// <param name="playerChannel">初始化时播放的声道</param>
  15. public PCMPlayer(int sampleRate, int deviceNumber = , PCMPlayerChannel playerChannel = PCMPlayerChannel.Both)
  16. {
  17. currentChannel = playerChannel;
  18. WaveFormat = new WaveFormat(sampleRate, , );
  19. bufferedWaveProvider = new BufferedWaveProvider(WaveFormat);
  20. monoToStereoProvider16 = new MonoToStereoProvider16(bufferedWaveProvider);
  21. waveOut = new WaveOut();
  22. waveOut.DeviceNumber = deviceNumber;
  23. waveOut.Init(monoToStereoProvider16);
  24. waveOut.Play();
  25. isRunning = true;
  26. }
  27.  
  28. public void PlayData(byte[] data)
  29. {
  30. if (!isRunning) return;
  31. bufferedWaveProvider.AddSamples(data, , data.Length);
  32. }
  33.  
  34. public void ClosePlay()
  35. {
  36. isRunning = false;
  37. waveOut.Stop();
  38. waveOut.Dispose();
  39. }
  40.  
  41. public bool SetPlayChannel(PCMPlayerChannel playerChannel)
  42. {
  43. if (!isRunning || waveOut == null || monoToStereoProvider16 == null) return false;
  44. switch (playerChannel)
  45. {
  46. case PCMPlayerChannel.Left:
  47. {
  48. monoToStereoProvider16.LeftVolume = 1.0f;
  49. monoToStereoProvider16.RightVolume = 0.0f;
  50. }
  51. break;
  52. case PCMPlayerChannel.Right:
  53. {
  54. monoToStereoProvider16.LeftVolume = 0.0f;
  55. monoToStereoProvider16.RightVolume = 1.0f;
  56. }
  57. break;
  58. case PCMPlayerChannel.Both:
  59. {
  60. monoToStereoProvider16.LeftVolume = 1.0f;
  61. monoToStereoProvider16.RightVolume = 1.0f;
  62. }
  63. break;
  64. default: return false;
  65. }
  66. return true;
  67. }
  68.  
  69. public WaveFormat WaveFormat { get; private set; }
  70.  
  71. public static Dictionary<int, WaveOutCapabilities> GetPlayDevices
  72. {
  73. get
  74. {
  75. Dictionary<int, WaveOutCapabilities> result = new Dictionary<int, WaveOutCapabilities>();
  76. try
  77. {
  78. int count = WaveOut.DeviceCount;
  79. for (int i = ; i < count; i++)
  80. {
  81. var item = WaveOut.GetCapabilities(i);
  82. result.Add(i, item);
  83. }
  84. }
  85. catch { }
  86. return result;
  87. }
  88. }
  89. }
  90.  
  91. public enum PCMPlayerChannel
  92. {
  93. Left,
  94. Right,
  95. Both
  96. }

预告:下一篇简单讲一下音频流网络传输时压缩与解压(基于NSpeex的音频10倍压缩,肉耳听不出损耗)

简单实用的PCM音频播放器--沉寂几年之后回归的第一份笔记的更多相关文章

  1. 最简单的基于FFMPEG+SDL的音频播放器 ver2 (采用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

  2. 最简单的基于FFMPEG+SDL的音频播放器 ver2 (採用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

  3. IOS开发之简单音频播放器

    今天第一次接触IOS开发的UI部分,之前学OC的时候一直在模拟的使用Target-Action回调模式,今天算是真正的用了一次.为了熟悉一下基本控件的使用方法,和UI部分的回调,下面开发了一个特别简易 ...

  4. OCiOS开发:音频播放器 AVAudioPlayer

    简单介绍 AVAudioPlayer音频播放器可以提供简单的音频播放功能.其头文件包括在AVFoudation.framework中. AVAudioPlayer未提供可视化界面,须要通过其提供的播放 ...

  5. 11.QT-ffmpeg+QAudioOutput实现音频播放器

    1.前言      由于QAudioOutput支持的输入数据必须是原始数据,所以播放mp3,WAV,AAC等格式文件,需要解封装后才能支持播放.      而在QT中,提供了QMediaPlayer ...

  6. HTML5 音频播放器-Javascript代码(短小精悍)

    直接上干货咯! //HTML5 音频播放器 lzpong 2015/01/19 var wavPlayer = function () { if(window.parent.wavPlayer) re ...

  7. 【jquery】一款不错的音频播放器——Amazing Audio Player

    前段时间分享了一款视频播放器,点击这里.今天介绍一款不错的音频播放器——Amazing Audio Player. 介绍: Amazing Audio Player 是一个使用很方便的 Windows ...

  8. 与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成

    原文:与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成 [索引页][源码下载] 与众不同 win ...

  9. Unity3D音频播放器 动态装载组件

    大多数在线Unity有关如何只教程Unity在播放音乐.之后如何通过拖动它们无法继续添加音频文件 但有时在游戏中的对象要玩几个声音.这时候我们就需要使用代码控制,拖动推教程AudioClip颂值的方法 ...

随机推荐

  1. 【亲测有效】安装npm慢的解决方案

    使用淘宝的NPM库:npm install -gd express --registry=http://registry.npm.taobao.org

  2. SpringBoot学习<一>——快速搭建SpringBoot

    这是我的第一篇博客,博客记录我以后的学习,包括一些总结之类的东西,当然,这些记录是针对于与我个人而言的,可能有些地方会有不好的,或者出现错误,欢迎大家来指正(如果有人看的话)废话不多说.进入正题:Sp ...

  3. mysql基础指令知识

    桌面指令(cmd)进入mysql客户端 第一步:安装mysql,配置环境变量 第二步:手动开启服务 第三步:输入如下指令: mysql [-h localhost -P 3306] -u  用户名 - ...

  4. ViewBag---MVC3中 ViewBag、ViewData和TempData的使用和差别-------与ViewBag+Hashtable应用例子

    ViewBag 在MVC3開始.视图数据能够通过ViewBag属性訪问.在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),Vi ...

  5. MySQL关闭缓慢

    Pre环境有个MySQL不能进行数据写入操作,关闭实例也非常慢,最后error报错. 最后发现是磁盘不能进行写操作. touch /data/testtouch: cannot touch ‘/dat ...

  6. 【转】TCP/IP协议详解 卷1

    https://www.cnblogs.com/mengwang024/p/4425834.html

  7. Linux下 启动tomcat 时候同时日志命令

    ./startup.sh && tail -f ../logs/catalina.out

  8. 用js刷剑指offer(从1到n整数中1出现的次数)

    题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...

  9. 【转】采用Gson解析含有多种JsonObject的复杂json

    本文对应的项目是MultiTypeJsonParser ,项目地址 https://github.com/sososeen09/MultiTypeJsonParser 0 前奏 使用 Gson 去解析 ...

  10. docker的入门到放弃--docker基本命令

    docker的镜像中国:https://www.docker-cn.com/registry-mirror 1.搜索镜像 [root@localhost ~]# docker search tomca ...