简单实用的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颂值的方法 ...
随机推荐
- 【hadoop】hadoop3.2.0的安装并测试
前言:前段时间将hadoop01的虚拟机弄的崩溃掉了,也没有备份,重新从hadoop02虚拟上克隆过来的,结果hadoop-eclipse插件一样的编译,居然用不起了,找了3天的原因,最后还是没有解决 ...
- 数据库PDO简介
php简介,php历史,php后端工程师职业前景,php技术方向,php后端工程师职业体系介绍. php是世界上使用最广泛的web开发语言,是超文本预处理器,是一种通用的开源脚本语言,语法吸收了c语言 ...
- php 执行大量sql语句 MySQL server has gone away
php 设置超时时间单位秒 set_time_limit(3600); php 设置内存限制ini_set('memory_limit', '1024M'); mysql服务端接收到的包的大小 ...
- python基础之面试常问
目录 python相对其他语言有什么特点? python内存管理机制,gc机制的了解,gc回收三种算法. lambda函数 高级函数 map.reduce.filter.sorted等. 简述六种基本 ...
- 28.XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式
转自https://www.cnblogs.com/gdjlc/archive/2013/09/08/3308229.html XML Schema 语言也称作 XML Schema 定义(XML S ...
- 《你们都是魔鬼吗》第八次团队作业 第二天Alpha
<你们都是魔鬼吗>第八次团队作业:Alpha冲刺 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 你们都是魔鬼吗 作业学习目标 完成最 ...
- 使用Nuget生成类库
背景: 为了开始ITOO项目,我们先学习了一些基本知识,这些就是一个基本知识,这实现的是一种封装的思想,将方法打包,这样我们就可以在其他系统中直接引用而需要再耗费人力和财力去做,真正实现了高效率 ...
- 利用Python3的requests和re库爬取猫眼电影笔记
以下笔记,作为参考借鉴,如有疑问可以联系我进行交流探讨! 代码思路很简单,简单概括为: 首先利用requests的get方法获取页面的html文件,之后对得到的html文件进行相对应的正则处理,然 ...
- 接口-DBLINK初尝试
需求: 将寿险核心库中的黑名单数据提取到团险核心中,供团险核心使用,并且在核心前端页面需配置对应的菜单,提供相应的按钮,该接口采用dblink的方式进行提取. 通过本地数据库配置dblink访问远程数 ...
- 物体检测方法(1) - YOLO 详解
最近遇到一些卡证识别的检测问题,打算先把理论知识梳理一下,随后还会梳理一版代码注释. 以前的region+proposal来检测的框架,这一系列速度和精度不断提高,但是还是无法达到实时.存在的主要问题 ...