录音 - 写入 PCM 文件



我正在尝试使用AudioRecord类录制一些语音,然后将其写入输出.pcm文件。我希望我的程序继续录制,直到按下停止按钮。不幸的是,无论我录制多长时间,输出文件大小始终为 3528 字节,持续时间约为 20 毫秒。同样根据Toolsoft音频工具,该文件的属性是: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;
    }
}

我可以请你告诉我怎么了?我希望答案不会是"一切":)

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();
            }
    }

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

如果它不起作用,那么去这个博客。它将很好地记录和存储.pcm文件中的数据。

最新更新