文档章节

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

o
 osc_ogi0qclx
发布于 2019/08/23 20:48
字数 476
阅读 7
收藏 0

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

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 = 0, PCMPlayerChannel playerChannel = PCMPlayerChannel.Both)
16         {
17             currentChannel = playerChannel;
18             WaveFormat = new WaveFormat(sampleRate, 16, 1);
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, 0, 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 = 0; 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     }
View Code

 

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

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

李开复谈2020年AI科学家创业。道翰天琼认知智能api机器人接口。

2012年至今,在深度学习推动下,这一波人工智能的蓬勃发展已进入第十个年头。 在初期,一系列由AI科学家创建的初创公司,经过大浪淘沙,如今已有多家脱颖而出成为独角兽企业;榜样在先,于是...

jackli2020
9分钟前
9
0
什么是PHP中的线程安全或非线程安全? - What is thread safe or non-thread safe in PHP?

问题: I saw different binaries for PHP, like non-thread or thread safe? 我看到了PHP的不同二进制文件,例如非线程还是线程安全的? What does this mean? 这是什么意思? What is the ...

fyin1314
22分钟前
26
0
移动社交如何玩?网易云信携手崽崽和Uki打造更多新场景!

随着95后、00后为主的年轻一代逐渐成为中国移动社交下的主力军,社交需求也发生了一些变化。这些年轻用户更倾向于有趣好玩,形式多样化的社交方式。同时也产生了如“扩列”、“养火花”等众多...

真正稳定的网易云信
29分钟前
22
0
如何在Java代码中去掉烦人的“!=null”

问题 为了避免空指针调用,我们经常会看到这样的语句 if (someobject != null) { someobject.doCalc();} 最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥...

码农突围
30分钟前
21
0
ELK使用容器集成安装

ELK使用容器集成安装 1. 查看集成ELK:sebp docker search sebp 2. 设置内核参数 sysctl -w vm.max_map_count=262144 3. 拉取sebp/elk docker pull sebp/elk 4. 运行ELK yum install -y java......

huanke
40分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部