当前位置:首页 > 图灵资讯 > 技术篇> JAVA声音技术

JAVA声音技术

发布时间:2024-02-28 17:19:47

JAVA声音技术

声音可以创造意境,触发遐想。当与虚拟图像结合时,它可以使整个世界充满幻觉。声音是多媒体技术的基础。这是Sun的JAVA媒体技术开发团队正忙于为Java做准备 Sound 1.0 下一版JAVA开发工具库中包含API的原因。

JAVA2平台出现前,JAVA语言只能处理电话音质的声音,以单声道8KHZ的采样频率存储为基础μ-law AU文件。JAVA2平台增加了对AIFF、WAV和三种MIDI文件类型的支持。三种MIDI文件格式为MIDI文件类型0、MIDI文件类型1、还有RMF。

API1.0版的应用程序接口提供了一个易于使用的工具集,使程序员能够访问底层的合成和演奏引擎,从而扩展JAVA声音的应用。创建数字音频和乐器指令数字接口MIDI是两个重要领域。程序员可以输入输出声音,控制MIDI设备,并查询系统运行,因为它提供了大量的底层支持功能。

声音文件类型简介

声音文件的主要类型如下:AU - (扩展称为AU或SND)适用于短语音文件,是Solaris和下一代机器的通用文件格式,也是JAVA平台的标准音频格式。AU类型文件使用的三种典型音频格式为: 8位μ-law类型(通常采样频率为8kHz), 8位线性类型,16位线性类型。 WAV - (扩展为WAV) Microsoft和 在Windows中,IBM共同开发并支持WAV 它延伸到Windows 98. WAV文件可以存储各种格式包括μ-law,a-law和 PCM (线性)数据。它们几乎可以被所有支持声音的Windows应用程序播放。 AIFF - (扩展称为AIF或IEF)音频交换文件的格式是Macintosh计算机和Silicon Graphics (SGI)计算机共用的标准音频文件格式。AIFF和 AIFF-除了后者的支持,C几乎是一样的,比如μ-law和 IMA 压缩ADPCM类型。MIDI - 乐器数字接口MIDI是音乐制造业公认的标准,主要用于控制合成器、声卡等设备。 MIDI文件不包括数字音频采样,而是包括将来自不同乐器的音符序列合成音乐的一系列指令。一些MIDI文件包含附加指令来编程各种合成设置。 大多数合成器支持MIDI标准,因此在一个合成器上制作的音乐可以在另一个合成器上播放。 有 MIDI接口的计算机可以操纵 MIDI数据产生新的音乐或音响效果。例如,一个完整的音乐作品可以通过软件驱动的命令转换为一种新的形式。JAVA声音引擎支持两种MIDI文件类型: MIDI类型0文件-只包含一个序列,所有相关乐器都包含在同一逻辑中 “磁道”上。 MIDI类型1文件-包含多重文件 “磁道”使不同的乐器逻辑分离,使声音更容易操作和重组。RMF - (扩展称为RMF)混合音乐格式是Beatnik设计的混合文件类型,通过交互式设置包装MIDI和音频采样。RMF就像所有音乐相关文件的容器。RMF还包括对相关版权详细文件说明的支持。RMF文件可以包含多个存储为MIDI类型或音频采样类型的作品,由不同的艺术家创作,每个作品都与相关的版权信息相关。

选择声音发动机

1997年,SUNJAVA媒体开发团队试图找到提高声音处理能力和为未来提供坚实平台的方法。Michael是JAVA媒体开发组经理 bundschuh说, “我们想要一个非常高质量的播放引擎来处理所有的八位μ-law级直到 CD质量声音的每一个操作。 我们希望能够轻松跨越Solaris等所有平台, Windows, Mac等。我们也希望能够跨越不同平台的MIDI能力得到高度发展。为了上述目的,Beatnik的音频引擎是合理的选择(以前是Headspace。)“SUN获得了Beatnik的音频引擎使用许可证,并将其作为JAVA声音应用程序接口API的基础。Thomas Dolby Robertson-Beatnik简介

90年代初之前,Thomas Dolby Robertson的职业完全是音乐。“她用科学照亮我”是他1982年推出的早期MTV巨作。在20世纪80年代,他使用非结构化音乐制作软件不断地作曲和录音。但是在 1990年,通过在Guggenheim博物馆演示虚拟现实的合作,他开始思考是否可以做一些提高音乐制作能力的工作。“我当时正伏在那里 在C程序员的肩膀上,我突然意识到我为记录做了很多工作,但在演奏过程中没有为交互做任何事情。“有了这个想法,Robertson于1992年成立了Headspace,雇佣月光作曲组来帮助实现他的观点。Headspace于1996年成为一家公司,现在被称为Beatnik。

JAVA声音频发动机

