全双工音频播放器在c#中使用waveIn / waveOut api
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的更多相关文章
- HTML5的Audio标签打造WEB音频播放器
目前,WEB页面上没有标准的方式来播放音频文件,大多数的音频文件是使用插件来播放,而众多浏览器都使用了不同的插件.而HTML5的到来,给我们提供了一个标准的方式来播放WEB中的音频文件,用户不再为浏览 ...
- IOS开发之简单音频播放器
今天第一次接触IOS开发的UI部分,之前学OC的时候一直在模拟的使用Target-Action回调模式,今天算是真正的用了一次.为了熟悉一下基本控件的使用方法,和UI部分的回调,下面开发了一个特别简易 ...
- 【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颂值的方法 ...
- 最简单的基于FFMPEG+SDL的音频播放器 ver2 (采用SDL2.0)
===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...
- OCiOS开发:音频播放器 AVAudioPlayer
简单介绍 AVAudioPlayer音频播放器可以提供简单的音频播放功能.其头文件包括在AVFoudation.framework中. AVAudioPlayer未提供可视化界面,须要通过其提供的播放 ...
- 最简单的基于FFMPEG+SDL的音频播放器 ver2 (採用SDL2.0)
===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...
- Wavesurfer.js音频播放器插件的使用教程
Wavesurfer.js是一款基于HTML5 canvas和Web Audio的音频播放器插件,本文主要记录它及其视觉效果插件Regions插件的使用方法. 1.创建实例 引入插件 import W ...
随机推荐
- mysql数据定期备份删除
1.这里只写备份mysql的数据库的方法,全备份,包括定时删除. 准备工作,弄一个文件夹存数据库备份数据 第一步:编写shell 脚本,命名为shell.sh #备份数据库 backupdir=/we ...
- Extra Judicial Operation
Description The Suitably Protected Programming Contest (SPPC) is a multi-site contest in which conte ...
- HTTP协议中GET、POST和HEAD的介绍
HTTP协议中GET.POST和HEAD的介绍 GET: 请求指定的页面信息,并返回实体主体. HEAD: 只请求页面的首部. POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体 ...
- Vue props父组件向子组件传值详解
vue官网上可以说有我们想要的一切,先贴上通过prop传值的官网地址:通过prop向子组件传递数据 Prop是什么? Prop是你可以在组件上注册的一些自定义特性.当一个值传递给一个prop特性的时候 ...
- InnoDB的多版本并发控制(MMVC)
InnoDB的MVCC之(乐观锁),是通过在每行记录保存两个隐藏列来实现的.这两个列,一个是存创建时间,一个是删除时间,这里的时间指的是,系统版本号,并不是真正的时间值. 每开始一个新的事务,系统版本 ...
- 我的代码,写的pagebase。还是留着吧。语义化,与我的云平台一样,只不过云平台是用js写的。这个是webform.下回写mvc吧。核心很简单。
Ps:记一下用的时候,一不小心我手贱碰到的问题吧:我在页面里面加上了form runat=server,然后所有的html控件就再也找不着了.就是下面的control collection这里,如果加 ...
- 不只是内存分析工具~valgrind
体系结构:原理介绍·参考好文:应用 Valgrind 发现 Linux 程序的内存问题 简单组一个摘要: Valgrind包括如下一些工具: Memcheck.这是valgrind应用最广泛的工具,一 ...
- C++虚函数表解析(基础篇)
原文:http://blog.csdn.net/haoel/article/details/1948051 一.简介 C++中的虚函数的作用主要是实现了多态的机制.虚函数(Virtual Funct ...
- c++ 操作防火墙
原文转自 https://msdn.microsoft.com/zh-cn/library/aa364726(v=vs.85).aspx #include <windows.h> #inc ...
- 使用timeit模块 测试两种方式生成列表的所用的时间
from timeit import Timer def test(): li=[] for i in range(10000): li.append(i) def test2(): li=[i fo ...