简单实用的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颂值的方法 ...
随机推荐
- 【亲测有效】安装npm慢的解决方案
使用淘宝的NPM库:npm install -gd express --registry=http://registry.npm.taobao.org
- SpringBoot学习<一>——快速搭建SpringBoot
这是我的第一篇博客,博客记录我以后的学习,包括一些总结之类的东西,当然,这些记录是针对于与我个人而言的,可能有些地方会有不好的,或者出现错误,欢迎大家来指正(如果有人看的话)废话不多说.进入正题:Sp ...
- mysql基础指令知识
桌面指令(cmd)进入mysql客户端 第一步:安装mysql,配置环境变量 第二步:手动开启服务 第三步:输入如下指令: mysql [-h localhost -P 3306] -u 用户名 - ...
- ViewBag---MVC3中 ViewBag、ViewData和TempData的使用和差别-------与ViewBag+Hashtable应用例子
ViewBag 在MVC3開始.视图数据能够通过ViewBag属性訪问.在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),Vi ...
- MySQL关闭缓慢
Pre环境有个MySQL不能进行数据写入操作,关闭实例也非常慢,最后error报错. 最后发现是磁盘不能进行写操作. touch /data/testtouch: cannot touch ‘/dat ...
- 【转】TCP/IP协议详解 卷1
https://www.cnblogs.com/mengwang024/p/4425834.html
- Linux下 启动tomcat 时候同时日志命令
./startup.sh && tail -f ../logs/catalina.out
- 用js刷剑指offer(从1到n整数中1出现的次数)
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- 【转】采用Gson解析含有多种JsonObject的复杂json
本文对应的项目是MultiTypeJsonParser ,项目地址 https://github.com/sososeen09/MultiTypeJsonParser 0 前奏 使用 Gson 去解析 ...
- docker的入门到放弃--docker基本命令
docker的镜像中国:https://www.docker-cn.com/registry-mirror 1.搜索镜像 [root@localhost ~]# docker search tomca ...