Как управлять темпом и высотой тона в Android с помощью MediaPlayer или SoundPool

#android

#Android

Вопрос:

Я пытаюсь управлять темпом и высотой тона с помощью SoundPool. В методе play (), если мы меняем скорость (последний аргумент), меняются и темп, и высота звука. И я не могу воспроизвести полный звуковой файл с помощью SoundPool. Я получил решение, используя FileDescriptor в SoundPool, мы можем указать длину файла для воспроизведения, но он не работает. Пожалуйста, поделитесь своими идеями.

Спасибо

Ответ №1:

Попробуйте это для изменения высоты звука в Android

Это может оказаться полезным. После того, как я все перепробовал, я решил использовать SoundPool для изменения высоты тона. При скорости воспроизведения 2,0 звук воспроизводится с частотой, вдвое превышающей исходную, а при скорости воспроизведения 0,5 — с половиной первоначальной частоты. Диапазон частот воспроизведения составляет от 0,5 до 2,0. Но он работал с частотой ниже и выше 0,5 и 2,0.

Я публикую свой рабочий код,

но поскольку это только для демонстрации, здесь вам нужно вручную изменять «скорость воспроизведения» при каждой установке приложения, например: «sp.play (explosion, 1,1,0,0,1.5f)», здесь «1,5 f» — это скорость воспроизведения. Можно легко создать EditView или что-то подобное, чтобы установить значение скорости воспроизведения во время выполнения.

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

 import java.io.IOException;

import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class SoundPoolActivity extends Activity implements OnClickListener {

    SoundPool sp;
    int explosion = 0;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

       View v = new View(this);
       v.setOnClickListener(this);
       setContentView(v);
       sp = new SoundPool(1,AudioManager.STREAM_MUSIC,0);
       //explosion = sp.load(this, R.raw.hh,0);
       explosion = sp.load("/sdcard/hh.m4a",0);


    }


    public void onClick(View v){
         if (explosion!=0){

             sp.play(explosion, 1,1,0,0,2.3f);
         }

    }
}
  

Ответ №2:

Насколько мне известно, Mediaplayer или Soundpool не могут позволить нам изменять высоту тона и темп (скорость) независимо.

Вы можете попробовать использовать soundtouch, проект github, поддерживаемый xanaduo.

Это сделало мой день лучше после 2 дней поиска по сети.