播放时改变.3gp文件的音高

时间:2013-08-30 08:37:07

标签: android-mediaplayer

在我的项目中,我使用媒体播放器录制声音并保存为.3gp文件,但是当我想播放时使用某些音频效果或快进或播放音频音高。我使用过mediaplayer但没有工作。然后我使用了audiotrack但是audiotrack只使用字节流作为输入来播放。我只是想播放.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 个答案:

答案 0 :(得分:1)

我尝试了名为Sonic的库。它主要用于演讲,因为它使用PSOLA算法来改变音高和节奏。 Sonic Library

答案 1 :(得分:0)

我遇到了你的问题。媒体播放器不支持cha

答案 2 :(得分:0)

考虑使用SoundPool

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

支持播放时实时改变音高

  

播放速率也可以更改。播放速率为1.0会使声音以其原始频率播放(必要时重新采样到硬件输出频率)。播放速率为2.0会使声音以原始频率的两倍播放,而播放速率为0.5会使其以原始频率的一半播放。播放速率范围为0.5到2.0。

     

加载声音并开始播放后,应用程序可以通过调用SoundPool.play()来触发声音。播放流可以暂停或恢复,应用程序也可以通过实时调整多普勒或合成效果的播放速率来改变音高。

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

答案 3 :(得分:0)

如果您想在播放声音时改变音高,则必须使用声音池。这是最好的方法。您可以快速播放一些音量并看到您觉得音高已经改变。