http://www.codeproject.com/Articles/4889/A-full-duplex-audio-player-in-C-using-the-waveIn-w

一篇关于低级音频捕获和回放使用waveIn / waveOut api通过P / Invoke c#。
下载源文件- 15.1 Kb
Sample Image - cswavrec.gif 介绍
当我在我的文章里已经提到 c#的低级音频播放器 ,没有内置类的。 净框架来处理声音。 音频播放这不仅适用,而且对音频捕捉。 但值得注意的是,举9 SDK包括管理类高级和低级音频操作。 然而,有时你不想让您的应用程序依赖于完整的DX 9运行时,只做基本的声音回放和捕获,也有一些地区管理声音处理软件根本不能帮助(例如,多渠道声音回放和捕获)。 不过,我强烈建议你使用管理声音回放和捕捉声音处理软件,除非你有充分的理由不这样做。 本文描述了一个示例应用程序使用 waveIn 和 waveOut 通过P / Invoke api在c#中捕捉到声卡的音频信号的输入,然后重播(几乎)在同一时间。 使用的代码
示例代码重用 WaveOutPlayer 类从我的文章 c#的低级音频播放器 。 这个示例中的新类 WaveInRecorder 和 FifoStream 。 的 FifoStream 类继承了 System.IO.Stream 实现一个FIFO(先进先出)的字节数。 的覆盖 写 方法将数据添加到FIFO的尾巴, 读 法正从FIFO的头和删除数据。 的 长度 属性返回缓冲数据的数量。 调用 冲洗 将清除所有未决数据。 的 WaveInRecorder 类是类似于 WaveOutPlayer 类。 事实上,如果你看源文件,您会注意到,这些类的实现非常相似。 与 WaveOutPlayer ,这个类的接口已经减少到严格的最小值。 创建一个实例 WaveInRecorder 将导致系统立即开始记录。 这是创建的代码 WaveOutPlayer 和 WaveInRecorder 实例。 private void Start()
{
Stop();
try
{
WaveLib.WaveFormat fmt = new WaveLib.WaveFormat(, , );
m_Player = new WaveLib.WaveOutPlayer(-, fmt, , ,
new WaveLib.BufferFillEventHandler(Filler));
m_Recorder = new WaveLib.WaveInRecorder(-, fmt, , ,
new WaveLib.BufferDoneEventHandler(DataArrived));
}
catch
{
Stop();
throw;
}
}
的 WaveInRecorder 五个参数的构造函数。 除了最后一个参数,它们的意思是一样的 WaveOutPlayer 。 第一个参数是波的ID输入您想要使用的装置。 的值 - - - - - - 代表默认的系统设备,但是如果你的系统有一个以上的声卡,然后你可以通过任何数量 安装声卡的数量- ,选择一个特定的设备。 第二个参数是音频的格式样本。 第三个参数的大小,内部缓冲区和缓冲区分配的数量。 你应该设置这些合理的值。 较小的缓冲区会给你更少的延迟,但捕获音频可能有差距,如果你的电脑还不够快。 第五和最后一个参数是一个委托,将被称为定期内部音频缓冲区获取的数据。 在样例应用程序中我们把捕获的数据FIFO,像这样: private void DataArrived(IntPtr data, int size)
{
if (m_RecBuffer == null || m_RecBuffer.Length < size)
m_RecBuffer = new byte[size];
System.Runtime.InteropServices.Marshal.Copy(data, m_RecBuffer, , size);
m_Fifo.Write(m_RecBuffer, , m_RecBuffer.Length);
}
类似地, 填料 方法被调用时每次玩家需要更多数据。 我们的实现只是读取FIFO的数据,如下所示: private void Filler(IntPtr data, int size)
{
if (m_PlayBuffer == null || m_PlayBuffer.Length < size)
m_PlayBuffer = new byte[size];
if (m_Fifo.Length >= size)
m_Fifo.Read(m_PlayBuffer, , size);
else
for (int i = ; i < m_PlayBuffer.Length; i++)
m_PlayBuffer[i] = ;
System.Runtime.InteropServices.Marshal.Copy(m_PlayBuffer,
, data, size);
}
注意,我们宣布临时缓冲区 m_RecBuffer 和 m_PlayBuffer 成员字段,以提高性能,节省一些垃圾收集。 停止播放,就叫 处理 在玩家和捕获对象。 我们还需要冲洗FIFO,以便下次 开始 被称为没有剩余数据。 private void Stop()
{
if (m_Player != null)
try
{
m_Player.Dispose();
}
finally
{
m_Player = null;
}
if (m_Recorder != null)
try
{
m_Recorder.Dispose();
}
finally
{
m_Recorder = null;
}
m_Fifo.Flush(); // clear all pending data
}
结论
这个示例演示了如何结合 waveIn 和 waveOut api在c#中。 作为练习,您可能想要将这段代码与音频效果本文框架 在c#编程音频效果 现场应用效果,在实时音频输入,虽然延迟可能是一个问题对于某些应用程序。 许可证
本文没有明确许可连接但可能包含在本文使用条款文本或下载文件本身。 如果有疑问请联系作者通过下面的讨论板。 作者许可列表可以找到可能使用 在这里 分享

