Java 录制pcm文件并通过Audiotrack崩溃播放

Java 录制pcm文件并通过Audiotrack崩溃播放,java,android,eclipse,Java,Android,Eclipse,我正在通过录音机录制pcm文件,并在SD卡中创建一个文件。录音完成后,我用Audiotrack播放同一个文件,但它崩溃了。在logcat中显示“无效的音频缓冲区大小”。我在SD卡上的文件大小也是0.0kb,我不明白为什么。这是代码` public void startRecord() { File file = new File(Environment.getExternalStorageDirectory(), "test.pcm");

我正在通过录音机录制pcm文件,并在SD卡中创建一个文件。录音完成后,我用Audiotrack播放同一个文件,但它崩溃了。在logcat中显示“无效的音频缓冲区大小”。我在SD卡上的文件大小也是0.0kb,我不明白为什么。这是代码`

public void startRecord() {

        File file = new File(Environment.getExternalStorageDirectory(),
                "test.pcm");

        int sampleFreq = 11025;

        try {
            file.createNewFile();

            OutputStream outputStream = new FileOutputStream(file);
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
                    outputStream);
            DataOutputStream dataOutputStream = new DataOutputStream(
                    bufferedOutputStream);

            int minBufferSize = AudioRecord.getMinBufferSize(sampleFreq,
                    AudioFormat.CHANNEL_CONFIGURATION_MONO,
                    AudioFormat.ENCODING_PCM_16BIT);

            short[] audioData = new short[minBufferSize];

            AudioRecord audioRecord = new AudioRecord(
                    MediaRecorder.AudioSource.MIC, sampleFreq,
                    AudioFormat.CHANNEL_CONFIGURATION_MONO,
                    AudioFormat.ENCODING_PCM_16BIT, minBufferSize);

            audioRecord.startRecording();

            while (recording) {
                int numberOfShort = audioRecord.read(audioData, 0,
                        minBufferSize);
                for (int i = 0; i < numberOfShort; i++) {
                    dataOutputStream.writeShort(audioData[i]);
                }
            }

            audioRecord.stop();
            dataOutputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void PLaying(int explosion) {

        File file = new File(Environment.getExternalStorageDirectory(),
                "test.pcm");

        int shortSizeInBytes = Short.SIZE / Byte.SIZE;

        int bufferSizeInBytes = (int) (file.length() / shortSizeInBytes);
        short[] audioData = new short[bufferSizeInBytes];

        try {
            InputStream inputStream = new FileInputStream(file);
            BufferedInputStream bufferedInputStream = new BufferedInputStream(
                    inputStream);
            DataInputStream dataInputStream = new DataInputStream(
                    bufferedInputStream);

            int i = 0;
            while (dataInputStream.available() > 0) {
                audioData[i] = dataInputStream.readShort();
                i++;
            }

            dataInputStream.close();

            int sampleFreq = explosion;

            AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                    sampleFreq, AudioFormat.CHANNEL_CONFIGURATION_MONO,
                    AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes,
                    AudioTrack.MODE_STREAM);

            audioTrack.play();
            audioTrack.write(audioData, 0, bufferSizeInBytes);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
public void startRecord(){
File File=新文件(Environment.getExternalStorageDirectory(),
“test.pcm”);
int-sampleFreq=11025;
试一试{
createNewFile();
OutputStream OutputStream=新文件OutputStream(文件);
BufferedOutputStream BufferedOutputStream=新的BufferedOutputStream(
输出流);
DataOutputStream DataOutputStream=新DataOutputStream(
缓冲输出流);
int minBufferSize=AudioRecord.getMinBufferSize(sampleFreq,
AudioFormat.CHANNEL\u配置\u单声道,
音频格式。编码(PCM(16位);
short[]audioData=新的short[minBufferSize];
音频记录=新的音频记录(
MediaRecorder.AudioSource.MIC、sampleFreq、,
AudioFormat.CHANNEL\u配置\u单声道,
AudioFormat.ENCODING_PCM_16位,最小缓冲区大小);
录音。开始录制();
同时(录音){
int numberOfShort=音频记录。读取(音频数据,0,
最小尺寸);
for(int i=0;i0){
audioData[i]=dataInputStream.readShort();
i++;
}
dataInputStream.close();
int sampleFreq=爆炸;
AudioTrack AudioTrack=新的AudioTrack(AudioManager.STREAM_MUSIC,
sampleFreq,AudioFormat.CHANNEL\u配置\u单声道,
AudioFormat.ENCODING_PCM_16位,缓冲区大小单位,
音频跟踪模式(音频流);
音轨播放();
audioTrack.write(音频数据,0,缓冲大小为字节);
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
`

这段代码看起来不可靠

while (recording) {
      int numberOfShort = audioRecord.read(audioData, 0,
                    minBufferSize);
      for (int i = 0; i < numberOfShort; i++) {
                dataOutputStream.writeShort(audioData[i]);
      }
}
while(录制){
int numberOfShort=音频记录。读取(音频数据,0,
最小尺寸);
for(int i=0;i

录制的值是多少。值在哪里变化。如果它没有改变,它将是一个无止境的循环(除非抛出了和异常)。

您是否集成了停止方法?请再给我们看一点代码。问题是,如果你没有实施正确的停止方法,它将永远循环。你是否做过这样的事情:

   yourStopButton.setOnClickListener(new OnClickListener(){

         @Override
         public void onClick(View view){

             recording=false;
      }

   });

然后,不要忘记在onStart中执行同样的操作,并将recording设置为true。

在构建AudioRecord实例时,将最小缓冲区大小除以2

是的,我添加了停止代码,与您在上述答案中所做的完全相同。问题其实出在我的设备上。我换了设备,它就工作了。谢谢你的帮助。是的,我也这么做了。现在正在工作。是我的设备出了问题。好吧,如果你想发布这样的应用程序,你应该处理这个问题。也许其他一些设备也有这个问题是的,你是对的,但我已经很好地处理了这个部分。事实上,困扰我的是我的设备。我换了设备,它工作了,但花了一个小时来找出确切的错误。