【问题标题】:Not able to pause on Audiotrack Object : android无法在音轨对象上暂停:android
【发布时间】:2012-10-15 18:18:31
【问题描述】:

在我的应用程序中,我已经成功录制了音频,现在我正在使用以下功能播放它:

    public void playfile()
{
    System.out.println("Play Pressed");     
     speechLength = (int)(file.length()/2);
     speech2 = new short[speechLength];
     try
     {
        // Create a DataInputStream to read the audio data back from the saved file.
        InputStream is = new FileInputStream(file);
        BufferedInputStream bis = new BufferedInputStream(is);
        DataInputStream dis = new DataInputStream(bis);

        int i = 0;              
        while(i <  speechLength)
        {
            speech2[i] = dis.readShort();
            i++;
        }

        // Close the input streams.
        is.close();
        bis.close();
        dis.close();  

        // Create a new AudioTrack object using the same parameters as the AudioRecord
        // object used to create the file.
        audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                16000, 
                AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT, 
                bufferSizeAT, 
                AudioTrack.MODE_STREAM);   

        //Start playback


        runner.start();
        //Updating Progress Bar on UI Thread
        //updateProgressBar();
     } //main try
    catch (Throwable t){} 
}
 Thread runner= new Thread (){
        public void run()
        {

              // Do stuff.
            audioTrack.play();
            audioTrack.setStereoVolume(50, 50);
            audioTrack.write(speech2, 0, speech2.length);

        }
    };

但是当点击按钮时,我想暂停正在播放的录音,它会暂停,但在恢复时没有任何反应。以下是相同的代码:

       final Button p3_button=(Button)myView.findViewById(R.id.btn_play);
    p3_button.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View view)
        {       
            if(p3_button.getText().equals("Pause"))
            {

                p3_button.setText("Resume");
                audioTrack.pause();


            }
            else if(p3_button.getText().equals("Resume"))
            {
                p3_button.setText("Pause");

                audioTrack.play();


            }
            else
            {
                p3_button.setText("Pause");
                count = 0;
                isPlayPressed = true;
                playing = true;
                playfile();
            }
        }});

任何帮助都会很棒。谷歌上对这个没有太多帮助。我几乎完成了我的应用程序,但现在在最后一刻我遇到了这个问题..请帮助我!!

【问题讨论】:

    标签: android multithreading audiotrack


    【解决方案1】:

    你不能使用==比较字符串

    将这样的行 p3_button.getText()=="Pause" 更改为 p3_button.getText().equals("Pause")

    试试这是否能解决您的问题。

    【讨论】:

    • 你是对的..我会处理的..但问题不在于这个...它实际上暂停了音轨但不恢复它。
    • 因为你之前的所有 if 语句都为假,所以它只执行你暂停它的 else 。更改它并再次测试。
    • 我检查了问题仍然存在..:(
    • 您能否详细解释一下您的问题到底是什么,您看到发生了什么,没有发生什么?
    • 嗯,我正在使用音轨对象播放此录音,我想暂停并恢复它...我的问题是当我点击暂停时..它会暂停当前正在播放的文件,但是当我恢复时,什么也没有发生了..我尝试了不同的方法,但似乎没有任何效果..
    【解决方案2】:

    我发现问题是 track.write 被阻塞了。这是一个现在似乎可以工作的 WavTrack 类:

    package org.this_voice.zhongguomozhou;
    
    
    import android.content.Context;
    import android.media.AudioFormat;
    import android.media.AudioManager;
    import android.media.AudioTrack;
    import android.os.Environment;
    import java.io.InputStream;
    import java.io.IOException;
    import java.lang.Thread;
    
    public class WavTrack {
    /**
    Make sure you set the sample rate, stereo/mono and encoding
    correctly for your audio files.
    **/
    
    public static final boolean STOPPED = true;
    public AudioTrack at;
    public Context mContext;
    public int minBufferSize;
    public byte[] music = null;
    public int size = 0;
    public int position = 0;
    public InputStream is;
    public boolean paused = false;
    
    public WavTrack(Context context) {
        mContext = context;
        minBufferSize = AudioTrack.getMinBufferSize(16000,
            AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
        at = new AudioTrack(AudioManager.STREAM_MUSIC, 16000,
            AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,
            minBufferSize, AudioTrack.MODE_STREAM);
        is = mContext.getResources().openRawResource(R.raw.test01);
    
        try{
            size = (int)is.available();
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        at.play();
    
        new Thread (new Runnable(){
            public void run() {
                int i = 0;
                try{
                    music = new byte[512];
                    while(((i = is.read(music)) != -1) && !paused){
                        at.write(music, 0, i);
                        position += i;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
    
    
    public void pause(){
        is.mark(position);
        paused = true;
        at.pause();
    }
    
    public void stop(){
        at.stop();
        at.release();
    }
    
    public void play() {
        paused = false;
        try {
            is.reset();
        } catch (IOException e) {
            e.printStackTrace();
        }
        at.play();
    
        new Thread (new Runnable(){
            public void run() {
                int i = 0;
                try{
                    music = new byte[512];
                    while(((i = is.read(music)) != -1) && !paused){
                        at.write(music, 0, i);
                        position += i;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2016-07-09
      • 2014-05-14
      • 2023-02-19
      • 2018-09-12
      • 2012-10-03
      相关资源
      最近更新 更多