iOS AudioQueue机制的延迟问题探究

关键字:VOIP,AudioUnit,AudioQueue,RemoteIO
问题描述
VOIP通话,iOS底层音频方式采用AudioUnit机制,本来也挺好,但是会有遇到CS域来电时RemoteIO挂死的问题
[1876:492456] 20:46:05.584 WARNING: [AVAudioSession Notify Thread] 1250: AURemoteIO::Stop: error 0x10000004 calling TerminateOwnIOThread
[1876:492846] 20:46:05.586 ERROR: [AURemoteIO::IOThread] >aurioc> 1499: [email protected]: IOThread exiting with error 0x10004002
[1876:492456] 20:46:05.592 ERROR: [AVAudioSession Notify Thread] AVAudioSessionPortImpl.mm:52: ValidateRequiredFields: Unknown selected data source for Port iPhone 麦克风 (type: MicrophoneBuiltIn)
[1876:492456] 20:46:05.601 ERROR: [AVAudioSession Notify Thread] AVAudioSessionPortImpl.mm:52: ValidateRequiredFields: Unknown selected data source for Port iPhone 麦克风 (type: MicrophoneBuiltIn)
[1876:492456] 20:46:05.606 ERROR: [AVAudioSession Notify Thread] AVAudioSessionPortImpl.mm:52: ValidateRequiredFields: Unknown selected data source for Port iPhone 麦克风 (type: MicrophoneBuiltIn)
[1876:492456] 20:46:05.612 ERROR: [AVAudioSession Notify Thread] AVAudioSessionPortImpl.mm:52: ValidateRequiredFields: Unknown selected data source for Port iPhone 麦克风 (type: MicrophoneBuiltIn)
[1876:492456] 20:46:05.614 ERROR: [AVAudioSession Notify Thread] AVAudioSessionPortImpl.mm:52: ValidateRequiredFields: Unknown selected data source for Port iPhone 麦克风 (type: MicrophoneBuiltIn)

挂死就挂死吧,如果能强制关闭也行,问题是他一定要等25S左右,才出错误,在这之前,所有对音频设备的接口调用都会被阻塞住.这就成问题了.
本来场景可以这样做,iOS监听到收到CS域来电,发通知,HOLD通话,底层实现是直接销毁媒体控制对象.在CS域电话挂断后(不挂断,单纯切回APP无效,抢不回来)
发UNHOLD动作,这时重建媒体,结果由于对媒体的动作被阻塞住,导致执行动作的底层线程被阻塞住了,媒体在信令发出后15S内没能建立(直接挂CS电话),被对端挂了.

反复跟踪,搜索,终于发现stackoverflow上有几个问题和这个相关,提示是去采用AudioQueue,没想到这里还有一个坑.
代码集成后发现问题倒是解决了,但是音质卡顿,和之前的算法完全无法相比.
分析,发现AudioQueue上报数据有延迟.视数据缓冲区大小,20ms~1S之内,区别还挺大的.
AudioUnit上报数据的间隔基本是均匀的,20ms左右,故WebRTC底层发送时就根本不做延时.直接认为采集是均匀的就行.
而AudioUnit在上报数据大小为250ms以下时,会每隔10个包左右,延迟256ms一次,而且这延时也没有带来更多的数据;超过500ms以后,延迟才比较均匀,700多ms一次的延时间隔.

时间: 2024-08-25 23:19:15

iOS AudioQueue机制的延迟问题探究的相关文章

深入浅出iOS事件机制

深入浅出iOS事件机制 2015年 04月 12日 本文章将讲解有关iOS事件的传递机制,如有错误或者不同的见解,欢迎留言指出.转载自:http://zhoon.github.io/ios/2015/04/12/ios-event.html iOS的事件有好几种:Touch Events(触摸事件).Motion Events(运动事件,比如重力感应和摇一摇等).Remote Events(远程事件,比如用耳机上得按键来控制手机),其中最常用的应该就是Touch Events了,基本存在于每个a

《转之微信移动团队微信公众号》iOS 事件处理机制与图像渲染过程

