#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. Это должно устранить ваши проблемы.