3

在我的项目中,我使用 mediaplayer 录制了声音并保存为 .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

1

我尝试了名为 Sonic 的库。它基本上用于语音,因为它使用 PSOLA 算法来改变音高和速度。 索尼克图书馆

于 2014-07-05T05:25:56.047 回答
0

如果你想在播放声音时改变音高,你必须使用声音池。这是最好的方法。你可以快进你的演奏一定量,看看你觉得音高已经改变了。

于 2014-04-24T20:20:18.373 回答
0

我有你的问题。媒体播放器不支持 cha

于 2013-08-30T09:48:38.973 回答
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)

于 2013-08-30T10:19:24.933 回答