在我的应用程序中,我已经成功录制了音频,现在我正在使用以下功能播放它:
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();
}
}});
任何帮助都会很棒。谷歌上没有太多帮助。我几乎完成了我的应用程序,但现在在最后一刻,我正在遭受这个问题。请帮助我!!
答案 0 :(得分:2)
您无法使用==
将p3_button.getText()=="Pause"
这样的行更改为p3_button.getText().equals("Pause")
。
尝试解决问题。
答案 1 :(得分:1)
我发现问题是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();
}
}