致歉声明: Peter在开发公众号功能时触发了一个bug,导致群发错误.对此我们深表歉意,并果断开除了Peter.以下交回给正文时间: iOS 事件处理机制与图像渲染过程 iOS RunLoop都干了什么 iOS 为什么必须在主线程中操作UI 事件响应 CALayer CADisplayLink 和 NSTimer iOS 渲染过程 渲染时机 CPU 和 GPU渲染 Core Animation Facebook Pop介绍 AsyncDisplay介绍 参考文章 iOS RunLoop都干了什

iOS 事件处理机制与图像渲染过程

iOS 事件处理机制与图像渲染过程 iOS RunLoop都干了什么 iOS 为什么必须在主线程中操作UI 事件响应 CALayer CADisplayLink 和 NSTimer iOS 渲染过程 渲染时机 CPU 和 GPU渲染 Core Animation Facebook Pop介绍 AsyncDisplay介绍 参考文章 iOS RunLoop都干了什么 RunLoop是一个接收处理异步消息事件的循环,一个循环中:等待事件发生,然后将这个事件送到能处理它的地方. 如图1-1所示,描述了

Android事件分发机制详解(1)----探究View的事件分发

探究View的事件分发 在Activity中,只有一个按钮,注册一个点击事件 [java] view plaincopy button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.d("TAG", "onClick execute"); } }); 如果在需要一个触摸事件 [java] view plaincopy button.setO

IOS通知机制初解

消通知机制: 3个步骤: 1.通知的发布 2.通知的监听 3.通知的移除 需要了解的要点 1.通知中心:(NSNotificationCenter) 每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信 任何一个对象都可以向通知中心发布通知(NSNotification),描述自己在做什么.其他感兴趣的对象(Observer)可以申请在某个特定通知发布时(或在某个特定的对象发布通知时)收到这个通知 2.通知:(NSNotificati

iOS事件机制(一)

iOS事件机制(一) DEC 7TH, 2013 运用的前提是掌握掌握的本质是理解 本篇内容将围绕iOS中事件及其传递机制进行学习和分析.在iOS中,事件分为三类: 触控事件(单点.多点触控以及各种手势操作) 传感器事件(重力.加速度传感器等) 远程控制事件(远程遥控iOS设备多媒体播放等) 这三类事件共同构成了iOS设备丰富的操作方式和使用体验,本次就首先来针对第一类事件:触控事件,进行学习和分析. Gesture Recognizers Gesture Recognizers是一类手势识别器

iOS事件机制(二)

iOS事件机制(二) DEC 29TH, 2013 本篇内容接上一篇iOS事件机制(一),本次主要介绍iOS事件中的多点触控事件和手势事件. 从上一篇的内容我们知道,在iOS中一个事件用一个UIEvent对象表示,UITouch用来表示一次对屏幕的操作动作,由多个UITouch对象构成了一个UIEvent对象.另外,UIResponder是所有响应者的父类,UIView.UIViewController.UIWindow.UIApplication都直接或间接的集成了UIResponder.关于

IOS消息机制应用实例--异常处理

IOS消息机制应用实例--异常处理 最近发现了一个在项目中常用的异常处的工具NullSafe,分析了它的实现原理,不小心发现了一个小Bug,现将其分享出来,关于这篇文章的Demo已经上传至GitHub,看完如有收获,欢迎Star,如有疑问欢迎issue,大家一起学习.在IOS开发中我们可能会遇到下面的情景:服务器给我们返回得某个字段是null,比如someValue:null,这个时候我们利用第三方工具转化之后会得到someValue = <null>,这个时候如果我们判断这个someValu

iOS核心笔记——iOS通知机制

1.iOS通知机制: 1-1.iOS通知发布者.通知中心.监听器之间的关系: 如下图所示: 2.通知(NSNotification)简介: 3.通知中心(NSNotificationCenter) 3-1.每个应用程序只有一个通知中心对象(单例对象): 4.发布通知: 4-1.对象在自己需要的某个时候使用通知类(NSNotification)创建通知对象后让通知中心帮忙发布通知: 1.可以在对象A需要使用通知的某个位置,直接让通知中心帮忙发送的时候将通知中的一系列信息通过通知中心提供的方法创建通