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. 转:Java NIO(3)

    要想讲清楚nio的原理和它的优点得先清楚Java应用程序的文件读写原理和虚拟内存的原理.Java文件读取原理可参见如下图: 当应用程序需要读取文件的时候,内核首先通过DMA技术将文件内容从磁盘读入内核 ...

  2. [LeetCode] Binary Tree Inorder Traversal 中序排序

    Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...

  3. (未解决)WIN8下使用POWERSHELL安装python easy_install无法成功

    按照https://pypi.python.org/pypi/setuptools#windows-8-powershell介绍的方法, 安装未成功.安装似乎没有启动, 也未安装成功. Windows ...

  4. cocos2d学习网址

    http://python.cocos2d.org/doc/programming_guide/index.html http://bbs.tairan.com/article-25-1.html h ...

  5. linux日志服务之logwatch

    因为logwatch默认要使用sendmail服务,所以请参考linux之发送邮件--sendmail服务配置首先设置正确sendmail服务. 安装logwatch. 查看logwatch文件在/e ...

  6. ubuntu启动脚本一览分析

    #rc--run command的意思[rc解释]harvey@ubuntu:/etc$ cat ./init/rc-sysinit.conf # rc-sysinit - System V init ...

  7. 在 Flask 项目中解决 CSRF 攻击

    #转载请留言联系 1. CSRF是什么? CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造. CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求.包括:以你名义 ...

  8. 纯HTML+CSS写出一颗会飘动的树,有没有惊艳到你呢?

    前言 使用HTML+CSS能写出什么惊人的效果呢? 针对这个问题,我总会看到类似的回答,比如没有JS,前端永远都是静态的:HTML5要搭配JS,要不然一文不值. JS固然强大,但CSS也并非一文不值, ...

  9. 51nod 1137.矩阵乘法-矩阵乘法

    1137 矩阵乘法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题   给出2个N * N的矩阵M1和M2,输出2个矩阵相乘后的结果.   Input 第1行:1个数N, ...

  10. (3)WPF 布局

    一.布局原则 二.布局过程 三.布局容器 核心布局面板 布局属性