手机同时播放两个音乐 探讨二[JavaME]

[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),如下所示:


调用com.nokia.mid.sound.*类播放曲调 


 

/*
      * 用nokia特有的sounds类的方式播放背景音效
      */
     private Sound m_kSound = null;
      private byte[] 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,
     };
 
 private synchronized void stopSounds()
      {
         if(m_kSound != null)
          {
             m_kSound.stop();
             m_kSound = null;
         }
     }
 
  /*
    * 用nokia特有的sounds类的方式播放背景音效
    */
     stopSounds();
     m_kSound = new Sound(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真机上测试,启动程序之后,就立即开始播放背景音效,就是那一个

private byte[] 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,
    };

数组啦,但是当一个按键按下,背景音效就会被打断,并不再播放。与上一次试验不同的是,按键所对应的音效还是被清晰播放了。

原因还是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

 

时间: 2024-09-23 16:58:27

手机同时播放两个音乐 探讨二[JavaME]的相关文章

[JavaME]手机同时播放两个音乐 探讨一

[JavaME]手机同时播放两个音乐 探讨一 摘要: 本文档以及后续文档试图一步一步地探讨如何在手机上同时播放两个声音文件,譬如一个是背景音乐,一个是按键触发的游戏音效.请慢慢看下去,我们尽量糅合进各方汇集的一些经验. 1背景 摘要:本章 简单描述手机同时播放两个音乐的背景.   1.1. 常见于各大J2ME论坛的这个问题 最近看到,不断地有人再询问同一类型的问题: "如何同步播放两个音乐?" "如何在播放背景音效的同时,还能够播放其他声音?"   大家众说纷纭,不

游戏-C语言 如何实现同时播放两个音乐

问题描述 C语言 如何实现同时播放两个音乐 写游戏的时候碰到的问题:如何在循环播放背景音乐的同时播放音效.我用playsound()函数会把前面的音乐切掉,也不能用Sleep延迟.如何实现呢?求解 解决方案 新开个线程吧~应该可以解决. 解决方案二: C语言播放音乐C语言怎样播放音乐 解决方案三: 考虑下创建另外一个进程,或者用多线程也可以...

如何用C# 做本地视频,用Xamarin.forms 大致就是利用智能摄像头连接wifi , 用手机App 播放的那种

问题描述 各位大牛,如何用C#做本地视频,用Xamarin.forms大致就是利用智能摄像头连接wifi,用手机App播放的那种 解决方案 解决方案二:是摄像头连接在电脑上,电脑程序实现获取摄像头拍摄镜头制作成视频吗?给你个类作为参考:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Runtime.InteropServices;namespaceImageAcquisition{//参考AVICa

关于android音乐播放器后台音乐服务停止的问题

问题描述 关于android音乐播放器后台音乐服务停止的问题 我在做一个android音乐播放器,当程序比较多的时候,手机会自动杀掉我的进程,但是我的服务还是在的,也就是0个进程和1个服务.可是我的服务里的音乐播放就停止了,随着进程被杀掉,音乐也停止了.可是我的服务还在啊,音乐为什么停了,我不知道为什么.求解惑. 解决方案 startService() 程序开启后服务不会随程序关闭而关闭,需要主动关闭 bindService() 服务会随着程序关闭而关闭 解决方案二: 请好好复习Service生

iOS实现播放远程网络音乐的核心技术点总结_IOS

一.前言 这两天做了个小项目涉及到了远程音乐播放,因为第一次做这种音乐项目,边查资料边做,其中涉及到主要技术点有: 如何播放远程网络音乐 如何切换当前正在播放中的音乐资源 如何监听音乐播放的各种状态(播放器状态.播放的进度.缓冲的进度,播放完成) 如何手动操控播放进度 如何在后台模式或者锁屏情况下正常播放音乐 如何在锁屏模式下显示音乐播放信息和远程操控音乐 如果您对一块技术点有兴趣或者正在寻找相关资料,那么本篇或许能提供一些参考或启发. 二. 网络音乐播放的核心技术点 根据自己的经验和查了一些音

字符集问题的初步探讨(二)

问题 字符集问题的初步探讨(二) --数据库的字符集 Saturday, 2004-09-11 11:38 Eygle  原文发表于itpub技术丛书<Oracle数据库DBA专题技术精粹>,未经许可,严禁转载本文. 原文链接: http://www.eygle.com/special/NLS_CHARACTER_SET_02.htm 2. 数据库的字符集  字符集在创建数据库时指定,在创建后通常不能更改,所以在创建数据库时能否选择一个正确的字符集就显得尤为重要. 在创建数据库时,我们可以指定

关于shared pool的深入探讨(二)

关于shared pool的深入探讨(二) Sunday, 2004-08-22 21:23 Eygle       link: http://www.eygle.com/internal/shared_pool-2.htm我们继续把前面的问题展开一下. 其实我们可以从数据库内部监控shared pool的空间碎片情况.这涉及到一个内部视图x$ksmsp X$KSMSP的名称含义为: [K]ernal [S]torage [M]emory Management [S]GA Hea[P]其中每一行

flash-rtmp协议 发送h.264, android手机无法播放,但pc机可以播放

问题描述 rtmp协议 发送h.264, android手机无法播放,但pc机可以播放 我从摄像机中取出实时视频流(h.264),然后用rtmp协议封包后发送到pc机,在pc机用IE浏览器中的flash播放器能够出图像,也正常. 但是用android手机里的浏览器观看就出现问题了,手机中网页中的flash播放器不显示图像,是黑的.但是rtmp封的h.264数据确实发到手机了. 弄了好几天了,实在是弄不明白了,哪位大神能给点意见,先谢谢了~ 解决方案 有编译好了的librtmp.so库没,发我测试

android开发-android如何实现播放ape格式音乐

问题描述 android如何实现播放ape格式音乐 最近做毕设想做一个简单的播放器,然后想要能够支持ape,flac等格式的无损音乐. 我现在直接用getContentResolver().query()可以显示出来手机内的ape音乐,但是没法播放.请问是要自己解码么,有没有可以直接使用的类或者包之类的? 解决方案 怎么也得搞定解码方面的问题吧.