[JavaME]手机同时播放两个音乐
探讨二
摘要:
本文档以及后续文档试图一步一步地探讨如何在手机上同时播放两个声音文件,譬如一个是背景音乐,一个是按键触发的游戏音效。请慢慢看下去,我们尽量糅合进各方汇集的一些经验。
1探讨适合Nokia的同步播放方法
摘要:本章 简单描述如何在NokiaS60系列手机同时播放两个音乐。
1.1. 使用nokia的专有类Sound
Nokia UI API有一个专门播放声音的类,它支持两种声音:
l Single notes,给定了频率和持续时间;
l Simple tunes,沿用了Nokia Smart Messaging ringing tone二进制格式。
我们这里说的是后者。由此Nokia UI API支持从二进制音乐数据播放曲调。这个二进制格式是Nokia’s binary Ringing Tone Programming Language(RTPL),由Nokia Smart Messaging Specification(SMART)定义。
RTPL定义了两种铃音:
l Basic-song(named);
l Temporary-song(unnamed)。
Nokia UI API都支持。一般的下载铃声都是basic-song,所以在手机菜单中你会看到有名字;但是对于Nokia UI API,不使用名字,所以推荐使用Temporary-song。
要想使用Sound类播放二进制曲调,请导入nokiaui.zip。一般来说,它的位置在%Nokia开发包安装目录%/Devices/Nokia_Prototype_SDK_2_0/devices/Prototype_2_0_S60_MIDP_Emulator/lib/ext下。
然后,代码中
import com.nokia.mid.sound.*;
下面给出本次测试程序说明:
1.2. 只是修改了背景音效播放线程的播放方式
原本背景音效线程是调用MMAPI的Manager.createPlayer方式播放midi或者amr音乐的,但据说,在Nokia S60系列手机上,可以做到背景音效用Nokia专有类Sound来播放,前台音效用wav播放,即可实现同时播放互不干扰(称之为测试A)。我们同时也测试了背景音效用midi播放,前台音效用Nokia专有类Sound这种情况(称之为测试B) (此办法在http://community.csdn.net/Expert/topic/4358/4358221.xml提及)。所以,我们修改了TwinsMusic/src/com/ultrapower/model下的ThreadPlayBackground.java(测试A)或者ThreadPlayForeGround.java(测试B),如下所示:
所以,我们修改了TwinsMusic/src/com/ultrapower/model下的ThreadPlayBackground.java(测试A)或者ThreadPlayForeGround.java(测试B),如下所示:
/**//*
*用nokia特有的sounds类的方式播放背景音效
*/
privateSoundm_kSound=null;
privatebyte[]m_dataPlayBack={
(byte)0x02,(byte)0x4a,(byte)0x3a,(byte)0x40,(byte)0x04,(byte)0x00
,(byte)0x35,(byte)0x1e,(byte)0xa2,(byte)0xa8,(byte)0x2c,(byte)0xc3
,(byte)0x0c,(byte)0x30,(byte)0xc2,(byte)0xcc,(byte)0x2a,(byte)0xc2
,(byte)0x6c,(byte)0x2a,(byte)0x82,(byte)0x6c,(byte)0x22,(byte)0xc4
,(byte)0x9c,(byte)0x42,(byte)0x88,(byte)0xa1,(byte)0x26,(byte)0x90
,(byte)0x59,(byte)0x06,(byte)0x90,(byte)0xa2,(byte)0x28,(byte)0x22
,(byte)0x92,(byte)0x70,(byte)0x2b,(byte)0x02,(byte)0x64,(byte)0x00,
};
privatesynchronizedvoidstopSounds()
{
if(m_kSound!=null)
{
m_kSound.stop();
m_kSound=null;
}
}
/**//*
*用nokia特有的sounds类的方式播放背景音效
*/
stopSounds();
m_kSound=newSound(m_dataPlayBack,Sound.FORMAT_TONE);
m_kSound.setGain(35);//设置音量
m_kSound.play(0);//循环播放
1.3. 使用说明
由于使用到了nokia专有类,所以建议事先在Nokia S60系列模拟器中模拟运行。当然也可以像这位网友所说的:
关于WTK怎么用nokia的lib。
在nokia的开发工具目录
../Nokia/Devices/Nokia_7210_MIDP_SDK_v1_0/lib 或者
../Nokia/Devices/Series_60_MIDP_Concept_SDK_Beta_0_3_Nokia_edition/lib
中找到class.zip。打开,找到Sound.class,解压,应该可以得到com/nokia/ui/Sound/sound.class,
然后把整个目录再打包成一个zip文件,放到你的项目的lib下。就行了。
或者直接一点,把class.zip直接方到lib下也可以。
用wtk编译打好package后,再打开你的jar文件,把包含sound.class的那个com文件夹
删除,最后再把jad中的jar-size根据实际情况改一下。
ok。
反正我就是这么做的,麻烦是很麻烦。
我按照他的方法试验了,但是始终提示
有一个superclass:“com/nokia/phone/sdk/concept/event/EventHandler”找不到,但是nokiaui.zip包中却没有这个class。
测试A结果:
之后在Nokia 7610真机上测试,启动程序之后,就立即开始播放背景音效,就是那一个
Nokia 7610真机上测试,启动程序之后,就立即开始播放背景音效,就是那一个privatebyte[]m_dataPlayBack=<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"></shapetype><stroke joinstyle="miter"></stroke><formulas></formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f><lock v:ext="edit" aspectratio="t"></lock><shape id="_x0000_i1025" style="WIDTH: 11.25pt; HEIGHT: 15pt" type="#_x0000_t75" alt=""></shape><imagedata src="file:///C:/DOCUME~1/VICTOR~1/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" o:href="/Images/dot.gif"></imagedata>{
<shape id="_x0000_i1026" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""></shape><imagedata src="file:///C:/DOCUME~1/VICTOR~1/LOCALS~1/Temp/msohtml1/01/clip_image002.gif" o:href="/Images/OutliningIndicators/InBlock.gif"></imagedata>(byte)0x02,(byte)0x4a,(byte)0x3a,(byte)0x40,(byte)0x04,(byte)0x00
<shape id="_x0000_i1027" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""></shape><imagedata src="file:///C:/DOCUME~1/VICTOR~1/LOCALS~1/Temp/msohtml1/01/clip_image002.gif" o:href="/Images/OutliningIndicators/InBlock.gif"></imagedata>,(byte)0x35,(byte)0x1e,(byte)0xa2,(byte)0xa8,(byte)0x2c,(byte)0xc3
<shape id="_x0000_i1028" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""></shape><imagedata src="file:///C:/DOCUME~1/VICTOR~1/LOCALS~1/Temp/msohtml1/01/clip_image002.gif" o:href="/Images/OutliningIndicators/InBlock.gif"></imagedata>,(byte)0x0c,(byte)0x30,(byte)0xc2,(byte)0xcc,(byte)0x2a,(byte)0xc2
<shape id="_x0000_i1029" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""></shape><imagedata src="file:///C:/DOCUME~1/VICTOR~1/LOCALS~1/Temp/msohtml1/01/clip_image002.gif" o:href="/Images/OutliningIndicators/InBlock.gif"></imagedata>,(byte)0x6c,(byte)0x2a,(byte)0x82,(byte)0x6c,(byte)0x22,(byte)0xc4
<shape id="_x0000_i1030" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""></shape><imagedata src="file:///C:/DOCUME~1/VICTOR~1/LOCALS~1/Temp/msohtml1/01/clip_image002.gif" o:href="/Images/OutliningIndicators/InBlock.gif"></imagedata>,(byte)0x9c,(byte)0x42,(byte)0x88,(byte)0xa1,(byte)0x26,(byte)0x90
<shape id="_x0000_i1031" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""></shape><imagedata src="file:///C:/DOCUME~1/VICTOR~1/LOCALS~1/Temp/msohtml1/01/clip_image002.gif" o:href="/Images/OutliningIndicators/InBlock.gif"></imagedata>,(byte)0x59,(byte)0x06,(byte)0x90,(byte)0xa2,(byte)0x28,(byte)0x22
<shape id="_x0000_i1032" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""></shape><imagedata src="file:///C:/DOCUME~1/VICTOR~1/LOCALS~1/Temp/msohtml1/01/clip_image002.gif" o:href="/Images/OutliningIndicators/InBlock.gif"></imagedata>,(byte)0x92,(byte)0x70,(byte)0x2b,(byte)0x02,(byte)0x64,(byte)0x00,
<shape id="_x0000_i1033" style="WIDTH: 8.25pt; HEIGHT: 12pt" type="#_x0000_t75" alt=""></shape><imagedata src="file:///C:/DOCUME~1/VICTOR~1/LOCALS~1/Temp/msohtml1/01/clip_image003.gif" o:href="/Images/OutliningIndicators/ExpandedBlockEnd.gif"></imagedata>};
数组啦,但是当一个按键按下,背景音效就会被打断,并不再播放。与上一次试验不同的是,按键所对应的音效还是被清晰播放了。
原因还是Nokia 7610不支持混音。
测试B结果:
背景音效midi播放过程中,按键之后,并没有打断背景音,但是按键音也没有播放。如果用命令停止背景音,再按键,那么Sound类正常播放那个数组给出的曲调。
希望能找到一个支持混音的Nokia手机测试一下。
2 资源
网络资源:
1:《[JavaME]手机同时播放两个音乐 探讨一》
《[JavaME]手机同时播放两个音乐 探讨二》
2:Nokia_UIAPI_Guide.pdf, http://www.it-c.dk/courses/JPMA/E2002/Nokia_UIAPI_Guide.pdf;
3:《CH_Using_the_Nokia_UI_API_Extension_for_Gaming_Cover_v1_0.pdf,
http://sw.nokia.com/id/b2e08592-dd77-4feb-8230-2e318217e066/CH_Using_the_Nokia_UI_API_Extension_for_Gaming_Cover_v1_0.pdf 》
4:《J2ME播放声音的几个问题(nokia)》;
郑昀@ultrapower
| 试验品名称
| 试验品版本
|
Keyword: Mobile MMAPI Media 媒体播放 j2me 同步播放
| TwinsMusic
| 0.0.1 BETA
|
测试B结果:
背景音效midi播放过程中,按键之后,并没有打断背景音,但是按键音也没有播放。如果用命令停止背景音,再按键,那么Sound类正常播放那个数组给出的曲调。
相关推荐
在VB中同时播放多个音频文件本来 vb6
1、详情看博客:http://blog.csdn.net/raby_gyl/article/details/12491287
一个视频可以循环播放,多个视频也可以在列表中按照顺序自动播放,由此可以拓展,按钮点击,通过信号槽机制来实现视频播放。还可以设置视频播放窗口的大小等
属性动画AnimatorSet两个动画同时播放显示两张图片的不同动态,比如透明度变化和旋转多少度,同时可以设置动画播放时间和是否循环播放,循环播放多少次,还有暂停,继续,停止功能。
Android-TwoVideoExample 同时播放两个视频
FPGA播放音乐,第二个版本的,可供更深入的学习
两个手机之间必须连接同一个局域网,IP为局域网的IP
这是一个利用matlab播放音乐的源代码
在Android系统上同时打开两个camera,并获取数据
跨多个数据库操作,同时连接两个一上的数据库,用事物关联起来,JTA,两个一上数据库连接,连接两个数据库,两个数据库可以同时操作,同时回滚。。。。同时提交。。
PIC16F877A实现音乐播放程序...2.从TABLE中取出播放音乐的音调(1、2....7)通过改变该表中的值即可实现播放不同的音乐。 ;3.从TABLE_YP中取出播放音乐的音频,即该音调持续的时间。 ;4.调整DELAY延时的长短即可实现音
sn8p2708a是松翰单片机,在这个上面实现音乐播放,用汇编语言,功能完善,调试正确,音乐清晰。
两个用于视频播放的小程序
vb.net利用DX播放声音,和同时播放两种声音方法,网上都是C#的教程,这里发一下vb.net利用DX插放声音的方法,
Verilog音乐编程 音乐播放 开关切换两首音乐 遇见和飘雪两首歌曲 txt文档内为Verilog代码
在对话框程序中实现“热键”,此程序可以同时判断2个按键按下的功能,并且不让后续控制响应这些按键,对于一些控制程序和“热键”的实现是一个比较好的例子,程序中对话框为CDlgKeyBoardPress类,自行添加了一个响应...
轻子和夸克质量的两个经验公式(即Kartavtsev的扩展Koide公式),Kl =(ˆlml)/(ˆlml)2 = 2/3和Kq =(ˆqmq)/ (ˆqmq)2 = 2/3,在本文中进行了探讨。 对于轻子部分,我们证明Kl = 2/3,只有当牛磺酸质量的不...
STM32F103两个串口同时使用,使用闲时中断,不定长接收和不用结尾符。MDK编译通过。测试通过。
C#两个账号同时登录,后登录的账号将前一个账号挤掉C#两个账号同时登录,后登录的账号将前一个账号挤掉
TX2实现双声卡驱动设计,并实现录音与播放同时进行,硬件上是使用两个codec(tlv320aic32x4),一个作为音频输出,另一个作为音频输入,两个音频通道互不影响。