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
Java 音频处理技术相关推荐
- 推荐一款Java音频视频编码器,很赞~
Jave2是什么 JAVE2(Java音频视频编码器)库是ffmpeg项目上的Java包装器.开发人员可以利用JAVE2将音频和视频文件从一种格式转码为另一种格式.在示例中,您可以将AVI文件转换为M ...
- [JAVA EE] JPA技术基础:完成数据列表的删除
接上一篇:[JAVA EE] JPA技术基础:完成数据列表显示 本章完成数据列表的删除 修改 UserController.java package com.example.demo.controll ...
- Oracle字符串转BooIean,利用Java的多线程技术实现数据库的访问.pdf
利用Java的多线程技术实现数据库的访问.pdf 第 卷第 期 计算机应用 22 12 Voi .22 , No . 12 年 月 2002 12 Computer Appiications Dec ...
- Java多线程并发技术
Java多线程并发技术 参考文献: http://blog.csdn.net/aboy123/article/details/38307539 http://blog.csdn.net/ghsau/a ...
- Android Java虚拟机拦截技术分析
2019独角兽企业重金招聘Python工程师标准>>> 最近反编译金山毒霸,分析其广告拦截功能是如何实现的.根据金山毒霸的介绍,采用了java虚拟机拦截技术,带着好奇去研究了一下.在 ...
- java超线程_超线程多核心下Java多线程编程技术分析
在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述超线程多核心下Java多线程编程技术分析,更多Java专业知识,广州疯狂 ...
- Java学习---RMI 技术分析[Hessian]
一.什么是Hessian Hessian 是一个基于 binary-RPC 实现的远程通讯 library.使用二进制传输数据.Hessian通常通过Web应用来提供服务,通过接口暴露.Servlet ...
- Java 动态调试技术原理及实践
调试是发现和减少计算机程序或电子仪器设备中程序错误的一个过程.最常用的断点调试技术会在断点位置停顿,导致应用停止响应.本文将介绍一种Java动态调试技术,希望能对大家有帮助.同时也欢迎读者朋友们一起交 ...
- Java开发与技术挑战——关于技术的技术思考
Java开发与技术挑战--关于技术的技术思考 width="22" height="16" src="http://hits.sinajs.cn ...
- 浅谈Java反射(Reflect)技术--常用方法
Java反射(Reflect)技术 概念:动态获取在当前Java虚拟机中的类.接口或者对象等等信息(运行过程中读取内容) 1.作用(面试问题): 1.1 解除两个类之间的耦合性,即在未得到依赖类的情况 ...
最新文章
- 大数据中台向AI中台演进是大势所趋?
- 湖北地区的一些主要DNS服务器
- corosync+pacemaker+nfs提供mysql高可用
- Java设计模式(一):单例模式
- Struts2-从值栈获取list集合数据(三种方式)
- scp错误 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
- 解决 SQL Server 耗尽内存的情况
- 开源项目GoodView点赞效果
- 史上最全的ASP.NET MVC路由配置,以后RouteConfig再弄不懂神仙都难救你啦~
- 传闻或成真!这款新iPhone真就要停产了...
- spring的三种启动方式
- The peopleware papers
- 《C语言及程序设计》实践参考——阿姆斯特朗数
- asp.net引入一个js文件名为JScript的js脚本 报错 缺少对象
- ecshop源码教程第1季
- 自定义报表(demo1)
- 漏洞挖掘之通达OA2017任意文件上传(漏洞已失效)
- c语言continuo语句例子,现在进行时语法资源Present Continuous Tense(附资源)
- 我的电脑图标没了怎么办?3个方法找回消失的图标
- 计算机单招知识点重点,2018年度单招考试《数学》必背知识点(一).doc