我按照audio i/o tutorial建立一个实时录音应用程序。但是,为了记录整个声音,很少会调用回调。例如,当我开始录制5秒钟时,回调实际上只给出了2秒的剪辑(而不是5)。
这是一个虚拟测试代码,仅转储已记录的字节数:
int _audio_read_total;
static void _audio_io_stream_read_cb(audio_in_h handle, size_t nbytes, void *userdata)
{
const void *buffer = NULL;
if (nbytes > 0) {
int error_code = audio_in_peek(handle, &buffer, &nbytes);
_audio_read_total += nbytes;
dlog_print(DLOG_DEBUG, LOG_TAG, "nbytes = %d,_audio_read_total = %d", nbytes, _audio_read_total);
error_code = audio_in_drop(handle); // remove audio data from internal buffer
}
}
static void start_audio_recording(appdata_s *ad)
{
int error_code = audio_in_create(48000, AUDIO_CHANNEL_MONO, AUDIO_SAMPLE_TYPE_S16_LE, &ad->input);
error_code = audio_in_set_stream_cb(ad->input, _audio_io_stream_read_cb, ad);
error_code = audio_in_prepare(ad->input);
}
附加图像包括在Galaxy Gear S3上运行此代码的结果。正如您在图像中看到的那样,从时间32.3到时间37.7(超过5秒)调用记录回调,但只接收224250个字节(应该是(37.7-32.3)* 48000 * sizeof(短)= 518400) 。这意味着只录制了不到40%的音频。
有人能给我一些解决这个问题的建议吗?
Yu-Chih
答案 0 :(得分:0)
您可以尝试使用
int audio_in_set_interrupted_cb ( audio_in_h input,
audio_io_interrupted_cb callback,
void * user_data
)
当音频输入句柄中断或中断完成时,注册要调用的回调函数。我将进一步探索并尝试重现这一点。