JAVA声音引擎是多媒体创建的,考虑到游戏设计和WEB内容的发布。用标准的 来自任何源的MIDI文件、RMF文件和/或采样将播放音乐或制造音响效果,并尽可能少地使用CPU。具有混音能力,能够实时响应用户的输入,提供完整的播放控制。 JAVA声音引擎是软件 MIDI合成器、采样播放设备和16位立体混声器。它支持混合到64位的立体MIDI声音和音频采样。它直接支持MIDI类型0和类型1文件以及从8位设备到16位乐器的波表合成。该发动机支持所有通用发动机 MIDI控制器,包括象回声处理, LFO (控制过滤器或立体声设备)和ADSR信封 (播放时整形采样)。JAVA声音发动机即使使用了所有功能,也占据了90mhz奔腾计算机的不超过30个%CPU时间。它还可以通过有选择地禁用不必要的特性,使其更有效率。此外,它还发布了存储在压缩RMF音乐文件中的丰富内容。Thomas Dolby Robertson的“她用科学照亮了我”,一首7分21秒的歌,比如存储为CD音质的文件,占据了70M字节的空间。如果以RMF的形式存储,只需636左右 KB,是120:1减少,完全不降低音质。有关Beatnik的更多信息,请参见Beatnik的WEB网站。

JAVA平台声音简要历史

在JDK 1.0.x及JDK 1.1.x下, AudioClip接口提供以下功能:l AudioClip接口播放循环停止恢复和播放声音最简单的方法是通过Appletplay()。有两种方法可以调用play(): play()-带有一个参数,一个参数, URL对象存储在装载和演奏中 URL处的声音被切断。play()-基本上有两个参数 URL和文件夹路径名,装载和演奏声音文件。第一个参数通常是getcodeBase()或 getDocumentBase()调用。 以下代码片段的例子说明了直接播放 hello.au的方法。位于相同文件夹或目录中的AU文件和小应用程序。

play(getCodeBase(), "hello.au");

play()一旦被调用,立即开始恢复和播放声音。如果找不到声音文件,就不会有错误的信息,只是沉默。您必须启动和停止声音文件或循环播放 applet getAudioClip方法将其装载到其中 AudioClip对象,类似于上述play()方法的参数,应使用一个或两个参数作为播放指示。 第一个或唯一的参数是 用于指示声音文件位置的URL参数,第二个参数是文件夹路径指针。

以下代码行例说明加载声音文件进入剪贴对象: AudioClip co = getAudioClip(getCodeBase(), "horns.wav");

getAudioClip()方法只能在applet中调用。随着Java2的引入,声音文件也可以通过AppletnewaudioClip安装应用程序。前一个例子可以重写如下Java应用程序:

AudioClip co = newAudioClip("horns.wav");

在你已创建 AudioClip对象后,您可以使用该对象调用play()、loop()和stop()方法。如果 getAudioClip或 newaudioClip方法找不到指定的声音文件, AudioClip对象的值将是空的。试图播放空对象会导致错误,因此标准过程首先是检测这一条件。接下来是一个完整的程序设计示例,当鼠标按下小应用程序applet范围时,该程序将生成applet flute+hrn+mrmba.au音乐样本。在同一目录或文件夹下,这个AU示例文件与applet相同。

import java.applet.*;import java.awt.event.*;public class PlayAudio extends Appletimplements MouseListener {AudioClip audio;public void init() {audio = getAudioClip(getDocumentBase(),"flute+hrn+mrmba.au");addMouseListener(this);}public void mousePressed(MouseEvent evt) {if (audio != null) audio.play();}public void mouseEntered (MouseEvent me) {}public void mouseExited (MouseEvent me) {}public void mouseClicked (MouseEvent me) {}public void mouseReleased(MouseEvent me) {}}

注意: 在许多JAVA2技术书籍中,mouseDown()方法确实是JAVA 1.0事件模型的一部分。使用这种方法是危险的,因为这种方法将来可能不会得到支持。MouseListener和mousePressed在JAVA2平台下结合使用是首选。

API 1.0-质的飞跃

注意:JAVA注释如下: API的早期版本是基于0.86。虽然这里讨论的大多数对象和概念与过去一致,但可能会有一些变化,因为API版本已经终止。JAVA声音 1.0 API为JAVA平台定义了一套基本的底层音频处理功能。它提供以下接口:

音频捕获和播放

IDI合成及序列化

在各自的程序包中提供这两个主要功能模块。javax.media.sound.sampled-该程序包明确描述了数字采样音频的捕获、混合和回播界面。javax.media.sound.MIDI-该程序包提供了MIDI合成、序列化和事件传输的界面。

JAVA 1.0 API具有以下特点:

数字音频

频捕获-数据捕获来自输入源,如麦克风。

音和重播-混合并重播各种输入源的声音。

