---恢复内容开始---

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音频播放器--沉寂几年之后回归的第一份笔记的更多相关文章

  1. 最简单的基于FFMPEG+SDL的音频播放器 ver2 (采用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

  2. 最简单的基于FFMPEG+SDL的音频播放器 ver2 (採用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

  3. IOS开发之简单音频播放器

    今天第一次接触IOS开发的UI部分,之前学OC的时候一直在模拟的使用Target-Action回调模式,今天算是真正的用了一次.为了熟悉一下基本控件的使用方法,和UI部分的回调,下面开发了一个特别简易 ...

  4. OCiOS开发:音频播放器 AVAudioPlayer

    简单介绍 AVAudioPlayer音频播放器可以提供简单的音频播放功能.其头文件包括在AVFoudation.framework中. AVAudioPlayer未提供可视化界面,须要通过其提供的播放 ...

  5. 11.QT-ffmpeg+QAudioOutput实现音频播放器

    1.前言      由于QAudioOutput支持的输入数据必须是原始数据,所以播放mp3,WAV,AAC等格式文件,需要解封装后才能支持播放.      而在QT中,提供了QMediaPlayer ...

  6. HTML5 音频播放器-Javascript代码(短小精悍)

    直接上干货咯! //HTML5 音频播放器 lzpong 2015/01/19 var wavPlayer = function () { if(window.parent.wavPlayer) re ...

  7. 【jquery】一款不错的音频播放器——Amazing Audio Player

    前段时间分享了一款视频播放器,点击这里.今天介绍一款不错的音频播放器——Amazing Audio Player. 介绍: Amazing Audio Player 是一个使用很方便的 Windows ...

  8. 与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成

    原文:与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成 [索引页][源码下载] 与众不同 win ...

  9. Unity3D音频播放器 动态装载组件

    大多数在线Unity有关如何只教程Unity在播放音乐.之后如何通过拖动它们无法继续添加音频文件 但有时在游戏中的对象要玩几个声音.这时候我们就需要使用代码控制,拖动推教程AudioClip颂值的方法 ...

随机推荐

  1. [MySQL]重装数据库后无法启动服务

    具体情况请查看下面网址 https://www.jianshu.com/p/8dda50ee812f 错误信息可以在CMD里输入mysqld --console查看

  2. Core Animation笔记(- Layer 基本属性)

    一.Layer的基本属性 1. contents 图层内容默认为nil 可以指定一张图片作为内容展示 self.layerView.layer.contents = (__bridge id)imag ...

  3. 从汇编语言写到c语言

    好了,言归正传,裸机程序没有操作系统的支持,想要用c语言,就只能先使用汇编语言手动配置c语言需要的环境,听起来很高大上,其实需要做的很简单:指定堆栈指针的值就好. 那么完成这个简单的事情之前,先要明白 ...

  4. Elasticsearch 7.x - IK分词器插件(ik_smart,ik_max_word)

    一.安装IK分词器 Elasticsearch也需要安装IK分析器以实现对中文更好的分词支持. 去Github下载最新版elasticsearch-ik https://github.com/medc ...

  5. sqlite3入门之sqlite3_mprintf

    sqlite3_mprintf sqlite3_mprintf()函数原型: char *sqlite3_mprintf(const char*,...); sqlite3_mprintf()的作用是 ...

  6. 使用SikuliX定位Object(flash)元素

    先说一下背景,这个是我们测试的系统上的一个上传文件的地方,但是用传统的selenium方法很难定位的到.具体的样子是下面这样的. 使用id等属性定位做点击操作好像不能直接操作.无奈之下,只好从网上找找 ...

  7. 代码重复检查工具——python的使用CPD比较好用,clone digger针对py2,其他有名的如Simian PMD-CPD CloneDR CCCD CCFinder Bauhaus CodePro

    代码重复检测: cpd --minimum-tokens 100 --files g:\source\python\ --language python >log.txt 输出类似: ===== ...

  8. Windows 窗体的自适应分辨率、分屏显示、开机自启动

    前言 这里所说的针对Winform.WPF 都适用.开机自启动对于控制台的也可以. 还是从项目实践中得来的,在这里记录下来. 对于自适应.分屏显示,在以前感觉应该比较高大上的问题,会比较难.在经过这次 ...

  9. 《Exception》第五次作业:项目需求分析改进与系统设计

    一.项目基本介绍 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 Exception 作业学习目标 1掌握面向对象需求分析方法:2.学习软件系统总 ...

  10. goto语句——慎用,但是可以用

    最近使用了goto语句,是因为if嵌套太深了,因此把错误处理同意了,直接使用goto语句. 举例: #include <stdio.h> int main () { /* local va ...