Android AudioRecording丢失最后几秒的音频

时间:2015-07-27 16:44:20

标签: android audio recording

简单的录音机代码会丢失音频的最后几秒。

使用AudioRecord课程,我把烦恼减少到一个非常简单的案例。

开始按钮,停止按钮以及从AudioRecord对象读取并写入文件的线程。

效果很好,但是在很多设备上,音频的最后三秒都没有写入文件,除非我在用户按下停止按钮后继续录制音频3秒钟。

我正在使用44100单声道16位模式。

设备是运行5.x的Nexus和运行5.0.1的三星S4。

坏情况:

按开始按钮,运行线程(.start()),按停止按钮。 .stop()。release()在文件上调用.sync()。最后三秒钟的音频不能存档。

好的案例:

按开始,运行线程,(。start()按停止。继续录制线程3秒,然后调用.stop()。release()调用.sync()文件。所有预期数据都在文件。

开始按钮调用以下runnable,停止按钮设置recording = 0,导致线程完成。

(我删除了所有try块以提高可读性)

AudioRecord设置

int minAudioBufferSizeInBytes = AudioRecord.getMinBufferSize( 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);

mAudioRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO,  AudioFormat.ENCODING_PCM_16BIT , 4 * minAudioBufferSizeInBytes);

int mFileBufferSizeInBytes = 8 * minAudioBufferSizeInBytes;

recording = 1;

记录线程(可运行)

mAudioRecorder.startRecording();
while (recording == 1) {
readsize = mAudioRecorder.read(audiodata, 0, mFileBufferSizeInBytes/2);
if (readsize != AudioRecord.ERROR_INVALID_OPERATION && mAudioRecordFos != null) {
    mAudioRecordFos.write(audiodata,0,readsize); // File Output Stream
}
}
if (mRecorderRunOn > 0) {   // RunOn time in milliseconds
Log.d(TAG, "AudioRecord record reading on for " + mRecorderRunOn + "ms ");
long readon_ts = System.currentTimeMillis() + mRecorderRunOn;

while (System.currentTimeMillis() < readon_ts) {
    readsize = mAudioRecorder.read(audiodata, 0, mFileBufferSizeInBytes/2);
    if (readsize>0) {
    mAudioRecordFos.write(bytes,0,readsize); // File Output Stream
    }
}
}

mAudioRecordFos.getFD().sync();

mAudioRecorder.stop();
mAudioRecorder.release();

在另一个版本中,我在调用.stop()之后继续阅读,直到它报告没有更多数据,但该版本没有改变丢失的数据量。

1 个答案:

答案 0 :(得分:0)

我很遗憾地说我的OP中的代码完美无缺。 事实证明我的播放机制存在问题。 我通过使用adb从手机中提取音频来减少未知数,然后使用alsa aplay播放录音。

我以为我已经多次检查过,但是另一次通过测试确定了问题..

基本上

adb pull /storage/extSdCard/6178190842925110523
aplay -r 48000 -c 1 -f S16_LE 6178190842925110523

将问题确定为不在代码的记录方面。