J2ME媒体播放器无法播放

时间:2014-01-16 19:37:32

标签: java java-me

public class Midlet extends MIDlet implements CommandListener{

  Player p;

  public void startApp() {
      Display.getDisplay(this).setCurrent(new SongsList(this));
  }

  public void pauseApp() {
  }

  public void destroyApp(boolean unconditional) {
      notifyDestroyed();
  }

  public void commandAction(Command cmnd, Displayable dsplbl) {
      if (cmnd.getLabel().equals("Exit"))
      {
          destroyApp(true);
      }
      else
      {
          try {
              //InputStream is = getClass().getResourceAsStream("/res/getlucky.mpeg");
              //p = Manager.createPlayer(is, "audio/mpeg");
              p = Manager.createPlayer("http://puu.sh/6n9jC.mp3");
              p.realize();
              p.start();
          } catch (IOException ex) {
              ex.printStackTrace();
          } catch (MediaException ex) {
              ex.printStackTrace();
          }  
      }
  }
}

这是songslist类:

public class SongsList extends List{

public SongsList(Midlet midlet)
{
    super("Songs", List.IMPLICIT);
    append("get lucky", null);
    addCommand(new Command("Exit", Command.EXIT, 0));
    addCommand(new Command("Select", Command.OK, 0));
    setCommandListener(midlet);
}

}

尝试使用存储在项目中的文件(在src / res下):

inputStream = getClass().getResourceAsStream("res/getlucky.mpg");
audioPlayer = Manager.createPlayer(inputStream, "audio/mpg");

以及来自HTTP:

//audioPlayer = Manager.createPlayer("http://puu.sh/6n9jC.mp3");

什么都行不通,我做错了什么?

修改 我试图删除我的应用程序,只是将它复制粘贴到一个新项目,它出于某种原因工作..现在我遇到了新的问题: 1)我尝试播放一首歌 - 这是链接http://puu.sh/6n9jC.mp3 它没有播放所以我想有一个有限的文件大小可以播放可以有人告诉我这是什么限制? 2)我试图用RecordPlayer录制音频,但它始终为空

public AudioAnalyzer()
{
    try {
        thread = new Thread(this);
        recordFinished = false;
        //inputStream = getClass().getResourceAsStream("res/getlucky.mpg");
        //audioPlayer = Manager.createPlayer(inputStream, "audio/mpg");
        audioPlayer = Manager.createPlayer("http://puu.sh/35YTG.mp3");
        //audioPlayer = Manager.createPlayer("http://puu.sh/6n9jC.mp3");
        audioPlayer.realize();
        System.out.println(System.getProperty("supports.audio.capture"));
        recordControl = (RecordControl)audioPlayer.getControl("RecordControl");
        recordOutput = new ByteArrayOutputStream();
        recordControl.setRecordStream(recordOutput);
        recordControl.startRecord();
        audioPlayer.start();
        //thread.start();
    } catch (MediaException ex) {
        ex.printStackTrace();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

如果系统支持音频捕获并且结果为真,我甚至尝试打印但是我在此行获得了NullPointException:

recordOutput = new ByteArrayOutputStream();

虽然我试图从播放器获取记录控制但它仍为空:

recordControl = (RecordControl)audioPlayer.getControl("RecordControl");

我想我读过它总会给出NullPointerException,除非你在真实设备上运行它而不是模拟器是真的吗?有人可以验证吗?如果是这样,如果我目前没有任何其他方式在设备模拟器中使用记录控制功能(假设recordcontrol不能在仿真器上工作),我该怎么办?

2 个答案:

答案 0 :(得分:0)

文件大小为8MB(可能在手机上播放),请尝试使用此代码

public void initMedia(final String aFileUrl) {
        if (m_player == null) {
            try {
                m_player = Manager.createPlayer(aFileUrl);
                m_player.addPlayerListener(this);
                m_player.realize();
                m_player.prefetch();
                m_volumeControl = (VolumeControl) m_player.getControl("VolumeControl");                
            } catch (IOException ex) {
            } catch (Exception ex) {
            } catch (OutOfMemoryError e) {
            }
        }
    }

在你的代码中,我想你错过了“m_player.prefetch()”,试试这个。并打印您的例外消息......

此代码一般用于文件,资源,http ...

public void initMedia(final String aProtocol, final String aMediaSource) {
    if (m_player == null) {
        try {
            if (aMediaSource.indexOf("file://") == 0) {
                InputStream iRecordStream = Connector.openInputStream(aMediaSource);
                m_player = Manager.createPlayer(iRecordStream, "audio/amr");
            } else {
                m_player = Manager.createPlayer(aProtocol);
            }
            m_player.addPlayerListener(this);
            m_player.realize();
            boolean isPrefetch = true;
            try {
                m_player.prefetch();
            } catch (Exception ex) {
                isPrefetch = false;
            }
            // trick to pass prefetch error
            if (!isPrefetch) {
                if (m_player != null) {
                    m_player.close();
                    m_player = null;                        
                }
                if (aMediaSource.indexOf("file://") == 0) {
                    InputStream iRecordStream = Connector.openInputStream(aMediaSource);
                    m_player = Manager.createPlayer(iRecordStream, "audio/amr");
                } else {
                    m_player = Manager.createPlayer(aProtocol);
                }
                m_player.addPlayerListener(this);
                m_player.realize();
                m_player.prefetch();
            }                

            m_volumeControl = (VolumeControl) m_player.getControl("VolumeControl");                
        } catch (IOException ex) {
        } catch (Exception ex) {
        } catch (OutOfMemoryError e) {
        }
    }
}

答案 1 :(得分:0)

通常,在涉及J2ME开发时,您应该始终在多个真实设备上测试您的应用。 模拟器不可信任。

此外,J2ME非常分散,并且各种设备具有各种错误,并且使用相同的代码表现不同。这将影响许多领域的任何应用程序。一个区域是音频播放。

例如,某些设备要求您使用realize()和prefetch()方法,而其他设备如果使用prefetch()则会崩溃。唯一可行的解​​决方案(如果您希望支持尽可能多的设备)是使用多个try / catch块。

有关MIDP2.0音频播放的详细说明和其他提示,请参阅此链接 http://indiegamemusic.com/help.php?id=1