AudioRecord READ_BLOCKING 与 READ_NON_BLOCKING的区别

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

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值