Почему не удается инициализировать AVAudioPlayer? С ошибкой OSStatus 1685348671?

#ios #avaudioplayer #avaudiorecorder #avaudiosession

#iOS #avaudioplayer #avaudiorecorder #avaudiosession

Вопрос:

Я записываю звук в контроллере просмотра (голосовая заметка). Это работает. Я могу воспроизводить записанный звук до тех пор, пока пользователь не отключит контроллер просмотра.

Однако, если пользователь отключает view controller и снова открывает view controller, инициализация AVAudioPlayer завершается ошибкой OSStatus 1685348671.

Я также пытался инициализировать проигрыватель с помощью NSData:
NSData *data = [[NSData alloc] initWithContentsOfURL:_outputFileURL];
_player = [[AVAudioPlayer alloc] initWithData:data error:amp;error2];
, но это тоже не сработало

Я пробовал .caf, следил за каждым руководством, но почему-то я не могу заставить его работать… Похоже, эта ошибка относится к недопустимому файлу или около того, хотя я не уверен. Однако, если я загружу приложение в органайзер и открою его на своем Mac, я смогу его воспроизвести, поэтому сам файл не поврежден.

Вот мой метод записи:

 - (IBAction)recordPauseTapped:(id)sender {
    // Stop the audio player before recording
    if (_player.playing) {
        [_player stop];
    }
    if (!_recorder.recording) {
        AVAudioSession *session = [AVAudioSession sharedInstance];
        [session setActive:YES error:nil];

        // Start recording
        [_recorder record];
        [recordPauseButton setTitle:@"Pause" forState:UIControlStateNormal];

    } else {

    // Pause recording
        [_recorder pause];
        [recordPauseButton setTitle:@"Aufnahme" forState:UIControlStateNormal];
    }

    [stopButton setEnabled:YES];
    [playButton setEnabled:NO];
 }
  

Запись работает, и файл существует в каталоге Documents.

Вот мой метод воспроизведения, который работает, если файл был записан непосредственно перед этим, без выхода пользователя из контроллера просмотра:

 - (IBAction)playTapped:(id)sender {
    if (!_recorder.recording){

        AVAudioSession *audioSession = [AVAudioSession sharedInstance];
        [audioSession setActive:YES error:nil];

        NSError *error;
        BOOL success = [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:amp;error];
        if(!success)
        {
            NSLog(@"error doing outputaudioportoverride - %@", [error localizedDescription]);
        }

        NSError *error2;
        NSLog(@"_outputFileURL: %@", _outputFileURL);

        _player = [[AVAudioPlayer alloc] initWithContentsOfURL:_outputFileURL error:amp;error2];
        if (error2) {
            NSLog(@"error initialising player - %@", [error2 localizedDescription]);
         }
        [_player setDelegate:self];
        [_player play];
    }
}
  

И вот мой viewDidLoad:

 - (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationController.navigationBar.translucent = NO;

    [stopButton setEnabled:NO];

    // Set the audio file
    if ([_audioFileName isEqualToString:@""]) {
        NSString *guid = [[NSUUID new] UUIDString];
        _audioFileName = [NSString  stringWithFormat:@"audio-%@.m4a", guid];
        [playButton setEnabled:NO];
    } else {
        [playButton setEnabled:YES];
    }
    NSLog(@"_audioFileName: %@", _audioFileName);
    NSArray *pathComponents = [NSArray arrayWithObjects:
                           [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject],
                           _audioFileName,
                           nil];
    _outputFileURL = [NSURL fileURLWithPathComponents:pathComponents];

    // Setup audio session
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
    [session setActive:YES error:nil];

    // Define the recorder setting
    NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];

    [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
    [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
    [recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];

    // Initiate and prepare the recorder
    _recorder = [[AVAudioRecorder alloc] initWithURL:_outputFileURL settings:recordSetting error:nil];
    _recorder.delegate = self;
    _recorder.meteringEnabled = YES;
    [_recorder prepareToRecord];
}
  

Ответ №1:

Ваша проблема в том, что у вас есть [_recorder prepareToRecord]; в viewLoad, что означает, что он будет перезаписываться каждый раз, когда вы загружаете view controller. Если вы не хотите такого поведения, вам следует удалить эту строку и поместить ее, например, в начало recordPauseTapped. Это должно устранить ваши проблемы.