1、 Applet 音频播放器 11 课题需求分析在 Java2 平台出现前,Java 语言只能处理电话音质的声音,以单声道 8KHz 的采样频率存储为 u-lawAU 文件。Java2 平台增加了 AIFF、WAV 以及三种 MIDI 文件类型的支持。所支持的三种 MIDI 文件格式为 MIDI 文件类型 0、MIDI 文件类型 1 以及 RMF。2 课程解决方案本程序有三个文件:SoundApplet.Java 是主文件,AppletSoundLoader.Java 中的AppletSoundLoader 类继承 Thrwad 负责为声音文件获得 AudioClip 对象并把它加到Applet
2、SoundList 中去;AppletSoundList.java 中定义的 AppletSoundList 继承自 Hashtable,提供 getClip(String)和 putClip(AudioClip,String)方法,分别从哈希表中取得 AudioClip对象和放置 AudioClip 对象。其结构是 AppletSoundList 中用 AppletSoundLoader 来装载制定 URL 的声音文件,AppletSoundLoader 负责为声音文件产生 AudioClip 对象并添加到 AppletSoundList 中。在 SoundApplet 中则只是利用 App
3、letSoundList 类。3 课题实现主要的声音文件类型如下:AU (扩展名为 AU 或 SND):适用于短的声音文件,为 Solaris 和下一代机器的通用文件格式,也是 Java 平台的标准音频格式。 AU 类型文件使用的三种音频格式为:8位 u-law 类型(通常采用频率为 8KHz) ,8 位线性类型以及 16 位线性类型。WAV(扩展名为 WAV):由 Microsoft 和 IBM 共同开发,对 WAV 的支持已经被加进 Windows95 并且被延伸到 Windows98。WAV 文件能存储各种格式包括 u-law、a-Applet 音频播放器 2law 和 PCM(线性)数
4、据。它们几乎能被所有支持声音的 Windows 应用程序播放。AIFF(扩展名为 AIF 或 IEF)音频互换文件格式是为 Macintosh 计算机和 Silicon Graphics(SGI)计算机所共用的标准音频文件格式。AIFF 和 AIFF-C 几乎是相同的,除了后者支持例如 u-law 和 IMA ADPCM 类型的压缩。MIDI(扩展名为 MID)乐器数字接口 MIDI 是为音乐制造业所认可的标准,主要用于控制诸如合成器声卡之类的设备。Java 声音引擎支持两种 MIDI 文件类型:MIDI 类型 0 文件- 包含仅仅一个序列,所有相关的乐器部分被包含在同一个逻辑“磁道”上。MI
5、DI 类型 1 文件- 包含多重的“磁道”使得不同的乐器被逻辑地分开,从而使对声音的操作和重组更加容易。RMF(扩展名为 RMF)混合音乐格式是由 Beatnik 设计出来的混合文件类型,通过交互设定将 MIDI 和音频采样封装在一起。RMF 好比是一个所有音乐相关文件的容器。RMF 也包含对有关版权的详细文件说明的支持。RMF 文件可以包含多个由不同艺术家创作的存储为 MIDI 类型或音频采样类型的作品,每个都关联着相关的版权信息。Java 中用于播放声音的 AudioClip 接口提供下列机能:播放、循环、停止。恢复和播放声音最简单的方法是通过 Applet 类的 play()方法。调用
6、play()方法有如下两种方式:play()带有一个参数,一个 URL 对象,装载并演奏储存在 URL 处的声音片段。Play()带有两个参数,基本 URL 和文件夹路径名,装载并演奏声音文件。第一参数经常是对 getCodeBase()或 DocumentBase()的调用。play()一旦被调用立刻开始恢复和播放声音。如果声音文件不能被查找,将不会有出错信息,仅仅是沉默。启动和停止声音文件,或循环播放,必须用 applet 的getAudioClip 方法把它装载进入 AudioClip 对象,类似上面 play()方法的参数,getAudioClip 方法要用一个或两个参数,当作播放的指
7、示。第一个或唯一的一个参数是URL 参数,用来指示声音文件的位置,第二参数是文件夹路径指针。Applet 音频播放器 3代码如下:/ SoundApplet.javaimport javax.swing.*;import java.applet.*;import java.awt.*;import java.awt.event.*;public class SoundApplet extends JAppletimplements ActionListener,ItemListener AppletSoundList soundList;String auFile = “soundspacem
8、usic.au“;String aiffFile = “soundflute+hrn+mrmba.aif“;String midiFile = “soundtrippygaia1.mid“;String rmfFile = “soundjungle.rmf“;String wavFile = “soundbottle-open.wav“;String chosenFile;AudioClip onceClip, loopClip;JComboBox formats;JButton playButton, loopButton, stopButton;boolean looping = fals
9、e;public void init() String fileTypes = auFile,aiffFile,midiFile, rmfFile,wavFile;formats = new JComboBox(fileTypes);formats.setSelectedIndex(0);/ 获得选中的声音文件名chosenFile = (String)formats.getSelectedItem();formats.addItemListener(this);playButton = new JButton(“Play“);playButton.addActionListener(this
10、);loopButton = new JButton(“Loop“);loopButton.addActionListener(this);stopButton = new JButton(“Stop“);stopButton.addActionListener(this);stopButton.setEnabled(false);Applet 音频播放器 4JPanel controlPanel = new JPanel();controlPanel.add(formats);controlPanel.add(playButton);controlPanel.add(loopButton);
11、controlPanel.add(stopButton);getContentPane().add(controlPanel);startLoadingSounds(); public void itemStateChanged(ItemEvent e) chosenFile = (String)formats.getSelectedItem();soundList.startLoading(chosenFile);void startLoadingSounds() / 开始装载声音文件soundList = new AppletSoundList(this, getCodeBase();so
12、undList.startLoading(auFile);soundList.startLoading(aiffFile);soundList.startLoading(midiFile);soundList.startLoading(rmfFile);soundList.startLoading(wavFile);public void stop() onceClip.stop(); /停止一次播放if (looping) loopClip.stop(); /停止循环播放 public void start() if (looping) loopClip.loop(); /重新启动循环播放
13、public void actionPerformed(ActionEvent event) Object source = event.getSource();if (source = playButton) /Try to get the AudioClip.Applet 音频播放器 5onceClip = soundList.getClip(chosenFile);onceClip.play(); /Play it once.stopButton.setEnabled(true); showStatus(“Playing sound “ + chosenFile + “.“);if (o
14、nceClip = null) showStatus(“Sound “ + chosenFile + “ not loaded yet.“);return;/如果按下循环按钮if (source = loopButton) loopClip = soundList.getClip(chosenFile);looping = true;loopClip.loop(); /开始循环播放loopButton.setEnabled(false); stopButton.setEnabled(true); showStatus(“Playing sound “ + chosenFile + “ cont
15、inuously.“);if (loopClip = null) showStatus(“Sound “ + chosenFile + “ not loaded yet.“);return;/如果按下停止按钮if (source = stopButton) if (looping) looping = false;loopClip.stop(); /停止循环播放loopButton.setEnabled(true); /使开始按钮可用else if (onceClip != null) onceClip.stop();stopButton.setEnabled(false); showStat
16、us(“Stopped playing “ + chosenFile + “.“);return;/ AppletSoundLoader.javaApplet 音频播放器 6import javax.swing.*;import java.applet.*;import .URL;class AppletSoundLoader extends Thread JApplet applet;AppletSoundList soundList;URL baseURL;String relativeURL;public AppletSoundLoader(JApplet applet, AppletS
17、oundList soundList,URL baseURL,String relativeURL) this.applet = applet;this.soundList = soundList;this.baseURL = baseURL;this.relativeURL = relativeURL;setPriority(MIN_PRIORITY);start();public void run() AudioClip audioClip = applet.getAudioClip(baseURL, relativeURL);soundList.putClip(audioClip, re
18、lativeURL);/ AppletSoundList.javaimport javax.swing.*;import java.applet.*;import .URL;/Loads and holds a bunch of audio files whose locations are specified/relative to a fixed base URL.class AppletSoundList extends java.util.Hashtable JApplet applet;URL baseURL;public AppletSoundList(JApplet applet
19、, URL baseURL) super(5); /初始化哈希表的容量为 5this.applet = applet;this.baseURL = baseURL;Applet 音频播放器 7public void startLoading(String relativeURL) new AppletSoundLoader(applet, this,baseURL, relativeURL);/ 通过相对 URL 从哈希表中获得 AudioClippublic AudioClip getClip(String relativeURL) return (AudioClip)get(relativ
20、eURL);/ 将 AudioClip 对象放进哈希表,键值为 relativeURLpublic void putClip(AudioClip clip, String relativeURL) put(relativeURL, clip);4 课题运行及调试运行结果入下图所示:按下“Loop”时,显示如下图 4.1,自动循环播放文件。图 4.1 界面图Applet 音频播放器 8按下“Stop” ,音乐播放暂停,显示如下图 4.2:图 4.2 暂停播放图5 小结由于编程经验的不足和知识水平有限,存在的问题比较多,播放器的功能太简单,可进行的操作太少,一些功能在实现起来也不太理想。这些都有待
21、进一步改善。在本项目开发的过程中,我学习了很多有关的知识。一些以前没有学得很杂实的课程的内容,由于需要在实践中运用,刚开始我也感到很头痛。但回过头再去看有关的教科书,经过一段时间的钻研,对与这些知识点的相关的背景,学习起来也越来越有兴趣。另外我还充分体会了从事软件开发工作需要特别严谨认真的态度和作风,一点都马虎不得。每一个细微的细节都必须十分的注意,如果不认真思考决策,就会出现或大或小的错误,如果早期的错误隐藏下来,对后面的工作影响就会很大,甚至有时要推倒很多前面做的工作重来。由于我的知识浅薄,经验不足及阅历颇浅,因此,在该播放器的设计方面还有很多不足,比如功能过少,界面不够醒目等问题,我会在学习过程中,根据设计的具体要求不断的修改,完善,争取使该播放器慢慢趋向完美。Applet 音频播放器 7