Android самый быстрый способ загрузить и воспроизвести звук в приложении - PullRequest
4 голосов
/ 01 сентября 2011

Я работаю над проектом, в котором мне нужно загрузить 6 разных звуков за одно упражнение и воспроизвести весь звук по нажатию кнопки. Звуковой файл не такой большой, но проблема в том, что, возможно, их будет больше.Мой вопрос заключается в том, какой способ загрузки звуковых файлов является самым быстрым. Для целей тестирования я использовал папку res / raw для хранения звуковых файлов и пытался воспроизвести их двумя разными способами, но результат меня не удовлетворил.Вот два различных типа кода:

Метод 1:

Button first = (Button) findViewById(R.id.one);
Button second = (Button) findViewById(R.id.two);
first.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MediaPlayer mp = MediaPlayer.create(SoundFXActivity.this, R.raw.drumtwo);
                mp.start();
                mp.setOnCompletionListener(new OnCompletionListener() {

                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        // TODO Auto-generated method stub
                        mp.release();
                    }

                });
            }
        });

second.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MediaPlayer mp = MediaPlayer.create(SoundFXActivity.this, R.raw.drumone);
                mp.start();
                mp.setOnCompletionListener(new OnCompletionListener() {

                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        // TODO Auto-generated method stub
                        mp.release();
                    }

                });
            }
        });

Метод 2:

    private SoundPool spool;
    private int soundID,soundID2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
        spool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
        soundID = spool.load(this, R.raw.drumone, 1);
        soundID2 = spool.load(this, R.raw.drumtwo, 1);

        Button three = (Button) findViewById(R.id.three);



        three.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Sound();

            }
        });



    }

    public void Sound(){
        AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
        float volume = (float) audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
        spool.play(soundID, volume, volume, 1, 0, 1f);
    };

Но проблема в том, что оба метода медленны ... Мне нужно найти способ более быстрого воспроизведения звуков ... но теперь, когда я нажимаю кнопку, остается почти секунда, чтобы воспроизвести звук.

Можете ли вы дать мне несколько советов, как играть саунд быстрее. Должен ли я загружать их в кеш при запуске приложения или сохранять их в базе данных или где-то еще (я не думаю, что база данных является хорошим вариантом на самом деле, бно я хочу услышать некоторые предложения). Или, может быть, загрузить их из папки активов, но я думаю, что это все еще будет медленно.

Так какие-нибудь идеи или предложения?Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 01 сентября 2011

Вы можете создать медиаплееры на вашем onCreate, и тогда кнопки просто заставят их играть. Это было бы самым простым решением, я бы сказал.

В качестве альтернативы, в зависимости от того, насколько это важно для вас и сколько работы вы хотите сделать, вы можете рассмотреть возможность использования JetPlayer:

вот страница разработки для Android для СМИ:
http://developer.android.com/guide/topics/media/index.html

Страница класса JetPlayer:
http://developer.android.com/reference/android/media/JetPlayer.html

и страница о создании файлов JET:
http://developer.android.com/guide/topics/media/jet/jetcreator_manual.html

Если бы вы реализовали это, это, вероятно, работало бы лучше всего, но определенно было бы наиболее эффективным.

JetPlayer в основном позволяет вам иметь один аудиофайл (я думаю, что это MIDI-файл) с несколькими треками, которые вы можете приглушать и включать, как вам угодно. У меня нет личного опыта, я только что прочитал некоторые документы, но, похоже, это было бы очень полезно для любой ситуации с более чем одним звуком.

Редактировать: Также стоит упомянуть этот список рассылки и в случае, если ссылка когда-либо изменится этот поиск в Google на случай, если кто-то заинтересуется темами для Android android .

0 голосов
/ 03 ноября 2014

SoundPool работает нормально, вы можете увидеть пример с проектом Hexiano . Тем не менее, вы должны предварительно загрузить звуки в SoundPool, потому что для декодирования файла и сохранения его в памяти требуется много времени, прежде чем вы сможете его использовать. Но как только звук загружен, между нажатием клавиши и выводом звука нет заметной задержки.

0 голосов
/ 30 апреля 2014

Если вы хотите иметь меньшую задержку, вы должны использовать OpenSL в c ++, From jelly bean - более быстрый звуковой плеер

...