当前位置:编程学习 > Delphi >>

delphi如何实现直接实时播放话筒的声音,而不用录音

答案:无论如何都先要录音,你说的情况只是需要将音频录制到内存中,不需要储存到文件里而已。 有四种方法: 1、系统MME功能,也就是使用waveIn****/waveOut****系列API来完成。程序启动后用waveIn****系列函数打开声卡输入功能,同时将缓冲区设定到足够小的值,然后开始将音频数据录制到设定的缓冲区,当缓冲区满后再将缓冲区(WAVHDR)直接加入到waveOut****系列函数的输出队列中即可。此方法实现较简单,缺点是MME为高级API,因此在整个过程中需要走过很多系统处理阶段,导致延迟较大。若缓冲区太小会导致声音断断续续。一般最小延迟可到120毫秒左右。可参考libzplay的麦克风监听。 2、使用DirectSound技术,处理流程同方法1。此方法实现较方法1稍难,但可设置DirectSound的工作模式为最高级别,一般最小延迟可到60毫秒左右。可参考微软DirectSound SDK例子。推荐使用。 3、使用WDM技术。所谓WDM技术也就是微软系统的新一代驱动程序架构,即应用程序直接调用底层系统服务。总流程同方法1,也是先接受一个缓冲区的数据,然后输出。在WinXP下,音频WDM也就是常说的Kernel Streaming(内核音频流),在Vista/Win7下,音频WDM是WASAPI。此方法实现难度最高,且需要程序员有一定的系统内核编程能力,要严格处理程序,否则会引起系统崩溃(蓝屏)。且KS方法对声卡有兼容性要求。此方案的优势在于可将延迟做到极低的状态,一般最小延迟可以到1毫秒~10毫秒,且在一定情况下可以使用非分页内存、直接硬件IRP和RT,独占声卡的所有资源。可参考微软KS和WASAPI的例子。 4、使用ASIO技术。ASIO是一个音频公司推出的“音频流输入输出接口”,真正意义(非模拟)上的ASIO需要声卡硬件支持。总流程同方法1,但使用此方法时需要注意ASIO中的缓冲区切换,一般在ASIO中缓冲区切换需要使用nanosecond来计时,当CPU占用较高时会造成声音断断续续。此方法的优点在于同WDM一样可以获得极低的延迟,一般为1毫秒~25毫秒。可参考ASIO SDK。 WDM与ASIO对比: WDM处理流程: 用户程序<->声卡驱动<->声卡 ASIO处理流程: 用户程序<->ASIO驱动<->声卡驱动<->声卡 由此可见,WDM属于最低级音频输入输出技术了。 以上全部手打。。。。

上一个:这个DELPHI小程序哪里错了?请高们帮忙看看
下一个:delphi制作一个条形码,只是进行生成保存成图片,不打印出来,如果不用控件该怎么做啊?思路是什么啊?

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,