3

私のプロジェクトでは、メディアプレーヤーを使用してサウンドを録音し、.3gp ファイルとして保存しましたが、オーディオエフェクトまたは早送りを使用して再生したり、再生中にオーディオのピッチを変更したりしたい場合。私は mediaplayer を使用しましたが、動作しませんでした。その後、オーディオトラックを使用しましたが、オーディオトラックは再生するための入力としてバイトストリームのみを受け取ります。.3gp ファイルを再生して、再生中にピッチを変更したいだけです。以下のファイルを使用します。助けて...よろしくお願いします...

public void play() {


         File path = new File(
                    Environment.getExternalStorageDirectory().getAbsolutePath()
                            + "/sdcard/meditest/");
         File[] f=path.listFiles();
            isPlaying=true;
            int bufferSize = AudioTrack.getMinBufferSize(outfrequency,
                    channelConfigurationout, audioEncoding);
            short[] audiodata = new short[bufferSize];

            try {
                DataInputStream dis = new DataInputStream(
                        new BufferedInputStream(new FileInputStream(
                                f[0])));

                audioTrack = new AudioTrack(
                        AudioManager.STREAM_MUSIC, outfrequency,
                        channelConfigurationout, audioEncoding, bufferSize,
                        AudioTrack.MODE_STREAM);
                audioTrack.setPlaybackRate((int) (frequency*1.5));
                AudioManager audioManager =     (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
                // Set the volume of played media to maximum.


                audioTrack.setStereoVolume(1.0f,1.0f);
                Log.d("Clapper","player start");
                audioTrack.play();

                while (isPlaying && dis.available() > 0) {
                    int i = 0;
                    while (dis.available() > 0 && i < audiodata.length) {
                        audiodata[i] = dis.readShort();
                        i++;
                    if(i/50==0)
                        Log.d("Clapper", "playing now"+i);
                    }
                    audioTrack.write(audiodata, 0, audiodata.length);

                }
                Log.d("Clapper","AUDIO LENGTH: "+String.valueOf(audiodata));
                dis.close();
                audioTrack.stop();


            } catch (Throwable t) {
                Log.e("AudioTrack", "Playback Failed");
            }

            Log.d("Clapper","AUDIO state: "+String.valueOf(audioTrack.getPlayState()));
            talkAnimation.stop();
            if(audioTrack.getPlayState()!=AudioTrack.PLAYSTATE_PLAYING)
                {


                runOnUiThread(new Runnable() {

                    public void run() {

                        // TODO Auto-generated method stub

                        imgtalk.setBackgroundResource(R.drawable.talk1);
                    }
                });


                }
        }
4

4 に答える 4

0

を使用することを検討してくださいSoundPool

http://developer.android.com/reference/android/media/SoundPool.html

演奏中のリアルタイムでのピッチ変更に対応

再生速度も変更できます。再生レートが 1.0 の場合、サウンドは元の周波数で再生されます (必要に応じて、ハードウェア出力周波数にリサンプリングされます)。再生レートが 2.0 の場合、サウンドは元の周波数の 2 倍で再生され、再生レートが 0.5 の場合は、元の周波数の半分で再生されます。再生レートの範囲は 0.5 ~ 2.0 です。

サウンドがロードされて再生が開始されると、アプリケーションは SoundPool.play() を呼び出してサウンドをトリガーできます。ストリームの再生は一時停止または再開できます。アプリケーションは、ドップラー効果または合成効果のためにリアルタイムで再生速度を調整することにより、ピッチを変更することもできます。

http://developer.android.com/reference/android/media/SoundPool.html#setRate(int, float)

于 2013-08-30T10:19:24.933 に答える
0

問題が発生しました。メディア プレーヤーはチャをサポートしていません

于 2013-08-30T09:48:38.973 に答える