简单实用的PCM音频播放器--沉寂几年之后回归的第一份笔记
---恢复内容开始---
PCM音频网络流播放,至于用处,就不多解释了。
一个简单的类,基于NAudio,一个简单的拼装类,实例化时三个参数,依次是采样率,系统播放设备Index,播放声道,调用PlayData方法传入PCM的音频流即可,有流就传进去,数据断了,播放自动停。
接下来把代码贴出来:
public class PCMPlayer
{
private MonoToStereoProvider16 monoToStereoProvider16;
private BufferedWaveProvider bufferedWaveProvider;
private WaveOut waveOut;
private bool isRunning = false;
private PCMPlayerChannel currentChannel; /// <summary>
///
/// </summary>
/// <param name="sampleRate">采样率8K至64K</param>
/// <param name="deviceNumber">通过GetPlayDevices来获取字典的KEY值</param>
/// <param name="playerChannel">初始化时播放的声道</param>
public PCMPlayer(int sampleRate, int deviceNumber = , PCMPlayerChannel playerChannel = PCMPlayerChannel.Both)
{
currentChannel = playerChannel;
WaveFormat = new WaveFormat(sampleRate, , );
bufferedWaveProvider = new BufferedWaveProvider(WaveFormat);
monoToStereoProvider16 = new MonoToStereoProvider16(bufferedWaveProvider);
waveOut = new WaveOut();
waveOut.DeviceNumber = deviceNumber;
waveOut.Init(monoToStereoProvider16);
waveOut.Play();
isRunning = true;
} public void PlayData(byte[] data)
{
if (!isRunning) return;
bufferedWaveProvider.AddSamples(data, , data.Length);
} public void ClosePlay()
{
isRunning = false;
waveOut.Stop();
waveOut.Dispose();
} public bool SetPlayChannel(PCMPlayerChannel playerChannel)
{
if (!isRunning || waveOut == null || monoToStereoProvider16 == null) return false;
switch (playerChannel)
{
case PCMPlayerChannel.Left:
{
monoToStereoProvider16.LeftVolume = 1.0f;
monoToStereoProvider16.RightVolume = 0.0f;
}
break;
case PCMPlayerChannel.Right:
{
monoToStereoProvider16.LeftVolume = 0.0f;
monoToStereoProvider16.RightVolume = 1.0f;
}
break;
case PCMPlayerChannel.Both:
{
monoToStereoProvider16.LeftVolume = 1.0f;
monoToStereoProvider16.RightVolume = 1.0f;
}
break;
default: return false;
}
return true;
} public WaveFormat WaveFormat { get; private set; } public static Dictionary<int, WaveOutCapabilities> GetPlayDevices
{
get
{
Dictionary<int, WaveOutCapabilities> result = new Dictionary<int, WaveOutCapabilities>();
try
{
int count = WaveOut.DeviceCount;
for (int i = ; i < count; i++)
{
var item = WaveOut.GetCapabilities(i);
result.Add(i, item);
}
}
catch { }
return result;
}
}
} public enum PCMPlayerChannel
{
Left,
Right,
Both
}
预告:下一篇简单讲一下音频流网络传输时压缩与解压(基于NSpeex的音频10倍压缩,肉耳听不出损耗)
简单实用的PCM音频播放器--沉寂几年之后回归的第一份笔记的更多相关文章
- 最简单的基于FFMPEG+SDL的音频播放器 ver2 (采用SDL2.0)
===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...
- 最简单的基于FFMPEG+SDL的音频播放器 ver2 (採用SDL2.0)
===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...
- IOS开发之简单音频播放器
今天第一次接触IOS开发的UI部分,之前学OC的时候一直在模拟的使用Target-Action回调模式,今天算是真正的用了一次.为了熟悉一下基本控件的使用方法,和UI部分的回调,下面开发了一个特别简易 ...
- OCiOS开发:音频播放器 AVAudioPlayer
简单介绍 AVAudioPlayer音频播放器可以提供简单的音频播放功能.其头文件包括在AVFoudation.framework中. AVAudioPlayer未提供可视化界面,须要通过其提供的播放 ...
- 11.QT-ffmpeg+QAudioOutput实现音频播放器
1.前言 由于QAudioOutput支持的输入数据必须是原始数据,所以播放mp3,WAV,AAC等格式文件,需要解封装后才能支持播放. 而在QT中,提供了QMediaPlayer ...
- HTML5 音频播放器-Javascript代码(短小精悍)
直接上干货咯! //HTML5 音频播放器 lzpong 2015/01/19 var wavPlayer = function () { if(window.parent.wavPlayer) re ...
- 【jquery】一款不错的音频播放器——Amazing Audio Player
前段时间分享了一款视频播放器,点击这里.今天介绍一款不错的音频播放器——Amazing Audio Player. 介绍: Amazing Audio Player 是一个使用很方便的 Windows ...
- 与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成
原文:与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成 [索引页][源码下载] 与众不同 win ...
- Unity3D音频播放器 动态装载组件
大多数在线Unity有关如何只教程Unity在播放音乐.之后如何通过拖动它们无法继续添加音频文件 但有时在游戏中的对象要玩几个声音.这时候我们就需要使用代码控制,拖动推教程AudioClip颂值的方法 ...
随机推荐
- UCOSIII事件标志组
两种同步机制 "或"同步 "与"同步 使能 #define OS_CFG_FLAG_EN 1u /* Enable (1) or Disable (0) cod ...
- https小结
目录: 1.什么是https 2.https实现过程描述(https和证书小结) 3.(在客户端)https抓包解密 4.wireshark分析https数据包解密前后的特点 正文 1.什么是http ...
- Android笔记(五十四) Android四大组件之一——ContentProvider(一)
ContentProvider提供数据 在Android中,他的每个应用都是相互独立的,各自运行在自己的Dalvik虚拟机中,但现实使用中常常需要在多个应用之间进行数据交换,例如发短信需要获取联系人中 ...
- Centos7启动流程及systemd中Nginx启动配置
Centos7启动流程: 1.post(Power-On-Self-Test) 加电自检 主要实现的功能是检测各个外围硬件设备是否存在而且能够正常运行起来,实现这一自检功能的是固化在主板上的ROM(主 ...
- 2013.5.8 - KDD第二十天
下午去上刘杨老师的机器学习课,今天讲的"朴素被噎死",他本想当场举个例子,结果读了好半天才吧关系都拼凑上,他说明天给我们带来个精彩的,回去之后夜里把朴素贝叶斯自己又脑补了一下,发现贝叶斯原理(后验)就 ...
- 洛谷 P1020导弹拦截题解
洛谷链接:https://www.luogu.org/problem/P1020 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到 ...
- 「SDOI2016」征途
征途 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成\(n\)段,相邻两段路的分界点设有休息站. Pine计划用\(m\)天到达T地.除第\(m\)天外,每一天晚上Pine都必须在休息 ...
- Oracle中修改某个字段可以为空
待修改字段假定为:shuifen 1.当该字段为空时,可直接修改: alter table reportqymx modify shuifen null; 2.当待修改字段不为空时:新增一列把要改变的 ...
- c++中如何使用memset()
转载链接1 转载链接2
- 再论strlen sizeof
今天,在使用字符串的时候,对sizeof和strlen的用法更加深入了,特此记录下. strlen是运行是计算的,不能放在函数外面计算的sizeof是预编译时运行的,可以放在函数外面计算. 对于cha ...