制与编码-调整增益、定位、回声处理等,并进行格式转换。

态及其提示-当重播开始和结束、设备开启或关闭以及其他相关事件发生时,接收事件。

支持MIDI

MIDI新闻-交换信息(打开音符,关闭音符等)

合成-将乐器从MIDI数据中安装并产生声音。

序列化-安装MIDI序列,开始和停止播放,并调整节奏。

工具

件输入输出-WAV、AIF和通用音频文件的阅读和写作MIDI

置-查询系统获取组件和设备的信息;编码、文件分析器和设备的安装或取消。

数字化音频

通道Kara Kytle, JAVA声音 “Channel是音频管道的基本功能部件,”API主管工程师和系统设计师说。Channel界面的实现代表了“管道”的一个元素,如硬件设备、声合成器或单音频流。InputChanel和 Outputchanel继承了channel,用于读取被捕获的数据并为播放写数据。Clip支持预装音频数据的循环播放和重新定位。Device表示任何用于捕获、播放或混合音频的硬件或软件设备。该界面的层次结构如下图所示。参考包javax.media.sound.sampled。

 

当Channel打开时,它为自己保留了系统资源 ,当它结束时,这些资源被释放给其他应用程序和对象。Channel是打开还是关闭,都可以用isopen()的方法查询。数据处理通常由子界面方法启动,如read()方法,在Inputchanel界面中描述 (请看JAVA的声音 API说明书)。处理方法使Channel处于负责输入或输出音频数据的状态。Channel是否处于这种状态可以通过isActive方法来识别。通过调用pause()方法可以暂停通道,这种状态可以通过ispaused()来判断。当通道被暂停时,有三种选择:保留数据(缺失),通过flush()丢弃内部缓冲器中的数据,或通过drain()立即处理内部缓存中的数据。对象可以提前注册,这样每当通道状态发生变化时,就可以收到通知信息。注册对象必须实现Chanel.Listener界面,该界面只包含update()的一种方法。这种方法在Chanel打开、结束、启动和停止时都会被调用。当channel开始或停止活动,开始或停止捕获数据时,start或stop事件就会发生。

输入通道InputChannel是被捕获的音频数据的来源。这个界面提供了一种方法,可以从 InputChanel缓冲器读取捕获的数据,并判断当前可读数据量。如果应用程序试图读取过多的数据,则该读取方法将被阻止,直到所需的读取数据达到。

输出通道outputchanel接收用于播放的音频数据。该接口提供将要播放的数据写入outputchanel缓冲区的方法,并判断该通道不间断可接收的数据量。如果应用程序试图写出过多的数据,则读取方法将被阻塞,直到有足够的数据。

剪贴Clip接口表示一个特殊的通道,可以在播放前安装音频数据。Clip可以支持持续查询、循环播放和重新定位播放,因为数据是预装的,而不是流入的。

设备Device界面是表示音频设备类别的提供方法。音频设备可以共享或独家系统资源,可以基于硬件、软件或两者。它可以反复打开和关闭,它可以经常解释其内部特征和支持的音频格式。同时,它还提供描述设备的信息对象。JAVA声音 API进一步描述了三个设备子界面:Inputdevice界面为获取Inputchanel的Inputchanel获取Inputchanel对象提供了一种方法,从中捕获可读的音频数据。outputputputputputdevice界面提供了获取outputputchanel的方法,以获得outputchanel对象。音频数据可以写入输出通道并播放。MixerMixer支持多个InputChanel和/或Clip。 此外,它还提供了支持同步暂停和唤醒多个通道播放的查询方法。

控制通道和音频端口 (如扬声器和麦克风)通常支持一组控制器,如增益和定位。JAVA声音通过将其类作为参数传输到getcontrol() API的通道对象和端口对象可以获得特殊控制。

编码器Codecs可以编码和解码音频数据,允许在不同格式和编码之间转换。JAVA声音 API通过AudioSystem中的方法为这些转换提供了先进的接口。如果提供了特殊的音频流,应用程序将查询音频系统以找到相应的转换,以获得指定格式的音频流。

文件流和流音频流是与音频数据格式和数据长度相关的输入流,是与文件类型和数据长度相关的输入流。JAVA声音 API在AudioSystem类中为音频文件和音频流之间的转换提供了界面。

查询和访问安装组件Audiosystem作为采样音频系统资源的入口。这类程序员允许查询和访问输入设备、输出设备和安装的混音设备。此外,Audiosystem还包括许多在不同音频数据格式之间转换的方法。它还提供了一些直接获得输入或输出通道的方法,而无需直接操作设备。

系统配置-服务提供者界面(SPI)javax配置采样音频系统.media.sound.sampled.完成了spi包。通过 AudioConfig类的方法可以在系统中安装或卸载设备,并且可以建立缺省状态。服务提供商可以提供和安装自己的编码器和分析器。该包提供了完成此功能的机制。下图描述了音频输入输出的功能流。

 

