Java Tip 24: 如何在应用程序中播放声音文件
一个在 Java 应用程序中播放声音程序的 step-by-step 的向导
Chong Ser Wah
John D. Mitchell
简介
现有的在 Java applet 中对声音播放的支持使得声音播放任务变得很简单,但是在应用程序中缺少这样的支持。此篇小技巧将告诉你如何在 Java 应用程序中播放声音文件。(650 字)
在 Java 应用程序中播放声音文件在现有发行的 Java 版本中都没有正式的支持,但别担心,我们还是有办法的。此篇小技巧将告诉你怎么做--我们从 applet 中播放声音文件所需的基本步骤开始讲述,然后慢慢转到讲述 Java 应用程序中的支持。
在 applet 中播放声音文件非常简单,一般需要以下步骤:
创建一个 AudioClip 对象
装入 .au 声音文件到 AudioClip 对象
一次播放或者不停循环播放声音
停止播放
下面是相应的代码:
import java.applet.*;
AudioClip ac = getAudioClip(getCodeBase(), soundFile);
ac.play(); //play once
ac.stop(); //stop playing
ac.loop(); //play continuously
看起来,在 Java 应用程序中用相同的代码来播放声音文件似乎也是可行的。但很不幸,如果你真这样做,编译器就会报错。为什么呢?因为 AudioClip 对象及其方法 getAudioClip() 属于java.applet 包 -- 而不属于应用程序包的。可喜的是我们还可以自己做些改变来实现声音播放功能。
解决这个问题的窍门是利用由 Sun 及 其JDK 提供的某些 undocumented 的特征。先看看 Sun JDK 中的文件 classes.zip (使用任何解压工具即可),发现其中不仅包含标准的 Java 包如 java.applet 而且还存在包 sun.audio. (在 sun/audio 的目录下.)
包 sun.audio 中包含了用于播放声音文件所需的所有东西!下面是示例代码:
import sun.audio.*; //import the sun.audio package
import java.io.*;
//** add this into your application code as appropriate
// Open an input stream to the audio file.
InputStream in = new FileInputStream(Filename);
// Create an AudioStream object from the input stream.
AudioStream as = new AudioStream(in);
// Use the static class member "player" from class AudioPlayer to play
// clip.
AudioPlayer.player.start(as);
// Similarly, to stop the audio.
AudioPlayer.player.stop(as);
如果要用一个 URL 做为声音流的源(source),则用下面的代码所示替换输入流来创建声音流:
AudioStream as = new AudioStream (url.openStream());
如果需要持续播放声音文件,则要稍稍复杂一点:
// Create audio stream as discussed previously.
// Create AudioData source.
AudioData data = as.getData();
// Create ContinuousAudioDataStream.
ContinuousAudioDataStream cas = new ContinuousAudioDataStream (data);
// Play audio.
AudioPlayer.player.play (cas);
// Similarly, to stop the audio.
AudioPlayer.player.stop (cas);
现在知道怎么做了吧?别忘了,此技巧用到了没有写入文档的特征,所以它不保证在任何情况下都凑效,但用当前 SUN 的 JDK 是没有问题的。