Android Error中的AudioRecorder缓冲区大小无效

时间:2012-02-23 08:59:53

标签: android android-emulator bluetooth

我需要同时录制和播放音频,我使用2个线程的帮助。这是代码

recorder = new AudioRecord(AudioSource.MIC, 8000,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT, bufferSize);

    if (recorder.getState() == android.media.AudioRecord.STATE_INITIALIZED)
        recorder.startRecording();
    isRecording = true;
    audioPlayer = new AudioTrack(AudioManager.STREAM_MUSIC, 8000,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT, bufferSize,
            AudioTrack.MODE_STREAM);

    audioPlayer.play();
    new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
             while(true)
             {
            readBytes = recorder.read(data, 0, bufferSize);
            if (readBytes == AudioRecord.ERROR_INVALID_OPERATION)
                System.out.println("ERROR_INVALID_OPERATION");
            else if (readBytes == AudioRecord.ERROR_BAD_VALUE)
                System.out.println("ERROR_BAD_VALUE");


            }

        }
    }).start();
    new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            if (readBytes > 0)
                audioPlayer.write(data, 0, readBytes);
        }
    }).start();

我收到以下错误: 02-23 14:19:59.625:E / AudioTrack(1786):缓冲区大小无效:minFrameCount 2400,frameCount 2048

提前致谢

3 个答案:

答案 0 :(得分:2)

试试这个

            int MIN_BUF_SIZE_REC = AudioRecord.getMinBufferSize(8000,
                    AudioFormat.CHANNEL_CONFIGURATION_MONO,
                    AudioFormat.ENCODING_PCM_16BIT);
            AudioRecord recorder = new AudioRecord(
                    MediaRecorder.AudioSource.MIC, 8000,
                    AudioFormat.CHANNEL_CONFIGURATION_MONO,
                    AudioFormat.ENCODING_PCM_16BIT, MIN_BUF_SIZE_REC);

答案 1 :(得分:1)

这个用来解决问题的代码希望它有所帮助

公共类聊天扩展了活动{

Devc devc;
byte[] bytesent, bytesgot;
private BluetoothSocket mmSocket = null;
private InputStream mmInStream;
private OutputStream mmOutStream;
Handler handler;
Button send;
TextView getmessage;
EditText sentmessage;
TextView nowsentmessage;
TextView you;
int bytes = 0;
Thread thread;
private int audioSource = MediaRecorder.AudioSource.MIC;
private int samplingRate = 44100; /* in Hz */
private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
private int bufferSize = AudioRecord.getMinBufferSize(samplingRate,
        channelConfig, audioFormat);
private int sampleNumBits = 16;
private int numChannels = 1;
AudioTrack audioPlayer;
AudioRecord recorder;
Boolean isRecording;
byte[] bytes2;

protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.chat);
    getmessage = (TextView) findViewById(R.id.gottext);
    sentmessage = (EditText) findViewById(R.id.entertext);
    nowsentmessage = (TextView) findViewById(R.id.metext);
    you = (TextView) findViewById(R.id.you);
    send = (Button) findViewById(R.id.sent);
    bufferSize += 2048;
    recorder = new AudioRecord(audioSource, samplingRate, channelConfig,
            audioFormat, 44100);

    audioPlayer = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT, bufferSize,
            AudioTrack.MODE_STREAM);

    handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {

            // display each item in a single line
        }
    };
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    mmSocket = Devc.bluetoothSocket;
    InputStream tmpIn = null;
    OutputStream tmpOut = null;

    // Get the input and output streams, using temp objects because
    // member streams are final
    try {
        tmpIn = mmSocket.getInputStream();
        tmpOut = mmSocket.getOutputStream();
    } catch (IOException e) {
    }

    mmInStream = tmpIn;
    mmOutStream = tmpOut;

    new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            recorder.startRecording();
            isRecording = true;
            while (true) {
                int readBytes = 0;
                readBytes = recorder.read(bytesent, 0, bufferSize);
                if (readBytes > 0) {
                    write(bytesent);
                    bufferSize += 2048;
                }

            }

        }
    }).start();
    new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub\
            while (true) {
                int readBytes = 0;
                try {
                    bytes = mmInStream.read(bytesgot);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                audioPlayer.write(bytesgot, 0, bytes);
                audioPlayer.play();

            }
        }
    }).start();

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);

}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    try {
        mmInStream.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        mmOutStream.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    cancel();
}

public void write(byte[] bytes) {
    try {

        mmOutStream.write(bytes);
        mmOutStream.flush();
    } catch (IOException e) {
    }
}

public void cancel() {
    try {
        mmSocket.close();
    } catch (IOException e) {
    }
}

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    cancel();
    thread.stop();
    Chat.this.finish();
    // thread.stop();
}

}

答案 2 :(得分:1)

检查出来..我已经使用此代码解决了同样的问题.....
我创建了两个用于记录和回放的内部类(RecordAudio calss和PlayAudio类)。 如果你想要更清晰的音频片段,你可以使用android NoiseSuppressor 欢呼....:D

public class AltAudioRecorder extends Activity implements OnClickListener {

RecordAudio recordTask;
PlayAudio playTask;
Button startRecordingButton, stopRecordingButton, startPlaybackButton,
        stopPlaybackButton;
TextView statusText;
File recordingFile;
boolean isRecording = false;
boolean isPlaying = false;

int frequency = 8000;
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    statusText = (TextView) this.findViewById(R.id.StatusTextView);
    startRecordingButton = (Button) this
            .findViewById(R.id.StartRecordingButton);
    stopRecordingButton = (Button) this
            .findViewById(R.id.StopRecordingButton);
    startPlaybackButton = (Button) this
            .findViewById(R.id.StartPlaybackButton);
    stopPlaybackButton = (Button) this.findViewById(R.id.StopPlaybakButton);
    startRecordingButton.setOnClickListener(this);
    stopRecordingButton.setOnClickListener(this);
    startPlaybackButton.setOnClickListener(this);
    stopPlaybackButton.setOnClickListener(this);
    stopRecordingButton.setEnabled(false);
    startPlaybackButton.setEnabled(false);
    stopPlaybackButton.setEnabled(false);

    File path = new File(Environment.getExternalStorageDirectory()
            .getAbsolutePath()
            + "/FinalOne/src/com/example/finalone/files/");
    path.mkdirs();
    try {
        recordingFile = File.createTempFile("recording", ".pcm", path);
    } catch (IOException e) {
        throw new RuntimeException("Couldn't create file on SD card", e);
    }
}

@Override
public void onClick(View v) {
    if (v == startRecordingButton) {
        record();
    } else if (v == stopRecordingButton) {
        stopRecording();
    } else if (v == startPlaybackButton) {
        play();
    } else if (v == stopPlaybackButton) {
        stopPlaying();
    }
}

public void play() {
    startPlaybackButton.setEnabled(true);
    playTask = new PlayAudio();
    playTask.execute();
    stopPlaybackButton.setEnabled(true);
}

public void stopPlaying() {
    isPlaying = false;
    stopPlaybackButton.setEnabled(false);
    startPlaybackButton.setEnabled(true);
    }

public void record() {
    startRecordingButton.setEnabled(false);
    stopRecordingButton.setEnabled(true);
    // For Fun
    startPlaybackButton.setEnabled(true);
    recordTask = new RecordAudio();
    recordTask.execute();
    }
public void stopRecording() {
    isRecording = false;
    }