mobile - J2ME 手机游戏的音频规范是什么?

标签 mobile audio java-me j2mepolish

只是对音频的一般规范感到好奇。比如,什么音频文件格式?尺寸/长度限制?

我敢肯定 j2me 被分割成许多平台,但我们试图掌握。在听到所有关于 WhatsApp 的消息后,我意识到 j2me 仍然很重要。

我希望编写一篇关于手机游戏的 j2me 标准和实践的有用文章

最佳答案

MMAPI (JSR 135)(在 MIDP1.0 中使用)和 Player MIDP2.0 类支持标准 MIDI 格式和自适应多速率宽带 (AMR) 文件的播放。

现在大多数支持 J2ME 的手机也支持 MP3 和 WAV 文件的播放。

为游戏制作音频的典型方式是

  • 将 MIDI 文件用于音乐,将 AMR 文件用于音效,两者同时播放,或
  • 将 MIDI 文件用于音乐和音效,一次只能播放一个。

  • 一开始,手机通常一次只能处理 1 个 Player 对象。因此,您必须让用户选择他想要音乐还是音效。
    稍后,同时有 2 个 Player对象成为可能,但前提是它们处理 2 种不同的格式。您不能(现在仍然不能)同时播放两个 MIDI 文件。

    即使在今天,也只有极少数手机同时支持超过 2 个 Player对象。

    许多手机还支持出色的移动可扩展音乐文件格式 (XMF/mXMF) - 但只有部分手机能正确支持。 XMF 基本上由一个 MIDI 文件 + 一个声音字体组成。这意味着,它允许您为 MIDI 文件提供自己的乐器。一方面,这意味着您的音乐将(最终)在所有设备上听起来都一样。
    另一个有趣的用途是提供包含多种声音效果的声音字体,这样就可以拥有类似于 Android 中的 SoundPool 的东西。

    我对 XMF 格式进行了广泛的测试,遗憾地发现 XMF 格式的支持很差。只有 Symbian 设备似乎可以很好地支持它。索尼爱立信的功能手机在 XMF 播放方面非常有问题并且受到限制(只会播放包含小于 30kb 的声音字体的 XMF 文件 - 即使这样,有时它也会崩溃)。而其他品牌似乎根本不支持它,所以很遗憾我不得不建议你避免使用这种格式。
    作为一名音乐家,我对此感到非常恼火,因为它真的可以让 J2ME 平台在音频方面表现得非常出色。

    过去有关于播放模块(MOD/XM/S3M/IT 文件)的实验。我不会详细说明,但只是说这不是要走的路。几乎没有手机可以处理它。

    现在,在支持 J2ME 的较新手机上,您可以使用 MP3 播放音乐。但它当然会占用内存。所以为了支持尽可能多的设备,最佳实践是使用 MIDI 制作音乐,使用 AMR 文件制作音效 .
    你可以例如创作你的音乐Player首先,然后在 try/catch block 中加载声音效果。如果失败,它将为空。所以你在开始播放之前检查音效对象是否为空。

    接下来是让您的音频在尽可能多的设备上播放的各种技巧和窍门。
    我在这里写了一些关于这方面的指导方针:

    http://www.indiegamemusic.com/help.php?id=1

    IndieGameMusic.com 还包含几个针对 J2ME 优化的 MIDI 文件。去除不必要的数据,减少复音,将文件大小降至最低。有些音轨甚至有多种格式,如 J2ME 的 MIDI、Android/iPhone 的 XM、其他的 MP3/OGG​​,因此开发人员可以支持多个平台,让他们的游戏包含相同的音轨。

    关于mobile - J2ME 手机游戏的音频规范是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21961924/

    相关文章:

    java - 在J2me中获取内存卡根目录(路径)

    java - 从 BlackBerry 连接到 VPN

    html - -webkit-用户选择 : none; - not working

    javascript - 过渡 react 导航标题背景颜色

    html - 何时不使用支持移动网络应用程序

    ios - AVURLAsset tracksWithMediaType :AVMediaTypeVideo Return crash

    ios - 在 iPhone App 中使用什么音频压缩算法?

    css - 幻灯片不会在移动设备上缩放宽度

    javascript - 如何将当前播放的歌曲保存在 cookie 中?

    Java2 我 : keyPressed() not working inside GameCanvas