美文网首页tech
Java 音频处理技术简介

Java 音频处理技术简介

作者: 搞技术的薛彬 | 来源:发表于2017-06-07 10:52 被阅读0次

Java Sound包介绍

Java sound API 比较简单陈旧,受操作系统影响较大,无法满足一些专业场景。比如在 windows 下8路输入的声卡会被识别为4个2路输入的设备,无法协同工作。但是它提供了很多基础 API,还是很有必要了解一下的。

包:

  • 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 Sound包介绍 Java sound API 比较简单陈旧,受操作系统影响较大,无法满足一些专业场景。...

  • 音频与处理技术

    声音是因物体的振动而产生的一种物理现象。振动使物体周围的空气绕动而形成声波,声波以空气为媒介传入人的耳朵,于是人们...

  • iOS直播开发相关资源

    直播中运用到的技术难点非常之多,视频/音频处理,图形处理,视频/音频压缩,CDN分发,即时通讯等技术。宏观介绍参照...

  • 菜鸟教程——iOS直播app开发

    直播中运用到的技术难点非常之多,视频/音频处理,图形处理,视频/音频压缩,CDN分发,即时通讯等技术, 已经有各个...

  • AudioSession简介(-)

    AudioSession简介 iOS 通过sessions和AudioSession APIs处理音频行为,交互(...

  • 01 JAVE 介绍

    简介 JAVE(Java Audio Video Encoder,Java音频视频编码器)库是ffmpeg项目上的...

  • iOS音频处理技术总结

    最近项目中需要用到音频处理的相关技术,因此也总结了一下音频相关的知识,理解了这些基本知识才能更好地深入去了解音频处...

  • 莫愁前路无知己,天下谁人不识君(缅怀雷霄骅)

    视音频数据处理入门系列文章(转载) 视音频编解码技术零基础学习方法 视音频数据处理入门:RGB、YUV像素数据处理...

  • JMX

    简介 全称Java Management Extensions,从Java5.0开始引入到标准Java技术平台中。...

  • FFmpeg使用(一)

    简介 ffmpeg是处理音频和视频的程序,可以将音频和视频装换成流,并且包含了音频/视频的解码库libavcode...

网友评论

    本文标题:Java 音频处理技术简介

    本文链接:https://www.haomeiwen.com/subject/lvuofxtx.html