简单实用的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颂值的方法 ...
随机推荐
- DBA面对新mysql环境
来源:http://blog.csdn.net/wyzxg/article/details/8491152 author:skatetime:2013/01/10 DBA面对新MySQL环境感悟 1. ...
- Ubuntu 用户权限相关命令
目标 用户 和 权限 的基本概念 用户管理 终端命令 组管理 终端命令 修改权限 终端命令 01. 用户 和 权限 的基本概念 1.1 基本概念 用户 是 Linux 系统工作中重要的一环,用户管理包 ...
- mybatis中对数据表操作的四种语法
查询数据(select) select...from...where... 如:查询学生表中学号为某数的学生的全部信息 select * from stu where id=#{id} 增加数据(in ...
- python解析传入的命令行参数 argv
python解析命令行参数主要有三种方法:sys.argv.argparse解析.getopt解析 方法一:sys.argv —— 命令行执行:python test_命令行传参.py 1,2,3 1 ...
- tomcat 使用quercus-4.0.39 支持PHP
tomcat 使用quercus-4.0.39 支持PHP Quercus是Caucho公司采用纯Java开发的一个PHP5引擎.基于开源授权协议GPL发布.Quercus自带很多个PHP模块 ...
- mysql主从-ms
一.环境准备 1.准备两台安装有mysql的linux服务器 2.安装的mysql版本最好相同 3.配置两台服务器的主机名和IP地址,主机名:master和slave,IP地址:192.168.0.2 ...
- K3 Cloud的数据中心加载异常处理
以前一直是财务维护的K3 Cloud突然说不能登录,用的SQL 2008的数据库,运维也搞不定,找帮忙,因为是部署在阿里云上,上去看看数据库,这个K3数据库占了600多G,想看看这个表结构,就是打不 ...
- react navtagion 头部有返回按钮 标题不居中解决方法
头部右边写一个隐藏的组件 hederRight:( <View><View> )
- 杭电OJ BestCoder28期1001Missing number问题(小技巧偏移法)
1.先描述一下问题: 小yb有一个排列,但他不小心弄丢了其中的两个数字.现在他告诉你他现在手上还有哪些数字,需要你告诉他他丢了哪两个数字. 输入描述 有多组数据,第一行为数据组数T(T≤10). 对于 ...
- redis cluster集群的原理
redis集群的概述: 在以前,如果前几年的时候,一般来说,redis如果要搞几个节点,每个节点存储一部分的数据,得借助一些中间件来实现,比如说有codis,或者twemproxy,都有.有一些red ...