AudioRecord 录音时有两种读取模式,一种是AudioRecord.READ_BLOCKING,另外一种是AudioRecord.READ_NON_BLOCKING,但是对这两种模式的定义却比较模糊
/**
* The read mode indicating the read operation will block until all data
* requested has been read.
*/
public final static int READ_BLOCKING = 0;
/**
* The read mode indicating the read operation will return immediately after
* reading as much audio data as possible without blocking.
*/
public final static int READ_NON_BLOCKING = 1;
只说一种是会阻塞直到数据读取成功,另外一种是立刻返回尽可能多的数据而不阻塞。那么假设我选择READ_NON_BLOCKING模式,会不会导致读取到的数据长度是变化的?这两种模式究竟有什么区别?
我们跟踪安卓的源码,AudioRecord.read最终会调用到frameworks/av/media/libaudioclient/AudioRecord.cpp:
ssize_t AudioRecord::read(void* buffer, size_t userSize, bool blocking)
{
if (mTransfer != TRANSFER_SYNC) {
return INVALID_OPERATION;
}
if (ssize_t(userSize) < 0 || (buffer == NUL

本文详细探讨了Android AudioRecord的READ_BLOCKING和READ_NON_BLOCKING两种读取模式。READ_BLOCKING模式会在获取指定数据量时阻塞,而READ_NON_BLOCKING则立即返回当前可用数据,可能导致数据长度变化。在异常情况下,两种模式都可能提前返回。实践中,非阻塞模式可能因数据不足导致录音空白,推荐使用阻塞模式确保数据完整性。
最低0.47元/天 解锁文章
1007

被折叠的 条评论
为什么被折叠?



