科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道MIDP 2.0 Media API为游戏增加音效

MIDP 2.0 Media API为游戏增加音效

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

利用MIDP 2.0 Media API,你可以为你的游戏和其他应用程序增加声音效果,在MIDP设备上发声、播放乐曲、及其它各种不同的音频。

作者:马岩编译 来源:天极网 2007年9月4日

关键字: MIDP API 音效

  • 评论
  • 分享微博
  • 分享邮件

介绍

几乎是MIDP(Mobile Information Device Profile)1.0一出来的时候,基于它的一个简单的视频播放器(第三方厂商开发)就同时发布了。这个播放器只支持MPEG格式,而且也并不复杂,但它展示了观看和使用媒体(本例是视频)的能力,这一点大大激发了程序员们的兴趣。不过这个早期的视频播放器并不是为程序员设计,所以要想在软件中使用播放视频的功能,必须要么拷贝所有代码(这样做可能有道德上的存疑)要么自己写所有的相关代码。由此看出对播放各类媒体的API的需求显然是存在的,但仅仅为播放视频开发API并不能实现开发API的所有用途。于是当移动媒体API(MMAPI)专家委员会开始致力于明确移动媒体概念的时候,他们首先需要为各种移动设备,范围从简单的蜂窝电话到PDA以及平板式电脑,提供可供参考的媒体种类。最终他们完成了两类不同的API设置:

• 移动媒体API(MMAPI),为拥有高级声音和多媒体性能的移动设备设计。

• 媒体API(MIDP2.0),适用于有限的移动设备(仅仅提供音频)。

经过以上的发展历程,令人感到奇怪的是API的第一个版本似乎并不支持视频,不过为此有个很好的解释:一些MIDP设备的内存和处理器性能太有限。事实上对MIDP2.0媒体API的需求很容易勾勒,它必须提供对以下功能的支持:

• 音阶的产生

• “开始播放”、“停止”、“暂停”之类基础的控制

• 媒体特效控制,比如音量

• 内容数量查询

MIDP2.0媒体API赋予你创建、播放简单旋律(只有音节)和音频的功能。提到声音首先进入我们脑海的手机铃声,但其实API和MIDP涉及的全部相关概念有相同的限制条件:它只能在Java的环境下使用,所以你不能为你的手机创作新的铃声。但是除此以外对于其他需要比铃声更复杂声音的游戏或者应用,API就提供了巨大的好处。

通用架构

API由三个部分:Manager,Player和Control,和两个包:javax.microedition.media,javax.microedition.media.control构成。Media包中包含Manager和可能用到的Players,control包中包含了所有的Controls。

API中最重要的类是Manager。Manager的用处包括,创建各种不同类型的Players(用于播放音频,视频等等),获得各种支持协议和内容格式,播放简单的曲调。Player类用来播放各类格式的多媒体内容。Control是一个用来控制Players的接口,Control控制诸如音量、音色、音调之类的东西。

图1 Manager, Player, Control东西类间调用关系说明

创建一个播放器与创建一个网络连接类似,根据不同情况,需要调用Manager中的一或两个方法完成。

以下代码根据Internet上的音频文件创建了一个Player,然后播放该音频:

try {

 Player audioPlayer = Manager.createPlayer

("http://www.nullplace.com/music.wav");

 audioPlayer.start();

} catch (IOException ioe) {

} catch (MediaException me) { }

第二个例子是从应用的.jar文件中的音频文件创建一个Player,然后播放音频:

try {

 InputStream is = getClass().getResourceAsStream("music.wav");

 Player audioPlayer = Manager.createPlayer(is, "audio/X-wav");

 audioPlayer.start();

} catch (IOException ioe) {

} catch (MediaException me) { }

发出一个简单音调

发出一个简单音调是一个简单的过程,用Manager类中一个随手可得的方法就能轻易实现。注意下面的MIDlet有两个简单动作:一个是退出应用,另一个是发出简单声调。发出声调由simpleTone()方法实现,而它实际上是调用Manager类的playTone(int note, int duration, int volume)方法实现。

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

import javax.microedition.media.*;

import javax.microedition.media.control.*;

public class MediaMIDlet extends MIDlet implements CommandListener{

private Player mp;

private Display display;

private List list;

private Command exitCommand = new Command("Exit", Command.EXIT, 2);

private Command playCommand = new Command("Play", Command.ITEM, 1);

public MediaMIDlet() {

 display = Display.getDisplay(this);

 list = new List("Demo", List.IMPLICIT);

}

public void startApp() {

 list.addCommand(exitCommand);

 list.addCommand(playCommand);

 list.setCommandListener(this);

 display.setCurrent(list);

}

public void destroyApp(boolean unconditional) {}

public void pauseApp() {}

public void commandAction(Command c, Displayable s) {

 if (c == exitCommand) {

destroyApp(false);

notifyDestroyed();

 }

 if (c == playCommand) {

simpleTone();

 }

}

private void simpleTone() {

 try {

Manager.playTone(ToneControl.C4, 100, 80);

 } catch (Exception ex){}

}

}

如果音符不是中音C,设定声音中的音调需要些技巧。如上所示,事实上ToneControl类中的常量属性来表示中音C:ToneControl.C4。还有一个特殊的常量表示不发声:ToneControl.SILENCE。下一节介绍如何利用这些现成的代码构架来创作一段曲调。

播放曲调

下列代码介绍了不同音符的变量(bytes)表达,其中最有趣的是创建数组mySequence:

1. 数组元素是整型变量,成对的常量值或者音符长度。

2. version和tempo被设置,接着是blocks 0和1(A部和B部)。

3. 播放部分。

曲调准备好后,其余的代码展示了如何创建一个ToneControl类和如何用它播放曲调。

private void toneSequence() {

byte tempo = 30;

byte d = 8;

byte C4 = ToneControl.C4;;

byte D4 = (byte)(C4 + 2);

byte E4 = (byte)(C4 + 4);

byte F4 = (byte)(C4 + 5);

byte G4 = (byte)(C4 + 7);

byte rest = ToneControl.SILENCE;

byte[] mySequence = {

ToneControl.VERSION, 1,

ToneControl.TEMPO, tempo,

ToneControl.BLOCK_START, 0, // starting A part

C4,d, F4,d, F4,d, C4,d, F4,d, F4,d, C4,d, F4,d,

ToneControl.BLOCK_END, 0, // ending A part

ToneControl.BLOCK_START, 1, // starting B part

C4,d, E4,d, E4,d, C4,d, E4,d, E4,d, C4,d, E4,d,

ToneControl.BLOCK_END, 1, // ending B part

ToneControl.PLAY_BLOCK, 0, // playing A part

ToneControl.PLAY_BLOCK, 1, // playing A part

ToneControl.PLAY_BLOCK, 0, // playing A part

};

try{

Player p = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);

p.realize();

ToneControl c = (ToneControl)p.getControl("ToneControl");

c.setSequence(mySequence);

p.start();

} catch (IOException ioe) {

} catch (MediaException me) {}

}

总结

MIDP2.0 Media API使在MIDP设备中发声,演奏曲调,和播放不同的音频的工作成为可能。未来(依靠一些手机的具体实现功能,如Nokia的用户摄象接口),API还将实现播放和记录视频的功能。至少目前,API为程序员给他们的游戏和应用加入音频效果提供了很好的解决方法。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章