如何使用AudioRecord连续录制4秒组

时间:2014-01-24 11:17:20

标签: java android audio-recording android-audiorecord

我正在尝试从AudioRecord录制4秒的集合,处理它们,然后重新录制等等。我以44100样本/秒的速度录制,你可以在下面的代码中看到。我必须提到我记录,或者至少我应该记录19Khz的脉冲组。

    int frequency = 44100;
                int blockSize = 44100;
                int channelConfiguration = AudioFormat.CHANNEL_IN_MONO;
                int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

                final int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding);

                audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration,
                        audioEncoding, blockSize * 8); // if I multiply blockSize by 4 it will only give 88200 buffer size

                // start recording until explicitly stopped
                while ( <stopCondition> ) {
                    recData = new ByteArrayOutputStream();
                    dos = new DataOutputStream(recData);
                    short[] buffer = new short[blockSize * 4]; // Save the raw PCM
//                  timePassed = false;
//                  timer.cancel();
//                  timer.start();
                    audioRecord.startRecording();
//                  while (!timePassed) {
                        int bufferReadResult = audioRecord.read(buffer, 0, blockSize * 4);
                        for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
                            try {
                                dos.writeShort(buffer[i]);
//                              buffer[i] = 0;
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
//                  }

                    audioRecord.stop();
                    try {
                        dos.flush();
                        dos.close();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
... process the recorded data

从代码中可以看到(注释)我尝试使用countDownTimer,它在4秒后停止录制。它一次只读取audioRecord 1秒(blockSize没有乘以4),但我不确切知道缓冲区是否被覆盖,因为偏移量为0 - 我认为它确实存在,但我仍然不确定:)使用这种方法它没有记录4秒钟内播放的脉冲数 - 播放了16个脉冲,只记录了2-3个。

我试过没有计时器并从audioRecord读取blockSize * 4 = 44100(= 1s)* 4 = 4s,但是在Audacity我看到只记录了1秒 - 代码中的某个地方,这里没有显示,我写了将数据记录到文件中以检查输出。再次记录的脉冲数量不合适,但这很明显,因为我只有1秒的记录数据。

是否有更好的方法可以连续录制X秒并处理它们?或者,如果我的方法比我做错了?

谢谢。

1 个答案:

答案 0 :(得分:0)

尝试下面的代码。

Timer myTimer = new Timer();
        myTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                startRecording();
            }
        }, 4000);

startRecording Method

private void startRecording() {
    myFilename = getFilename();
    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(output_formats[currentFormat]);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setOutputFile(getFilename());
    recorder.setOnErrorListener(errorListener);
    recorder.setOnInfoListener(infoListener);
    try {
        recorder.prepare();
        recorder.start();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

<强>的getFileName

private String getFilename() {
    String filepath = Environment.getExternalStorageDirectory().getPath();
    File file = new File(filepath, AUDIO_RECORDER_FOLDER);

    SimpleDateFormat sdfDate = new SimpleDateFormat("dd-MMM-yyyy hh-mm-ss");
    String currentDateandTime = sdfDate.format(new Date());

    if (!file.exists()) {
        file.mkdirs();
    }
    return (file.getAbsolutePath() + "/" + currentDateandTime + file_exts[currentFormat]);
}

这将在4秒后开始新的录音,getFilename将为你的录音命名为currentDate和time。

希望你看起来和我从你的问题中理解的一样,如果我想念你,那么请纠正我。