全双工音频播放器在c#中使用waveIn / waveOut api的更多相关文章

  1. HTML5的Audio标签打造WEB音频播放器

    目前,WEB页面上没有标准的方式来播放音频文件,大多数的音频文件是使用插件来播放,而众多浏览器都使用了不同的插件.而HTML5的到来,给我们提供了一个标准的方式来播放WEB中的音频文件,用户不再为浏览 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. Wavesurfer.js音频播放器插件的使用教程

    Wavesurfer.js是一款基于HTML5 canvas和Web Audio的音频播放器插件,本文主要记录它及其视觉效果插件Regions插件的使用方法. 1.创建实例 引入插件 import W ...

随机推荐

  1. [CQOI2018]异或序列 (莫队,异或前缀和)

    题目链接 Solution 有点巧的莫队. 考虑到区间 \([L,R]\) 的异或和也即 \(sum[L-1]~\bigoplus~sum[R]\) ,此处\(sum\)即为异或前缀和. 然后如何考虑 ...

  2. MAC中如何配置两套android-sdk环境

    1 背景介绍 随着android studio的完善和普及,越来越多Android app开发者从Eclipse+ADT环境转到Android Studio(后文统一用AS表示).但是,AS往往需要较 ...

  3. 为IE和chrome编写单独的样式

    flex布局在IE10上不支持,为IE10编写特定的样式可以用判断navigator.userAgent 的方法 var doc = document.documentElement; doc.set ...

  4. CSS Sprites技术

    CSS Sprites技术,国内很多人也叫雪碧图,因为sprite麻 (你买一瓶雪碧就看得到大大的sprite字样了) 主要用于将网站的零碎图标的img标签取代,因为每个img标签引用的src就会造成 ...

  5. 转一下网上找来的tortoise git不用每次都输入邮箱和密码的方法。备查看

    每次git clone 和push 都要输入用户名和密码.虽然安全,但在本机上每次都输有些麻烦,如何记住用户名和密码呢? 当你配置好git后,在C:\Documents and Settings\Ad ...

  6. 创建型设计模式之原型模式(Prototype)

    结构   意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 当要实例化的类是在运行时刻指定时,例如,通过动态装载:或者 为了避免创建一个与产品类层次平行的工厂类层次时:或 ...

  7. ubuntu16.04安装flash plugin

    命令:apt-get install browser-plugin-freshplayer-pepperflash

  8. redis 单机模拟 cluster集群

    一.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心 ...

  9. 使用bottle进行web开发(1):hello world

    为什么使用bottle?因为简单,就一个py文件,和其他模块没有依赖,3000多行代码. http://www.bottlepy.org/docs/dev/ 既然开始学习,就安装它吧. pip3 in ...

  10. node.js批量重命名文件

    把当前路径的img文件夹里面的文件加上.png后缀 var fs = require("fs"); var path = 'img' fs.readdir(path, functi ...