日期:2014-05-20  浏览次数:20748 次

请教各位一个J2ME在nokia手机上录音的问题。
请教各位一个J2ME在nokia手机上录音的问题。
代码片断如下

try   {  
ByteArrayOutputStream   o1;
int   x=0,size=0;
byte[]   buf1   =   new   byte[32000];  
o1=   new     ByteArrayOutputStream(32000   );
       
            Player   p   =     Manager.createPlayer( "capture://audio?encoding=pcm&rate=11025&bits=16&channels=1 ");
 
    p.realize();
      RecordControl   rc   =   (RecordControl)p.getControl( "RecordControl ");
        while(1==1)
        {
         
     
   
     
        o1.reset();
        rc.setRecordStream(o1);
    rc.setRecordSizeLimit(24000);  

        rc.startRecord();
 
        p.start();
 
        Thread.currentThread().sleep(1000);
 
        p.stop();
 
        rc.stopRecord();
   
        rc.commit();
       
        {   x=   o1.size();
                                  size=x;
                                  buf1=   o1.toByteArray();  
                                  //....                                 其他代码
}
       
    }    
}   catch   (IOException   ioe)   {
}   catch   (MediaException   me)   {
}   catch   (InterruptedException   e)   {   }

该程序在模拟器上执行是OK   的可以连续运行很久都没有问题
但load   到手机上之后   while   循环600多次   (7610上,N73上是459次)之后,
程序就不能再从mic获得音频数据了。o1.size   总是为0,
这个时候就算退出   while循环,重新初始化   Player   也不能成功。请问各位是否有
遇到过这种情况呢?   是   程序   在内存管理上有问题?还是   player   不能这样用法?


------解决方案--------------------
这里不要循环处理的,只要把RecordControl.startRecord()和Player.start()启动一次就可以了。我的录音处理就很简单,当点击录音按钮时,则启动一次如下方法:
public void startRecord(){
try {
this.close();//首先关闭player
this.soundPlayer = Manager.createPlayer( "capture://audio?encoding=audio/amr ");
output = new ByteArrayOutputStream();//用于保存录下的数据
this.soundPlayer.realize();
this.rc = (RecordControl) this.soundPlayer.getControl( "RecordControl ");
this.rc.setRecordStream(output);
this.rc.startRecord();
this.soundPlayer.start();

} catch (Exception ex) {
ex.printStackTrace();
}
}
在停止录音的时候,调用如下方法:
public void stopRecord(){
try {
if (this.soundPlayer != null && this.soundPlayer.getState() != Player.CLOSED) {
this.soundPlayer.stop();