4

1つのアクティビティで6つの異なるサウンドをロードし、ボタンをクリックするだけですべてのサウンドを再生する必要があるプロジェクトに取り組んでいます。サウンドファイルはそれほど大きくありませんが、問題はもっと大きくなる可能性があるということです。これは、単一のアクティビティでサウンドファイルをロードする最も速い方法です。テスト目的で、res / rawフォルダーを使用してサウンドファイルを保存し、2つの異なる方法でファイルを再生しようとしましたが、結果は満足できませんでした。 2つの異なるタイプのコード:

方法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);
    };

しかし、問題は両方の方法が遅いことです..私は音を再生するより速い方法を見つける必要があります..しかし今、私が音を再生するためにボタンをクリックしてからほぼ1秒後です。

サウンダをより速く再生する方法についてアドバイスをいただけますか?アプリケーションの起動時にそれらをキャッシュにロードするか、データベースまたは他の場所に保存する必要があります(実際のところ、データベースは良いオプションではないと思いますがいくつかの提案を聞きたいです)またはアセットフォルダからそれらをロードするかもしれませんが、それでも遅いと思います。

それで、何かアイデアや提案はありますか?前もって感謝します!

4

3 に答える 3

2

でメディアプレーヤーを作成する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を使用すると、基本的に1つのオーディオファイル(MIDIファイルだと思います)を作成し、複数のトラックを自由にミュートおよびミュート解除できます。個人的な経験はなく、ドキュメントを読んだばかりですが、複数のサウンドがある状況では非常に役立つようです。

編集:また、このメーリングリストに言及する価値があります。Androidオーディオのトピックに興味がある人がいる場合に備えて、リンクがこのグーグル検索を変更する場合に備えて。

于 2011-09-01T04:22:59.740 に答える
0

遅延を少なくしたい場合は、c ++でOpenSLを使用する必要があります。ジェリービーンズからは、より高速なサウンドプレーヤーです。

于 2014-04-30T09:34:46.900 に答える
0

SoundPoolは正常に動作しています。Hexianoプロジェクトの例を見ることができます。ただし、サウンドを使用するには、ファイルをデコードしてメモリに保存するのに時間がかかるため、サウンドをSoundPoolにプリロードする必要があります。ただし、サウンドがロードされると、キーを押してからサウンド出力までの間に目立った遅延はありません。

于 2014-11-02T22:55:03.250 に答える