3

トラックの再生速度をリアルタイムで変更できるライブラリを誰かが知っているかどうか知りたいのですが。私の考えは、トラックをロードして、その再生速度を半分または2倍に変更することです。最初にMusicPlayerで試しましたが、まったく不可能でした。次にSoundPoolで試しました。問題は、SoundPoolでは、トラックがロードされるとレートを変更できないことです。これが私が使用しているコードです(概念実証):

float j = 1;

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

    Button b = (Button)findViewById(R.id.Button01);
    b.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            j = (float) (j +.5);

        }
    });

    AssetFileDescriptor afd;
    try {

        SoundPool sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);

        afd = getAssets().openFd("wav/sample.wav");
        int id = sp.load(afd, 1);
        sp.play(id, 1, 1, 1, 0, j);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

ボタンを押すと、再生速度が上がるはずですが、発生しません。リアルタイムでレートをどのように変更するかについてのアイデアはありますか?

前もって感謝します。

4

1 に答える 1

1

sp.playを1回呼び出すと、その関数が呼び出されたときに、jの値がその関数にコピーされます。

後でjを変更しても、関数内のjの値は変更されません(これは値の受け渡しと呼ばれます)

後で再生速度を変更するには、ボタンクリックリスナー内でsp.setRate(StreamID、j)を呼び出す必要があります。

StreamIDはsp.play関数によって返されるため、これを変数としてクラスに格納することに注意してください。

このコードは機能するはずです(私はそれをテストしませんでした):

float j = 1.0f;
SoundPool sp = null;
int sID = 0;

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

    Button b = (Button)findViewById(R.id.Button01);
    b.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            j = (float) (j +.5f);
            sp.setRate(sID,j);

        }
    });

    AssetFileDescriptor afd;
    try {

        sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);

        afd = getAssets().openFd("wav/sample.wav");
        int id = sp.load(afd, 1);
        sID = sp.play(id, 1, 1, 1, 0, j);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

ボタンを数回押すとクラッシュする可能性がありますが、SoundPoolは0.5から2.0のレートしかサポートしていません。jがこれらの範囲内にあることを確認するためのチェックを追加する必要があります。

于 2010-05-02T01:13:14.410 に答える