Java sound API 比较简单陈旧,受操做系统影响较大,没法知足一些专业场景。好比在 windows 下8路输入的声卡会被识别为4个2路输入的设备,没法协同工做。可是它提供了不少基础 API,仍是颇有必要了解一下的。html
包:java
类:git
AudioSystem 用来操做各类系统资源,如外接的话筒,输入等;能够从这些设备直接获得io 流;还能够在各类音频格式之间转换。——要注意数据格式和文件格式的区别!github
AudioFormat 用来表示数据格式,包括编码技术(一般是脉码调制即 PCM),通道数,采样率,每一个样(敏感词)本位数,帧速率,帧大小,字节顺序编程
AudioFileFormat 用来表示文件格式,包括文件类型,文件长度(字节),文件中的音频数据长度(帧),windows
Mixer 用来表示各类设备,做用是接收 n 录输入,处理后送到 n 录输出。oracle
Line 是 Port, Mixer, DataLine 的公共父接口,他们能够对流经的信号进行控制,如gain(以分贝影响信号的体积),pan(影响声音的左右定位,混响(这会增长声音的混响)模拟不一样类型的房间声学)和采样率(影响播放速率以及声音间距)编码
Port 简单表示来自或到声音设备的线spa
DataLine 提供与媒体相关的功能,如音频格式,媒体位置,缓冲区大小,电平,启停,暂停和回复,刷新,drain,活动状态操作系统
SourceDataLine 用来把数据写入 Mixer,write()的参数表示写入缓冲区的数据,建议每次写入的数据大小比缓冲区大。期间若是调用 stop()会马上中止播放,剩余数据残留在缓冲区,下次再调用 start()会继续播放。
TargetDataLine 用来从Mixer 接收音频数据,open()表示准备好,start()开始捕获数据到缓冲区,read()读取缓冲区的数据,每次读取的数据应该比缓冲区小,好比例子中是缓冲区大小的1/5。
综上,两种 line 都同样,open/close 是控制线的程序资源;start/stop 是控制设备;write/read/flush/drain 是控制缓冲区。其中前四个方法会产生事件。
ASIO(Audio stream input output)是一种音频流输入输出API,由 Steinberg 公司开发,可实现低延迟、高同步、高吞吐率。当今主流声卡都会支持,在 windows 和 mac os 下都有驱动。参考资料中有Steinberg 公司的 ASIO SDK 下载连接,是 C++语音实现的。然而要在 Java 中调用 ASIO并不须要下载此 SDK,而是可使用开源的 JAsioHost 库。见下一节
另外,ASIO 限制每次只能选定一个设备输入输出音频,没法支持须要多个设备同时工做的场景。这时可使用一款通用 ASIO 封装库 Asio4all。它底层使用 WDM API(Windows Driver Module,一种和 ASIO 相似的音频输入输出 API,但只有 windows 系统支持)访问音频设备,对外暴露 ASIO接口。用户能够经过它同时访问多台音频设备。
JAsioHost 使用 JNI 技术封装 asio API,暴露出一套 Java API。开发者能够直接针对此 API 编程实现音频输入输出。详细可参考项目介绍。
我在使用JAsioHost时发现给AsioDriver设置采样率并不生效,不肯定是否bug。
综上,若是须要用 java 同时操做多台音频设备,须要在本机安装asio4all 驱动,而后基于 JAsioHost 库编码操做音频设备。
顺带一提, JAsioHost API 和 Java Sound API 风格不一样,前者主动推送数据到调用者,后者被动接受调用者调用拉取数据。所以并不能很简单地在两种实现方案之间切换,须要开发者作一些兼容处理。
Java Sound官方文档: http://docs.oracle.com/javase/tutorial/sound/TOC.html
Steinberg ASIO 驱动 官方下载: https://www.steinberg.net/en/company/developers.html
asio4all官网: http://www.asio4all.com/
JasioHost 项目主页: https://github.com/mhroth/jasiohost
做者:搞技术的薛彬 连接:https://www.jianshu.com/p/3d27058dc377 來源:简书 简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。