Java 音频处理技术

简介:

Java Sound包介绍

Java sound API 是JDK种默认提供的,操作简单容易上手。但比较陈旧,受操作系统影响较大,无法满足一些专业场景。比如在 windows 下8路输入的声卡会被识别为4个2路输入的设备,无法协同工作。在这些场景中可以考虑使用下文介绍的 ASIO技术。

包:

  • sampled包 声音采样处理
  • midi 包 midi 音乐处理

类:

  • AudioSystem 用来操作各种系统资源,如外接的话筒,输入等;可以从这些设备直接得到io 流;还可以在各种音频格式之间转换。——要注意数据格式和文件格式的区别!
  • AudioFormat 用来表示数据格式,包括编码技术(通常是脉码调制即 PCM),通道数,采样率,每个样本位数,帧速率,帧大小,字节顺序
  • AudioFileFormat 用来表示文件格式,包括文件类型,文件长度(字节),文件中的音频数据长度(帧),
  • Mixer 用来表示各种设备,作用是接收 n 录输入,处理后送到 n 录输出。
  • Line 是 Port, Mixer, DataLine 的公共父接口,他们可以对流经的信号进行控制,如gain(以分贝影响信号的体积),pan(影响声音的左右定位,混响(这会增加声音的混响)模拟不同类型的房间声学)和采样率(影响播放速率以及声音间距)
  • Port 简单表示来自或到声音设备的线
  • DataLine 提供与媒体相关的功能,如音频格式,媒体位置,缓冲区大小,电平,启停,暂停和回复,刷新,drain,活动状态
  • SourceDataLine 用来把数据写入 Mixer,write()的参数表示写入缓冲区的数据,建议每次写入的数据大小比缓冲区大。期间如果调用 stop()会立刻停止播放,剩余数据残留在缓冲区,下次再调用 start()会继续播放。
  • TargetDataLine 用来从Mixer 接收音频数据,open()表示准备好,start()开始捕获数据到缓冲区,read()读取缓冲区的数据,每次读取的数据应该比缓冲区小,比如例子中是缓冲区大小的1/5。
    综上,两种 line 都一样,open/close 是控制线的程序资源;start/stop 是控制设备;write/read/flush/drain 是控制缓冲区。其中前四个方法会产生事件。

ASIO介绍

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 库

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

目录
相关文章
|
3月前
|
Java
死磕-java并发编程技术(二)
死磕-java并发编程技术(二)
|
3月前
|
存储 Java 调度
死磕-java并发编程技术(一)
死磕-java并发编程技术(一)
|
23天前
|
JSON 前端开发 JavaScript
java-ajax技术详解!!!
本文介绍了Ajax技术及其工作原理,包括其核心XMLHttpRequest对象的属性和方法。Ajax通过异步通信技术,实现在不重新加载整个页面的情况下更新部分网页内容。文章还详细描述了使用原生JavaScript实现Ajax的基本步骤,以及利用jQuery简化Ajax操作的方法。最后,介绍了JSON作为轻量级数据交换格式在Ajax应用中的使用,包括Java中JSON与对象的相互转换。
38 1
|
1月前
|
SQL 监控 Java
技术前沿:Java连接池技术的最新发展与应用
本文探讨了Java连接池技术的最新发展与应用,包括高性能与低延迟、智能化管理和监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,为开发者提供了一份详尽的技术指南。
32 7
|
1月前
|
移动开发 前端开发 Java
过时的Java技术盘点:避免在这些领域浪费时间
【10月更文挑战第14天】 在快速发展的Java生态系统中,新技术层出不穷,而一些旧技术则逐渐被淘汰。对于Java开发者来说,了解哪些技术已经过时是至关重要的,这可以帮助他们避免在这些领域浪费时间,并将精力集中在更有前景的技术上。本文将盘点一些已经或即将被淘汰的Java技术,为开发者提供指导。
72 7
|
28天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
44 3
|
28天前
|
SQL 监控 Java
Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面
本文探讨了Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,以实现高效稳定的数据库访问。示例代码展示了如何使用HikariCP连接池。
15 2
|
1月前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
28 4
|
28天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
27 1
|
28天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
40 1