【问题标题】:change pitch of .3gp file while playing播放时更改 .3gp 文件的音高
【发布时间】:2013-08-30 08:37:07
【问题描述】:

在我的项目中,我使用 mediaplayer 录制了声音并保存为 .3gp 文件,但是当我想使用一些音频效果或快进或在播放时更改音频音高来播放它时。我使用了媒体播放器但无法正常工作。然后我使用了音轨,但音轨仅将字节流作为输入来播放。我只想播放.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);
                    }
                });


                }
        }

【问题讨论】:

    标签: android-mediaplayer


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        考虑使用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)

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多