MIDIjavax.media.sound.MIDI程序包描述了 MIDI事件传输、合成和序列化界面。以下是程序包中使用的主要概念。

基本的MIDI传输界面是 MidiDevice。所有设备都为列出其支持的模式和查询当前模式提供了方法。设备支持监听器,可以监控各种事件,如开关事件,并有一个描述设备状态的信息对象。 通常,该设备是MIDI事件的传送器或接收器之一。传送器界面提供了设置和查询接收器的方法,接收器接收传送器发送的MIDI事件。接收器提供接收MIDI事件的方法。 基本的 Midievent的对象是通过一条信息解释事件类型、数据长度和状态。它还为涉及MIDI计时的设备提供准确的计时信号,如音序器。

合成器界面是一种特殊类型的接收器,产生声音。它还提供了一些管理声音库和乐器的方法。此外,合成器还可以支持一组全球非-MIDI控件,如增益和定位。它还提供了一组MIDI通道的访问,实际上,声音是通过这些通道产生的。Midichanel界面提供一组表达公共MIDI声音信息的方法,例如 noteON, noteoff和controlchange。还支持查询当前通道状态。

序列化Sequencer界面继承了Mididevice,提供了完成基本MIDI序列化操作的方法。音序器可以装载和播放一个序列,查询和设置节奏,并控制主从同步模式。在处理设备单元和控制器事件时,还可以通过注册应用程序通知自己。

文件和序列化序列化对象代表来自一个或多个磁道的MIDI序列和相关计时信息。磁道对象包含一系列时间标记的MIDI事件。JAVA声音 API在 Midisystem类为MIDI文件和序列化对象之间的转换提供了先进的接口。

查询和访问已安装的组件Midisystem作为MIDI音乐系统的入口。它提供相关设备的信息并访问它们,包括传送器、接收器、合成器和音序器。它还提供了对SoundBank对象的访问。

系统配置-服务提供者接口(SPI)javax配置MIDI系统.media.sound.midi.完成了spi包。设备可以通过MidiConfig安装到系统中或卸载,并可以建立缺省状态。服务提供商希望提供和安装自己的文件和声音库分析器。完成此功能的机制包含在SPI程序包中。现在让我们来看看我们能用这些类别和方法做些什么。请仔细检查。

Toysynth应用程序

 

ToySynth应用程序早期测试JAVA声音 API访问主要提供一系列设备设置,包括MIDI通道选择、音量控制、立体声定位、回声处理等选项。使用指定设备的音乐可以通过敲击键盘来演奏,这些设备都是通过JAVA声音发动机来实现的。

完整的ToySynth.java代码样本。

下载JAVA声音 API还可以获得示范应用程序及其源代码。

JAVA声音 API的市场目标

JAVA声音 API为各种应用程序提供声音支持。以下是一些可能的应用程序。通信框架

远程会议通过计算机在计算机上实现电话功能 内容发布系统音乐信息流媒体传播交互应用程序游戏WEB网站生成动态内容工具集内容生成各种工具

在此基础上,我们能做些什么?

JAVA 2通过 访问JAVA声音音频引擎的AudioClip界面。随着1.0 API的发布,我们探索的应用领域,将提供给各地的开发人员。“现在,我们通过在JAVA2平台上增加真实声音的支持,启动了计算机桌面多媒体市场。未来,我们将看到我们的JAVA声音API技术广泛应用于专业人士、普通用户和国际互联网音频应用。 Michael bundschuh说。 电影和录音带公司使用JAVA声音 API技术可以获得专业质量的音频效果。支持JAVA声音引擎中的24位音频和多通道配置将鼓励专业人士开发高级声音编辑和播放应用程序。根据 Kara Kytle表示,对MP3等更多音频数据类型的支持已被提上议事日程。另一个议程是从外部设备捕获MIDI数据。这将很快实现。"她说。 JAVA的声音 通过WEB的音频播放,API技术已经可以很好的应用了。“bundschuh说。“但我们总是跟踪最新的技术,开发MP3等技术,同时保护音乐文件的安全传输。我们计划JAVA声音 API在未来版本中提供对上述技术的支持。 伴随着近期市场的发展,就像播放基于WEB音乐的竞争策略一样,每个人都把数字声音的发展放在了中心。新媒体技术不断涌现,声音将发挥核心作用。JAVA声音 1.0 API将及时添加到新的关键应用程序开发行列中。

现在可以得到ToySynth.java程序代码通过图形生动地表示合成器,并通过鼠标按合成器上的键演奏音乐。您可以通过声音设置和其他选项来改变声音的基调。很有趣

上一篇 Java动画编程基础第一部分
下一篇 用JAVA编制电子白板软件

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题