Как постепенно увеличить скорость воспроизведения звука в Android? - PullRequest
1 голос
/ 05 апреля 2020

Я бы хотел воспроизвести звук, который будет постепенно увеличивать скорость воспроизведения, то есть 1-й раз, когда он проигрывает 1x, затем 1.5x, затем 2.0x, затем 3.5x, 4x, ... что-то в этом роде. Я попытался написать несколько кодов, таких как:

        MediaPlayer mp;
        float mpDrumFreq = 0f;
        float frequency = 1f;

        mp = MediaPlayer.create(MainActivity.this, R.raw.tiktok);
        mp.setLooping(true);
        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    mpDrumFreq = Math.min(10f, (mpDrumFreq+frequency) );
                    mp.setPlaybackParams(mp.getPlaybackParams().setSpeed(mpDrumFreq));
                }
            }
        });

        TextView play = findViewById(R.id.play);

        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.start();
            }
        });

Здесь MediaPlayer mp воспроизводит звук. Я пытаюсь увеличить скорость внутри setOnCompletionListener с помощью этой линии mp.setPlaybackParams(mp.getPlaybackParams().setSpeed(newSpeed)); И у меня есть другие варианты. Но это не сработало. Я не знаю почему. Кто-нибудь знает, как это сделать?

В этом случае я пытался с MediaPlayer, но не стесняйтесь предлагать что-нибудь, например SoundPool или какую-то другую библиотеку. Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 05 апреля 2020

Вы можете попробовать с SoundPool:

private static SoundPool sound;
private static SparseIntArray soundPoolMap = new SparseIntArray();
...
// 1 - use one thread
sound = new SoundPool(1, AudioManager.STREAM_MUSIC, 100);
soundPoolMap.put(0, sound.load(application, R.raw.sound, 0));
...
// last parameter - rate of sound
sound.play(soundPoolMap.get(0), 1.0f, 1.0f, 0, 0, 1f);

Но, как написано Говард Лю здесь SoundPool не имеет setOnCompletionListener () и предлагает использовать пользовательский класс .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...