简单实用的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颂值的方法 ...
随机推荐
- Solr+ik分词支持特殊符号分词
在工具类(CharacterUtil.java)里,找到方法 identifyCharType,加入以下代码: } else if (ub == Character.UnicodeBlock.GREE ...
- systemd_journal_no_entries问题解决
问题: #journalctl Journal file /var/log/journal/410/system@0.journal~ uses an unsupported feature, ign ...
- 微信小程序(小游戏)后台开发
小程序开放接口功能,目的是方便小程序接入第三方服务器,比如,商城类小程序,小游戏,需要保存订单数据,玩家信息等.那就需要服务器和数据库, 开发者对于各方关系必须要理清,那就是小程序,用户,开发者服务器 ...
- Android GOT Hook
最后介绍的这种hook方式原理比较简单,只需要将GOT表中的目标函数地址替换为我们自己的函数地址即可,但它的缺点是只能对导入函数进行hook,还需要对elf文件的结构有所了解. 一.获取到GOT表在内 ...
- mysql 5.6 rpm安装启动、配置参数、字符集修改等
linux 7 安装mysql server 注意:此mysql版本是el6 MySQL-server-5.6.35-1.el6.x86_64 一.安装部署: 1.yum:首先要配置yum源,yum安 ...
- redis都有哪些数据类型?分别在哪些场景下使用比较合适?
(1)string 这是最基本的类型了,没啥可说的,就是普通的set和get,做简单的kv缓存 (2)hash 这个是类似map的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象 ...
- Java四种读取和创建XML文档的例子教程
四种方法解析XML文档:Dom.SAX.JDOM.dom4j 1.了解XML XML,即可扩展标记语言(Extensible Markup Language),标准通用标记语言的子集 ...
- Django --- ajax结合sweetalert使用,分页器,bulk_create批量创建数据
目录 ajax结合sweetalert使用 bulk_create批量插入数据 分页器的使用 ajax结合sweetalert使用 ajax可以在不刷新页面的情况下与后端进行交互,在对数据进行操作的时 ...
- NISP二级笔记(一) 信息安全管理
ISO27001 信息安全管理体系要求 ISO27002 信息安全控制措施(实用规则) ISO27003 信息安全管理体系实施指南 ISO27004 信息安全管理测量 ISO27005 信息安全风险管 ...
- winform DateTimePicker 设置成秒
C# Windows窗体应用中,用到时间选择控件DateTimePicker,发现不能选择时分秒,难道要自己写一个控件?! 答案是否定的,通过属性修改是可以选择时间的,DateTimePicker完全 ...