我正在编写一个基于音频单元(远程IO)的应用程序,显示给定缓冲区大小的波形。这个应用程序最初的首选缓冲区大小是0.0001,这导致了非常小的缓冲区帧大小(我认为它是14帧)。在运行时,我有一个UI元素,它允许通过AVAudioSession的setPreferredIOBufferDuration:Error:方法切换缓冲区帧大小。
下面的代码将前两种情况从较小的缓冲区更改为较大的缓冲区。3-5尚未指定。但该应用程序在AudioUnitRender上崩溃,错误代码为-50。
- (void)setBufferSizeFromMode:(int)mode {
NSTimeInterval bufferDuration;
switch (mode) {
case 1:
bufferDuration = 0.0001;
break;
case 2:
bufferDuration = 0.001;
break;
case 3:
bufferDuration = 0.0; // reserved
break;
case 4:
bufferDuration = 0.0; // reserved
break;
case 5:
bufferDuration = 0.0; // reserved
break;
default:
break;
}
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError * audioSessionError = nil;
[session setPreferredIOBufferDuration:bufferDuration error:&audioSessionError];
if (audioSessionError) {
NSLog(@"Error %ld, %@",
(long)audioSessionError.code, audioSessionError.localizedDescription);
}
}通过阅读CoreAudio和AVFoundation文档,我相信可以在运行时更改音频硬件配置。可能会有一些音频或失真的差距,但我现在很好。这种崩溃有明显的原因吗?或者我必须重新初始化所有东西(我的音频会话、音频单元、音频缓冲区等)。对于缓冲区持续时间的每一次更改?
编辑:我尝试过在更改会话缓冲区持续时间之前调用AudioOutputUnitStop(self.myRemoteIO);,然后在设置它之后再次启动。我还尝试将会话设置为非活动,然后将其重新激活,但两者都会在AU输入回调中使用来自AudioUnitRender()的-50 OSStatus。
发布于 2016-02-16 11:13:24
-50错误通常表示音频单元代码试图设置或使用无效参数值。
某些iOS设备不支持实际缓冲持续时间低于5.3 mS (或在较旧的设备上为0.0058秒)。而且iOS设备似乎可以自由地切换到比这个时间长4倍的实际缓冲时间,甚至可以切换到略有不同的值,有时不在应用程序的控制之下。
inNumberFrames被作为参数提供给音频单元回调,您的应用程序不能任意指定该值。
如果你想处理给定的缓冲区大小,可以把它们从一个中间的无锁循环FIFO中提取出来,音频单元回调可以将它们输入到这个循环FIFO中。
另外:尝试在调用audio stop之后等待一秒钟左右,然后再更改参数或重新启动。在调用stop时和硬件实际停止时之间似乎存在延迟。
https://stackoverflow.com/questions/35421190
复制相似问题