Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android MediaPlayer使用了大量资源_Android_Multithreading_Service_Audio - Fatal编程技术网

Android MediaPlayer使用了大量资源

Android MediaPlayer使用了大量资源,android,multithreading,service,audio,Android,Multithreading,Service,Audio,我正在用OpenGL 2.0制作游戏,我在声音方面遇到了问题,因为声音会减慢我的应用程序,FPS会减少大约20帧。我实现了声音服务并在新线程上运行它,但问题是相同的。MediaServer使用的CPU比我的带有大量精灵的应用程序要多。 我只播放三种总大小小于0.5 MB的声音。 这是我的代码: package com.filsoft.mouse; import java.io.IOException; import android.app.Service; import android.co

我正在用OpenGL 2.0制作游戏,我在声音方面遇到了问题,因为声音会减慢我的应用程序,FPS会减少大约20帧。我实现了声音服务并在新线程上运行它,但问题是相同的。MediaServer使用的CPU比我的带有大量精灵的应用程序要多。 我只播放三种总大小小于0.5 MB的声音。 这是我的代码:

package com.filsoft.mouse;

import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Binder;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.Process;

public class Sound extends Service implements OnCompletionListener {
      private final IBinder mBinder = new LocalBinder();
      private Looper mServiceLooper;
      private ServiceHandler mServiceHandler;
    // Handler that receives messages from the thread
      private final class ServiceHandler extends Handler {
          MediaPlayer[] mediaPlayer=new MediaPlayer[3];
          public ServiceHandler(Looper looper) {
              super(looper);
            mediaPlayer[0] = MediaPlayer.create(getApplicationContext(), R.raw.sound1);
            mediaPlayer[0].setLooping(true);

            mediaPlayer[1] = MediaPlayer.create(getApplicationContext(), R.raw.sound1);
            mediaPlayer[1].setLooping(true);

            mediaPlayer[2] = MediaPlayer.create(getApplicationContext(), R.raw.sound1);
            mediaPlayer[2].setLooping(true);
                try {
                    for(int i=0;i<3;i++)
mediaPlayer[i].prepare();
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


          }
          @Override
          public void handleMessage(Message msg) {
              play(msg.arg1);
          }
          public void stopAll()
          {
               if (mediaPlayer[0].isPlaying()) {
                      mediaPlayer[0].pause();
                    }
                    if (mediaPlayer[1].isPlaying()) {
                          mediaPlayer[1].pause();
                    }
                    if (mediaPlayer[2].isPlaying()) {
                          mediaPlayer[2].pause();
                    }
          }
          public void play(int idx)
          {
              stopAll();
              if (!mediaPlayer[idx].isPlaying()) {
                  mediaPlayer[idx].start();
                }
          }

      }

      @Override
      public IBinder onBind(Intent intent) {
        return mBinder;
      }

      @Override
      public void onCreate() {
          HandlerThread thread = new HandlerThread("Audio",
                    Process.THREAD_PRIORITY_URGENT_AUDIO);
            thread.start();

            // Get the HandlerThread's Looper and use it for our Handler
            mServiceLooper = thread.getLooper();
            mServiceHandler = new ServiceHandler(mServiceLooper);

        }
      public void startPlay(int idx)
      {
          Message msg = mServiceHandler.obtainMessage();
          msg.arg1 = idx;
          mServiceHandler.sendMessage(msg);

      }
      public class LocalBinder extends Binder {
            public Sound getService() {
                return Sound.this;
            }

        }
      @Override
      public int onStartCommand(Intent intent, int flags, int startId) {


        return START_STICKY;
      }

      public void onDestroy() {

      }

      public void onCompletion(MediaPlayer _mediaPlayer) {
        stopSelf();
      }

    }

您不应该创建多个MediaPlayer,而应该使用一个-一个专门设计用于同时播放多个流的类,例如在游戏中。循环声音也很容易:

可以通过设置非零循环值来循环声音。值-1会导致声音永远循环。在这种情况下,应用程序必须显式调用stop函数来停止声音。任何其他非零值将导致声音重复指定次数,例如,值3将导致声音总共播放4次


是的,但SoundPool有限制,手机上最多32个流不仅我的应用程序和总空间16mb,可能我的应用程序和其他打开的应用程序会导致溢出,因为您正在使用3个流,并且只有在前台使用这3个流,而前台没有其他游戏/应用程序,您预计会出现这样的情况:有30多个其他流从后台的其他应用程序运行,当用户尝试玩您的游戏时,所有声音都以比您的声音更高的优先级同时播放?是的,但我的应用程序处于开发阶段。我认为最终产品将有最大7-8个流,总大小约为1.5MB。你认为当有人在玩你的游戏时,会有一个后台应用程序同时运行24个声音吗?我不认为你会找到更好的播放7-8种声音的方法,特别是考虑到MediaPlayer方法甚至不能播放3种声音。我的声音池有-12个错误,但我只加载0.5 mb的声音?