AVAudioPlayer和AVAudioRecorder:未调用的委托方法

时间:2011-07-05 07:32:30

标签: iphone ios4 delegates avaudioplayer avaudiorecorder

我的委托方法audioRecorderDidFinishRecordingaudioPlayerDidFinishPlaying未被调用。这些方法应该触发一个'stopanimation`方法,在完成录制后停止动画。

我在stopanimation结束时拨打了audioPlayerDidFinishPlaying方法的电话。

以下是分配代表的相关代码:

   VoiceEditor.h

    @interface VoiceEditor : UIViewController <UITextFieldDelegate, AVAudioRecorderDelegate, AVAudioPlayerDelegate>{    
}

VoiceEditor.m

- (void)record{
    recorder = [[AVAudioRecorder alloc] initWithURL:[NSURL fileURLWithPath:pathString] settings:recordSettings error:nil];
    [recorder setDelegate:self];
    [recorder record];
    recording = YES;        
    [pauseButton setImage:[UIImage imageNamed:@"stop.png"] forState:UIControlStateNormal];
    [pauseButton setEnabled:YES];
    [playButton setEnabled:NO];
    [recordButton setEnabled:NO];  
    [self beginAnimation];
}

- (void)play{              
    player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:pathString] error:nil];
    double seconds=[player duration];
    NSLog(@"%f",seconds);
    [player setDelegate:self];
    [player play];
    playing = YES;              
    [recordButton setEnabled:NO];
    [pauseButton setEnabled:YES];
    [playButton setEnabled:NO];     
    [self beginAnimation];
}

3 个答案:

答案 0 :(得分:3)

设置委托的代码看起来很好。

您是否假设仅调用委托方法,因为动画未停止或您是否尝试直接记录/断开方法?如果你没有直接测试,那么在假设它们不是这样做之前。

如果您确认他们没有被调用,那么很可能是您的动画占用self对象,使其无法响应AV委托方法。

注释掉动画,只需在AV委托方法中输入一个日志,看看它们是否被调用。

答案 1 :(得分:2)

尝试传递error参数以确保正确创建记录器对象。

NSError *err=nil;
recorder = [[AVAudioRecorder alloc] initWithURL:[NSURL fileURLWithPath:pathString] settings:recordSettings error:&err];
if(!recorder){
    NSLog(@"recorder: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
}

答案 2 :(得分:1)

检查当前的AVAudioSession类别。如果类别未设置为AVAudioSessionRecord或AVAudioSessionPlayAndRecord,则录像机将无法工作,并且不会调用其任何委托方法。可以使用setCategory:error:方法更改AVAudioSession类别。例如:

NSError *sessionCategoryError = nil;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
BOOL success = [audioSession setCategory: AVAudioSessionCategoryPlayAndRecord
                                   error: &sessionCategoryError];