当前位置:编程学习 > 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中的F3查找为什么有时不能用
下一个:求Delphi+SQLServer数据库应用系统开发与案例,完整版,带源码,谢谢!!

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