1、目 录一 引 言 1二 JAVA 的 声 音 技 术 1(一 )声 音 文 件 类 型 简 介 11.主 要 的 声 音 文 件 类 型 如 下 : 12.JAVA 声 音 引 擎 支 持 两 种 MIDI 文 件 类 型 : 23.JAVA 声 音 音 频 引 擎 3(二 ) JAVA 平 台 声 音 的 简 要 介 绍 3三 基 于 Java 的 音 频 播 放 器 的 实 现 5(一 )设 计 过 程 5(二 )伪 代 码 的 设 计 5(三 )编 译 和 运 行 7四 结 论 7致 谢 7参 考 文 献 72基 于 JAVA 语 言 的 多 媒 体 音 频 播 放 器 的 实 现摘 要
2、 本 文 介 绍 了 基 于 JAVA 语 言 的 多 媒 体 技 术 , 简 要 分 析 了 JAVA 语 言 在 多媒 体 设 计 中 的 应 用 。 内 容 涉 及 声 音 播 放 的 基 本 技 术 。 并 给 出 了 里 利 用 JAVA语 言 实 现 音 频 播 放 器 的 设 计 全 过 程 。关 键 词 JAVA 多 媒 体 , 音 频 , 声 音 播 放一 引 言JAVA 是 SUN 公 司 推 出 的 面 向 对 象 程 序 设 计 语 言 , 它 将 面 向 对 象 ,平 台 无 关性 ,稳 固 性 ,安 全 性 ,多 线 程 等 特 性 集 于 一 身 ,具 有 强 大
3、 的 动 画 ,多 媒 体 和 交 互 功能 ,使 WWW(WORLD WIDE WEB)进 入 一 个 全 新 的 交 互 领 域 ,是 INTERNET 网 络 应 用开 发 最 重 要 的 语 言 之 一 。 多 媒 体 制 作 一 直 是 计 算 机 应 用 中 最 具 魅 力 的 部 分 ,JAVA 能 制 作 诱 人 的 多 媒 体 WEB 起 始 页 ,使 您 的 WEB 站 点 更 具 有 吸 引 力 。为 此 ,我 们 先 简 要 解 释 JAVA 的 声 音 技 术 , 并 利 用 此 技 术 设 计 与 实 现 了 一 个 多 媒 体音 频 播 放 系 统 ,其 能 对
4、所 播 放 的 文 件 进 行 控 制 ( 包 含 暂 停 , 停 止 等 功 能 ) 。二 JAVA 的 声 音 技 术在 JAVA2 平 台 出 现 之 前 , JAVA 语 言 只 能 处 理 电 话 音 质 的 声 音 , 以 单 声 道8KHZ 的 采 样 频 率 存 储 为 -law AU 文 件 。 JAVA2 平 台 增 加 了 对 AIFF, WAV 以及 三 种 MIDI 文 件 类 型 的 支 持 。 所 支 持 的 三 种 MIDI 文 件 格 式 为 MIDI 文 件 类 型0、 MIDI 文 件 类 型 1、 以 及 RMF。应 用 程 序 接 口 API1.0 版
5、 提 供 了 一 个 易 于 使 用 的 工 具 集 , 使 程 序 员 可 以 访 问 底层 的 合 成 与 演 奏 引 擎 , 从 而 扩 展 了 JAVA 声 音 的 应 用 。 其 中 两 个 重 要 的 领 域 是 创建 数 字 化 音 频 以 及 乐 器 指 令 数 字 化 接 口 MIDI。 由 于 提 供 了 大 量 的 底 层 支 持 功 能 ,所 以 程 序 员 能 输 入 输 出 声 音 , 控 制 MIDI 设 备 , 并 能 查 询 系 统 运 作 情 况 。( 一 ) 声 音 文 件 类 型 简 介1.主 要 的 声 音 文 件 类 型 如 下 :AU - (扩 展
6、 名 为 AU 或 SND)适 用 于 短 的 声 音 文 件 , 为 Solaris 和 下 一 代 机器 的 通 用 文 件 格 式 , 也 是 JAVA 平 台 的 标 准 的 音 频 格 式 。 AU 类 型 文 件 使 用 的 三种 典 型 音 频 格 式 为 : 8 位 -law 类 型 ( 通 常 采 样 频 率 为 8kHz), 8 位 线 性 类型 , 以 及 16 位 线 性 类 型 。 WAV - (扩 展 名 为 WAV)由 Microsoft 和 IBM 共 同 开 发 ,对 WAV 的 支 持 已 经被 加 进 Windows 95 并 且 被 延 伸 到 Wind
7、ows 98. WAV 文 件 能 存 储 各 种 格 式 包 括 -law,a-law 和 PCM (线 性 )数 据 。 他 们 几 乎 能 被 所 有 支 持 声 音 的 Windows应 用 程 序 播 放 。 AIFF - (扩 展 名 为 AIF 或 IEF)音 频 互 换 文 件 格 式 是 为 Macintosh 计 算 机 和Silicon Graphics (SGI)计 算 机 所 共 用 的 标 准 音 频 文 件 格 式 。 AIFF 和 AIFF-C 几 乎 是 相 同 的 ,除 了 后 者 支 持 例 如 -law 和 IMA ADPCM 类 型 的 压 缩 。MI
8、DI - (扩 展 名 为 MID)乐 器 数 字 接 口 MIDI 是 为 音 乐 制 造 业 所 认 可 的 标 准 ,主 要 用 于 控 制 诸 如 合 成 器 和 声 卡 之 类 的 设 备 。 MIDI 文 件 不 包 含 数 字 音 频 采 样 , 而 是 包 括 一 系 列 指 令 , 这 些 指 令 控 制 把 来 自 不同 乐 器 上 的 音 符 序 列 合 成 乐 曲 。 一 些 MIDI 文 件 包 含 附 加 指 令 来 为 各 种 合 成 设 置进 行 编 程 。 大 多 数 合 成 器 支 持 MIDI 标 准 , 所 以 在 一 个 合 成 器 上 制 作 的 音
9、 乐 能 够 在 另 一 个上 播 放 。 有 MIDI 接 口 的 计 算 机 能 操 纵 MIDI 数 据 以 产 生 新 音 乐 或 音 响 效 果 。例 如 , 一 个 完 整 的 音 乐 作 品 可 以 通 过 一 个 软 件 驱 动 的 命 令 转 换 成 全 新 的 形 式 。2.JAVA 声 音 引 擎 支 持 两 种 MIDI 文 件 类 型 : MIDI 类 型 0 文 件 -包 含 仅 仅 一 个 序 列 , 所 有 相 关 的 乐 器 部 分 被 包 含 在 同 一 个 逻辑 “磁 道 “上 。 MIDI 类 型 1 文 件 -包 含 多 重 的 “磁 道 “使 得 不
10、 同 的 乐 器 被 逻 辑 地 分 开 , 从 而使 对 声 音 的 操 作 和 重 组 更 加 容 易 。RMF - (扩 展 名 为 RMF)混 合 音 乐 格 式 是 由 Beatnik 设 计 出 来 的 混 合 文 件 类 型 ,通 过 交 互 式 设 定 将 MIDI 和 音 频 采 样 封 装 在 一 起 。 RMF 好 比 是 一 个 所 有 音 乐 相关 文 件 的 容 器 。 RMF 也 包 含 对 有 关 版 权 的 详 细 文 件 说 明 的 支 持 。 RMF 文 件 可 以包 含 多 个 由 不 同 艺 术 家 创 作 的 存 储 为 MIDI 类 型 或 音 频
11、 采 样 类 型 的 作 品 ,每 个都 关 联 着 相 关 的 版 权 信 息 。3.JAVA 声 音 音 频 引 擎JAVA 声 音 引 擎 为 多 媒 体 创 建 , 同 时 考 虑 了 游 戏 设 计 和 发 布 WEB 内 容 。 用标 准 的 MIDI 文 件 、 RMF 文 件 、 并 且 /或 来 自 任 何 源 的 采 样 , 该 引 擎 将 播 放 音 乐或 制 造 音 响 效 果 , 同 时 尽 可 能 少 用 CPU。 它 提 供 完 全 的 播 放 控 制 , 具 有 混 合 音响 的 能 力 并 可 实 时 地 回 应 用 户 的 输 入 。 4JAVA 声 音 引
12、 擎 是 软 件 MIDI 合 成 器 ,采 样 播 放 设 备 ,以 及 16 位 立 体 混 声 器 。它 支 持 混 合 直 到 64 位 的 立 体 MIDI 声 音 和 音 频 采 样 。 它 直 接 支 持 MIDI 类 型0 和 类 型 1 文 件 以 及 从 8 位 设 备 到 16 位 乐 器 的 波 表 合 成 。 该 引 擎 支 持 所 有 通 用的 MIDI 控 制 器 并 且 包 含 象 回 声 处 理 , LFO (控 制 过 滤 器 或 立 体 声 设 备 )之 类的 特 性 , 以 及 ADSR 信 封 (播 放 时 整 形 采 样 )。即 使 用 上 所 有
13、的 功 能 , JAVA 声 音 引 擎 在 一 个 90Mhz 的 奔 腾 计 算 机 上 也 占 用不 超 过 30 的 CPU 时 间 。 它 还 能 通 过 有 选 择 地 禁 用 不 需 要 的 特 性 , 使 其 变 得 更 加高 效 一 些 。 另 外 , 它 发 布 了 存 储 在 压 缩 的 RMF 音 乐 文 件 中 的 丰 富 的 内 容 。Thomas Dolby Robertson 的 “她 用 科 学 照 亮 了 我 “, 一 首 7 分 21 秒 的 歌 曲 ,如 存 储 为 CD 音 质 的 文 件 足 足 占 用 70M 字 节 空 间 。 如 果 以 RMF
14、 格 式 存 储 只 需 大约 636 KB,是 120:1 的 减 少 , 同 时 丝 毫 不 减 音 质 。(二 ) JAVA 平 台 声 音 的 简 要 介 绍在 JDK 1.0.x 及 JDK 1.1.x 下 , AudioClip 接 口 提 供 下 列 机 能 :AudioClip 接 口播 放 循 环 停 止恢 复 和 播 放 声 音 最 简 单 的 方 法 是 通 过 Applet 类 的 play()方 法 。 调 用play()方 法 有 如 下 二 种 方 式 : play()-带 有 一 个 参 数 , 一 个 URL 对 象 ,装 载 并 演 奏 储 存 在 URL
15、处 的 声 音片 断 。play()-带 有 二 个 参 数 , 基 本 URL 和 文 件 夹 路 径 名 ,装 载 并 演 奏 声 音 文 件 。第 一 参 数 经 常 是 对 getCodeBase()或 getDocumentBase()的 调 用 。 下 列 代 码 片 断 举 例 说 明 了 直 接 播 放 hello.au 的 方 法 。 AU 文 件 与 小 应 用 程序 位 于 相 同 文 件 夹 或 目 录 。play(getCodeBase(), “hello.au“);play()一 旦 被 调 用 立 刻 开 始 恢 复 和 播 放 声 音 。 如 果 声 音 文 件
16、 不 能 被 查 找 ,将 不 会 有 出 错 信 息 ,仅 仅 是 沉 默 。启 动 和 停 止 声 音 文 件 ,或 循 环 播 放 ,你 必 须 用 applet 的 getAudioClip 方法 把 它 装 载 进 入 AudioClip 对 象 , 类 似 上 面 play()方 法 的 参 数 ,getAudioClip 方 法 要 用 一 个 或 两 个 参 数 ,当 作 播 放 的 指 示 。 第 一 个 或 唯 一 的一 个 参 数 是 URL 参 数 , 用 来 指 示 声 音 文 件 的 位 置 , 第 二 参 数 是 文 件 夹 路 径 指 针 。 下 列 代 码 行
17、 举 例 说 明 加 载 声 音 文 件 进 入 剪 贴 对 象 : AudioClip co = getAudioClip(getCodeBase(), “horns.wav“);getAudioClip()方 法 仅 仅 能 被 applet 内 调 用 。 随 着 JAVA2 的 引 入 , 应 用 程序 也 能 用 Applet 类 的 newAudioClip 方 法 装 入 声 音 文 件 。 前 一 例 子 可 以 改 写 如下 以 用 于 Java 应 用 程 序 :AudioClip co = newAudioClip(“horns.wav“);在 你 已 创 建 Audio
18、Clip 对 象 之 后 ,你 能 用 该 对 象 调 用 play()、 loop()以 及stop()方 法 。 如 果 getAudioClip 或 newAudioClip 方 法 不 能 找 到 指 定 的 声 音文 件 , AudioClip 对 象 的 值 将 是 空 的 。 试 着 播 放 空 对 象 会 导 致 出 错 , 所 以 标 准 的过 程 首 先 是 对 该 条 件 进 行 检 测 。接 下 来 是 一 个 完 整 的 程 序 设 计 示 例 , 该 程 序 将 产 生 一 个 applet, 当 鼠 标 在该 小 应 用 程 序 applet 范 围 内 按 下
19、时 会 播 放 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
20、(this);public void mousePressed(MouseEvent evt) if (audio != null) audio.play();public void mouseEntered (MouseEvent me) public void mouseExited (MouseEvent me) 6public void mouseClicked (MouseEvent me) public void mouseReleased(MouseEvent me) 到 此 为 止 , 我 们 已 经 简 单 介 绍 了 JAVA 的 声 音 技 术 , 下 面 我 们 该 做
21、 的 就 是 利用 此 技 术 制 作 一 个 基 于 JAVA 音 频 播 放 器 。三 基 于 JAVA 的 音 频 播 放 器 的 实 现( 一 ) 设 计 过 程首 先 , 该 音 频 播 放 系 统 要 有 一 个 主 窗 口 ( 见 图 一 ) , 作 为 使 用 该 音 频 播 放 器 的操 作 界 面 。 其 次 , 由 于 该 音 频 播 放 器 是 一 个 菜 单 驱 动 的 多 媒 体 应 用 , 就 是 要 对 每 个菜 单 项 设 立 相 应 的 操 作 ; 选 择 “播 放 ”菜 单 项 , 则 开 始 播 放 音 乐 , 用 户 就 可 以听 到 声 音 了 。
22、选 择 “暂 停 ”菜 单 项 , 则 就 暂 停 正 在 播 放 的 音 乐 。 选 择 “停 止 ”菜 单 项 , 则 就 终 止 音 频 的 播 放 。 最 后 , 来 看 看 整 个 音 频 播 放 器 系 统 的 设 计 流 程 。 如图 二 所 示在 了 解 整 个 系 统 的 设 计 流 程 后 , 下 面 开 始 实 现 该 音 频 播 放 器 系 统 了 。( 二 ) 伪 代 码 的 设 计前 面 我 们 了 解 了 构 成 媒 体 播 放 器 GUI 的 各 个 部 件 , 下 面 要 开 始 “设 想 ”一下 这 个 程 序 的 具 体 构 造 。 在 正 式 编 写 代
23、 码 之 前 , 我 们 先 用 伪 代 码 的 形 式 写 出 这 个 程序 的 运 行 过 程 , 以 后 正 式 编 写 代 码 时 只 需 把 伪 代 码 翻 译 成 JAVA 代 码 即 可 。 下面 给 出 了 媒 体 播 放 器 的 伪 代 码 描 述 :应 用 的 类 名 称 : Application1 Frame1main-构 建 应 用 程 序 -调 用 Frame1 类 -创 建 主 窗 口 -主 窗 口 各 菜 单 初 始 化 。下 面 来 看 看 具 体 的 代 码 实 现 :首 先 在 Frame1 类 中 声 明 如 下 两 个 变 量 :Player play
24、er; String path;Player 变 量 是 Player 类 的 对 象 , 它 是 播 放 器 的 对 象 ; path 表 示 当 前 打开 媒 体 文 件 的 目 录 。 下 面 来 看 看 “播 放 ”菜 单 项 的 动 作 触 发 执 行 的 代 码 :void jButton1_actionPerformed(ActionEvent e) player.start() ;这 里 调 用 的 类 player 中 的 start()方 法 。其 次 是 播 放 界 面 的 设 计 与 实 现 :播 放 界 面 的 源 代 码 如 下 :private void jbIn
25、it() throws Exception contentPane = (JPanel) this.getContentPane();contentPane.setLayout(null);this.setSize(new Dimension(400, 300);this.setTitle(“ Mp3 Player“);jPanel1.setBounds(new Rectangle(17, 30, 353, 238);jPanel1.setLayout(null);jButton1.setBounds(new Rectangle(26, 163, 73, 25);jButton1.setTex
26、t(“u64ADu653E“);jButton1.addActionListener(new Frame1_jButton1_actionAdapter(this);jButton2.setBounds(new Rectangle(141, 163, 73, 25);jButton2.setSelected(false);jButton2.setText(“u6682u505C“);jButton2.addActionListener(new Frame1_jButton2_actionAdapter(this);jButton3.setBounds(new Rectangle(256, 16
27、4, 73, 25);jButton3.setText(“u505Cu6B62“);jButton3.addActionListener(new Frame1_jButton3_actionAdapter(this);jPanel1.add(jButton3, null);jPanel1.add(jButton1, null);jPanel1.add(jButton2, null);contentPane.add(jPanel1, null);( 三 ) 编译和运行 8JAVA 代码分别保存在 Application1.java,Frame1.java 文件中,则编译命令如下:javac Ap
28、plication1.java javac Frame1.java 编译成功后,编译器生成.class 文件:Application1.clas, Frame1_jButton1_actionAdapter.class,Frame1_jButton2_actionAdapter.class Frame1_jButton3_actionAdapter.class ,Frame1.class.然后执行类 Application1 即可四结论通 过 本 次 的 毕 业 设 计 , 成 功 的 完 成 了 基 于 JAVA 的 音 频 播 放 器 的 设 计 和 实 现 。实 现 的 了 对 多 种
29、声 音 文 件 的 播 放 。 通 过 自 己 编 写 的 小 应 用 程 序 来 实 现 用 户 的 交 互 式输 入 和 实 现 音 乐 控 制 。由 于 作 者 的 水 平 有 限 , 关 于 声 音 文 件 的 解 码 等 等 方 面 没 有 考 虑 到 制 作 中 去 , 这些 方 面 有 待 进 一 步 的 探 索 和 完 善 , 同 时 也 将 是 作 者 今 后 的 工 作 中 的 研 究 任 务 。参考文献1宋现锋,趣味程序导学 JAVA2,清华大学出版社,2002.012潘传帮等,JAVA 实效编程百例,人民邮电出版社,2003.043徐雅静等,Jbulider6 入门与提
30、高,人民邮电出版社,2002.064陆正中等,Jbulider 软件开发项目实践,清华大学出版社, 2004.035电脑编程技巧与维护杂志社,JAVA 编程精选集锦,科学出版社,2003.066美 Kenneth F. Krutsch , JAVA 用户界面编程指南,电子工业出版社,2002.027美Laura Lemay, JAVA 2 编程 21 天自学通,清华大学出版社, 2002.04The Creation of Multimedia Using Java LanguageAbstract This paper briefly introduces the technology of JAVA Multimedia, especially on JAVA sound technology. It mainly elaborates the introduction of the sound technology and how to make the multimedia with JAVA language.Keywords JAVA, Sound, Creation of Sound technology