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. web项目报outmemory错误解决方案

    因为数据问题内存不够出现错误,将参数加入到eclipse的run的配置文件中:

  2. 解决hibernate向mysql插入中文乱码问题(更改MySQL字符集)

    1.首先需要修改mysql数据库的配置文件my.ini,此文件放在mysql根目录下.在此文件下查找default-character-set属性,并将其值更改为utf8(注意:不是utf-8,也要注 ...

  3. 转: listview异步图片加载之优化篇(android)

    Listview异步加载之优化篇 关于listview的异步加载,网上其实很多示例了,总体思想差不多,不过很多版本或是有bug,或是有性能问题有待优化.有鉴于此,本人在网上找了个相对理想的版本并在此基 ...

  4. MFC/C++/C中字符类型CString, int, string, char*之间的转换

    1 CString,int,string,char*之间的转换 string 转 CString CString.format("%s", string.c_str()); cha ...

  5. MFC中CTime获取日期时间的方法

    MFC中CTime类的功能非常强大,可以获取年.月.日.小时.分钟.秒.星期等等,最最重要的是可根据需要去格式化.下面是具体的使用方式: ① 定义一个CTime类对象 CTime time; ② 得到 ...

  6. linux0.11内核源码剖析:第一篇 内存管理、memory.c【转】

    转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c July  ...

  7. Delphi中的堆,栈

    来自:http://blog.163.com/liang_liu99/blog/static/884152162009111303756371/ --------------------------- ...

  8. input框监控输入内容

    $(".input").bind("input porpertychange",function(){ console.log($(".input&q ...

  9. hdu 5158(水题)

    Have meal Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  10. hdu 5150(水题)

    Sum Sum Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...