AVAudioPlayer и AVAudioRecorder: методы делегата не вызываются - PullRequest
4 голосов
/ 05 июля 2011

Мои методы-делегаты audioRecorderDidFinishRecording и audioPlayerDidFinishPlaying не вызываются.Эти методы должны запускать метод 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 ]

3 голосов
/ 05 июля 2011

Ваш код настройки делегата выглядит нормально.

Предполагаете ли вы, что методы-делегаты вызываются не только потому, что анимация не останавливается, либо вы пытались напрямую регистрировать / прерывать методы?Если вы не тестировали напрямую, сделайте это, прежде чем работать, предполагая, что это не так.

Если вы подтвердили, что их не вызывают, скорее всего, ваша анимация связывает объект self так, что он не может отвечать на методы делегирования AV.

Закомментируйте анимацию и просто поместите журнал в методы делегата AV, чтобы увидеть, вызваны ли они.

2 голосов
/ 05 июля 2011

Попробуйте передать параметр ошибки, чтобы убедиться, что объект вашего рекордера создается правильно.

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]);
}
1 голос
/ 02 января 2014

Проверьте текущую категорию AVAudioSession.Если для категории не задано значение AVAudioSessionRecord или AVAudioSessionPlayAndRecord, устройство записи не будет работать, и ни один из его методов делегата не будет вызван.Категория AVAudioSession может быть изменена с помощью setCategory: error: метод.Например:

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