代码之家  ›  专栏  ›  技术社区  ›  ShadowGod

设置数据源后2.2中的Stage恐吓媒体延迟?

  •  0
  • ShadowGod  · 技术社区  · 16 年前

    我在这里的第一个帖子。感谢大家,这个网站对于学习Android编程非常有用。

    我有一个简单的应用程序加载MP3流并播放它。它在1.6和2.1上运行良好,但在2.2上运行不太正常。似乎我的服务启动有问题,它给了我一个ANR和一个对话框,我必须点击“等待”,然后服务才开始。为什么启动服务需要很长时间?

    以下是我的简单代码,用于设置源和播放音频:

        public class MyActivityService extends Service {
    
     MediaPlayer player = new MediaPlayer();
    
     @Override
     public IBinder onBind(Intent intent) {
      return null;
     }
     @Override
     public void onCreate() {  
      super.onCreate();   
    
      try {
    
       player.setDataSource("URL OF MUSIC FILE");
      } catch (IllegalArgumentException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      } catch (IllegalStateException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
    
      try {
    
       player.prepare();
       player.setVolume(1, 1);
          player.setLooping(true);           
          player.start();                   
    
       Toast.makeText(getApplicationContext(), "Audio Service Started.", Toast.LENGTH_SHORT).show();}
    

    附录:

    原来不是我的服务没有启动,是音频启动不够快,在2.2…

    当我的服务开始和停止时,我通过 onCreate() onDestroy() 我的服务方法在它们自己的线程中,这可能是从一开始就应该是这样的?对不起,只是学习。

    但拖延才是真正的问题,需要澄清--

    例如,当我将数据源设置为这样一个MP3文件时,我的代码(现在的代码)工作得很好,而且很漂亮,就像我在2.1和2.2中所希望的那样: http://dl.dropbox.com/u/6916184/TestSongStream.mp3

    但当我将数据源设置为如下音频流位置时: http://d.liveatc.net/kjfk_twr 或者: http://relay.radioreference.com:80/192236577 它仅在2.1中正常工作。

    在2.2中,声音最终开始播放,但在设置数据源后,大约需要25秒左右的“StageScareplayer”,直到音频开始,如下所示:

    07-31 02:54:30.176: INFO/StagefrightPlayer(34): setDataSource('http://relay.radioreference.com:80/192236577')
    07-31 02:54:55.228: INFO/AwesomePlayer(34): calling prefetcher->prepare()
    07-31 02:54:56.231: INFO/Prefetcher(34): [0x2cc28] cache below low water mark, filling cache.
    07-31 02:54:56.337: INFO/AwesomePlayer(34): prefetcher is done preparing
    07-31 02:54:56.347: DEBUG/AudioSink(34): bufferCount (4) is too small and increased to 12
    07-31 02:54:57.337: ERROR/AwesomePlayer(34): Not sending buffering status because duration is unknown.
    

    同样的时间,大约25秒后,停止媒体播放器 player.stop() 在中调用 OnDebug() 我的服务方法,以及 OnDebug() 方法继续烤消息并取消通知。

    这就是2.2的情况吗?如果是的话,我可以解决延误的问题,这不是问题。或者更可能是我做错了什么?但它完全按照我在1.6和2.1中想要的方式工作!

    发布更多的代码会有帮助吗?

    我的代码很简单。没有音频控制或类似的东西。只需一个启动音频按钮和停止音频按钮就可以启动和停止播放音频流的服务。

    谢谢你的帮助!

    1 回复  |  直到 14 年前
        1
  •  1
  •   CommonsWare    16 年前

    不要打电话 prepare() 来自主应用程序线程,特别是对于流,因为这可能比ANR之前所允许的时间要长得多。使用 prepareAsync() 相反。我不知道这是否是您特定问题的根源,但它肯定是您当前实现中的ANR的一个原因。

    推荐文章