我一直在闲逛AVAudioEngine,并且在集成AVAudioUnitEffect类时遇到问题。例如,使用AVAudioUnitDelay ...

@implementation ViewController {
AVAudioEngine *engine;
AVAudioPlayerNode *player;
}


...

- (IBAction)playButtonHit:(id)sender {
if (!player){
    NSURL *bandsURL = [[NSBundle mainBundle] URLForResource:@"Bands With Managers" withExtension:@"mp3"];
    AVAudioFile *file = [[AVAudioFile alloc] initForReading:bandsURL error:nil];

    engine = [[AVAudioEngine alloc] init];
    player = [[AVAudioPlayerNode alloc] init];
    [engine attachNode:player];

    AVAudioUnitDelay *delay = [[AVAudioUnitDelay alloc] init];
    delay.wetDryMix = 50;

    [engine connect:player to:delay format:file.processingFormat];
    [engine connect:delay to:[engine outputNode] format:file.processingFormat];

    [player scheduleFile:file atTime:nil completionHandler:nil];
    [engine prepare];
    [engine startAndReturnError:nil];
}
[player play];


}

调用该方法时,应用程序崩溃,并且出现以下错误:“ *由于未捕获的异常'com.apple.coreaudio.avfaudio'而终止应用程序,原因:'所需条件为假:[_nodes containsObject:node1] && [_nodes containsObject :node2]'“

我在WWDC的“ AVAudioEngine in Practice”会话中的一些示例之后对此进行建模。我知道我可能遗漏了一些明显的东西,但无法弄清楚...。

最佳答案

这不是AVAudioUnitEffect的问题!我用该代码尝试过

NSError *err = nil;

self.engine = [[AVAudioEngine alloc] init];
AVAudioPlayerNode *player = [[AVAudioPlayerNode alloc] init];
[self.engine attachNode:player];

NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"sound" withExtension:@"m4a"];
AVAudioFile *file = [[AVAudioFile alloc] initForReading:fileURL error:&err];

AVAudioMixerNode *mainMixer = [self.engine mainMixerNode];
[self.engine connect:player to:mainMixer format:file.processingFormat];

[player scheduleFile:file atTime:nil completionHandler:nil];

[self.engine startAndReturnError:&err];

if (err != nil) {
    NSLog(@"An error occured");
}

[player play];


self.engine

@property (nonatomic, strong) AVAudioEngine *engine;


我认为这是AVAudioEngine中的错误,因为它会导致内存泄漏:它开始播放第一个样本,然后由于占用大量内存(在16 kB m4a文件中超过300 MB)而崩溃。



2014年12月7日更新:Apple使用iOS 8 Seed 3(内部版本12A4318c)修复了此问题!

10-01 15:58