AudioRecord - 写入PCM文件

时间:2012-11-27 12:01:08

标签: android audiorecord

我正在尝试使用AudioRecord类录制一些语音,然后将其写入输出.pcm文件。我希望我的程序继续录制,直到按下停止按钮。不幸的是,无论我录制多长时间,输出文件大小总是3528字节,持续时间约为20毫秒。另外根据Toolsoft Audio Tools,该文件的特性是:44100Hz,16位,立体声,即使我使用具有完全不同采样频率的单声道。

Thread recordingThread;
boolean isRecording = false;


int audioSource = AudioSource.MIC;
int sampleRateInHz = 44100;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);

byte Data[] = new byte[bufferSizeInBytes];

AudioRecord audioRecorder = new AudioRecord(audioSource,
                                            sampleRateInHz, 
                                            channelConfig, 
                                            audioFormat, 
                                            bufferSizeInBytes);
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);   
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}    

public void startRecording(View arg0) {
    audioRecorder.startRecording();
    isRecording = true;
    recordingThread = new Thread(new Runnable() {
        public void run() {
            String filepath = Environment.getExternalStorageDirectory().getPath();
            FileOutputStream os = null;
            try {
                os = new FileOutputStream(filepath+"/record.pcm");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            while(isRecording) {
                audioRecorder.read(Data, 0, Data.length);
                try {
                    os.write(Data, 0, bufferSizeInBytes);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    });
    recordingThread.start();
}

public void stopRecording(View arg0) {
    if (null != audioRecorder) {
        isRecording = false;
        audioRecorder.stop();
        audioRecorder.release();
        audioRecorder = null;
        recordingThread = null;
    }
}
我可以请你告诉我出了什么问题吗?我希望答案不会是“一切”:)

2 个答案:

答案 0 :(得分:2)

Change your sample rate to 8000,因为在模拟器中cant test with 44100 sample rate.

如图所示使用AudioRecord来源在模拟器中播放

private static final int RECORDER_SAMPLERATE = 8000;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;

AudioRecord audio_record = new AudioRecord(MediaRecorder.AudioSource.MIC,
            RECORDER_SAMPLERATE, RECORDER_CHANNELS,
            RECORDER_AUDIO_ENCODING, BufferElements2Rec * BytesPerElement);


int BufferElements2Play = 1024; // want to play 2048 (2K) since 2 bytes we use only 1024
int BytesPerElement = 2; // 2 bytes in 16bit format

<强> If it din't get worked, then go to this blog. It will work fine for recording and storing the data in .pcm file.

答案 1 :(得分:1)

try {
                os.write(Data, 0, bufferSizeInBytes);
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

这就是问题所在。您只需一次写入即关闭FileOutputStream(os.close())。 将其移出while循环:

while(isRecording) {
            audioRecorder.read(Data, 0, Data.length);
            try {
                os.write(Data, 0, bufferSizeInBytes);
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
      try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }