android检测线程阻塞,android-audiomanager – 没有阻塞或线程的Android-dev AudioRecord

我希望录制麦克风音频流,以便我可以在其上进行实时DSP.

我想这样做而不必使用线程,并且在等待新的音频数据时没有.read()块.

更新/答案:这是Android中的一个错误. 4.2.2仍有问题,但5.01已经固定!我不确定分歧在哪里,但这就是故事.

注意:请不要说“只使用线程”.线程很好,但这不是关于它们的,Android开发人员打算让AudioRecord完全可用,而不必指定线程,也不必处理阻塞read().谢谢!

这是我发现的:

初始化AudioRecord对象时,它会创建自己的内部环型缓冲区.

当.start()被调用时,它开始记录到所述环形缓冲区(或者它实际上是什么类型).

当调用.read()时,它会读取bufferSize的一半或指定的字节数(以较小者为准)然后返回.

如果内部缓冲区中有足够多的音频样本,则read()会立即返回数据.如果还不够,则read()等待直到有,然后返回数据.

.setRecordPositionUpdateListener()可用于设置监听器,而.setPositionNotificationPeriod()和.setNotificationMarkerPosition()可分别用于设置通知Period和Position.

但是,除非满足某些要求,否则似乎永远不会调用Listener:

1:Period或Position必须等于bufferSize / 2或(bufferSize / 2)-1.

2:必须在Period或Position计时器开始计数之前调用.read() – 换句话说,在调用.start()之后再调用.read(),并且每次调用Listener时,调用.read() )再次.

3:.read()每次必须至少读取一半bufferSize.

因此,使用这些规则,我能够使

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值