我编写我的iOS应用来录制音频。
我叫session.setPreferredIOBufferDuration(0.001)来设置持续时间,并记录两个回调时间的间隔。
这是我的iPhone 8的数据:
max = 198 avg = 2.75314 min = 0
======================================================
4 2 2 3 5 3 1 3 6 1
2 2 6 0 5 3 1 3 3 5
1 3 3 2 3 5 1 3 3 3
3 4 1 4 3 2 4 2 3 3
3 3 3 3 2 3 3 3 5 1
3 2 3 3 3 3 3 5 1 3
3 3 3 3 3 3 4 1 3 3
3 3 3 2 3 4 2 3 3 3
3 4 5 0 2 3 3 3 3 3
3 3 3 3 2 3 4 2 3 3
3 3 3 3 3 3 4 2 2 4
3 2 4 2 3 2 4 3 4 2
2 3 3 3 3 2 4 3 5 1
2 4 2 3 2 3 4 3 3 2
4 5 1 2 3 4 2 4 1 3
3 3 3 5 2 2 2 4 2 3
3 3 3 6 0 3 3 3 2 3
3 3 4 2 3 3 2 3 3 3
3 3 3 3 5 1 2 3 3 3
3 3 4 4 1 2 3 3 4 2
3 3 3 3 3 2 3 6 0 3
3 3 4 2 3 3 3 2 5 1
这是我的iPhone 7的数据:
max = 246 avg = 2.59249 min = 0
======================================================
3 2 3 2 3 3 5 2 2 3
3 3 3 4 2 2 3 3 3 3
221 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 2 0 0 0
0 0 0 0 0 0 0 1 7 1
1 3 2 3 3 3 3 2 4 4
1 3 4 2 3 3 5 4 0 2
3 5 2 3 2 3 3 4 2 3
2 6 0 4 2 3 3 3 4 3
1 3 3 3 5 3 1 3 3 2
如您所见,最大值与我设置为AudioSession
的1ms距离很远。而且iPhone 7更经常出现庞大的数字。
为什么iOS无法顺利调用我的回调?我可以做一些事情,例如设置一些首选项,以获得更平滑的数据吗?
谢谢。
1)首选的缓冲区持续时间只是对OS的建议。大多数情况下,取决于设备型号的硬件功能。当前所有iOS设备均支持256帧。较小的数字可能仅在某些iOS设备型号上有效。但是iOS设备可以为每个音频单元回调自由使用不同的缓冲区大小(因此,持续时间)。有时会这样做(由于电源管理,音频路由更改,硬件启动/停止问题等)
2)音频单元缓冲区回调开始之间的间隔非常一致。延迟问题通常是回调内的代码花费太长时间的结果。您是否遵守所有音频上下文实时规则? (没有长时间的操作,没有Swift,没有Objective C消息传递,没有锁,没有内存管理,没有文件读写,没有UI调用等)