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

目录
相关文章
|
13天前
|
NoSQL Java 数据库连接
深入探索 Java 后台开发的核心技术
【4月更文挑战第5天】本文探讨了Java后台开发的关键技术,包括Spring框架与Spring Boot的使用,MyBatis和Hibernate的ORM选择,关系型与NoSQL数据库的适用场景,线程池与异步处理在并发中的作用,微服务架构及RESTful API设计。这些核心技术有助于开发者打造稳定、高性能的Java后台系统,适应不断发展的云计算和人工智能需求。
|
1月前
|
存储 Java 数据处理
|
2月前
|
设计模式 缓存 分布式计算
|
2月前
|
SQL Java 数据库连接
Java系列技术之Mybatis
MyBatis 是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC代码和手动设置参数以及获取结果集,它可以使用简单的XML或注解来配置和映射SQL信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
43 0
|
2月前
|
监控 安全 物联网
Java基于物联网技术的智慧工地解决方案源代码
应用先进的大数据、物联网、云计算等数字化技术,融合施工运营管理规范和技术标准,建构支撑施工和运营的一体化平台是投资、施工和运营单位能力建设的关键。应用企业架构、设计思维和软件工程方法,深入分析施工和运营技术特性与管理体系,研究开发基于大数据技术的智慧工地信息一体化平台,智慧工地管理平台是依托物联网、互联网建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。
77 2
|
20天前
|
存储 SQL Java
【Java技术指南】「JPA编程专题」让你不再对JPA技术中的“持久化型注解”感到陌生了(二)
【Java技术指南】「JPA编程专题」让你不再对JPA技术中的“持久化型注解”感到陌生了
42 1
|
20天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
57 0
|
1天前
|
存储 数据可视化 安全
Java全套智慧校园系统源码springboot+elmentui +Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术
智慧校园指的是以物联网为基础的智慧化的校园工作、学习和生活一体化环境,这个一体化环境以各种应用服务系统为载体,将教学、科研、管理和校园生活进行充分融合。无处不在的网络学习、融合创新的网络科研、透明高效的校务治理、丰富多彩的校园文化、方便周到的校园生活。简而言之,“要做一个安全、稳定、环保、节能的校园。
19 6
|
20天前
|
存储 安全 Java
【Java技术专题】「攻破技术盲区」攻破Java技术盲点之unsafe类的使用指南(打破Java的安全管控— sun.misc.unsafe)
【Java技术专题】「攻破技术盲区」攻破Java技术盲点之unsafe类的使用指南(打破Java的安全管控— sun.misc.unsafe)
33 0
|
20天前
|
存储 安全 Java
【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(不可变集合篇)
【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(不可变集合篇)
30 1