Вопрос по ios – iOS - Воспроизведение записанного аудио завершается с ошибкой OSStatus -43 (файл не найден)

5

Я установил экземпляр AVAudioRecorder следующим образом при загрузке моего представления:

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
audioSession.delegate = self;
[audioSession setActive:YES error:nil];
[audioSession setCategory:AVAudioSessionCategoryRecord error:nil];

NSString *tempDir = NSTemporaryDirectory();
NSString *soundFilePath = [tempDir stringByAppendingPathComponent:@"sound.m4a"];

NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
NSLog(@"%@", soundFileURL);

NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                [NSNumber numberWithInt:kAudioFormatMPEG4AAC], AVFormatIDKey,
                                [NSNumber numberWithInt:AVAudioQualityMin], AVEncoderAudioQualityKey,
                                [NSNumber numberWithInt:16], AVEncoderBitRateKey,
                                [NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
                                [NSNumber numberWithFloat:8000.0], AVSampleRateKey,
                                [NSNumber numberWithInt:8], AVLinearPCMBitDepthKey,
                                nil];

NSError *error = nil;

self.recorder = [[AVAudioRecorder alloc]
                 initWithURL:soundFileURL
                 settings:recordSettings
                 error:&error];
self.recorder.delegate = self;

if (error) {
    NSLog(@"error: %@", [error localizedDescription]);
} else {
    [self.recorder prepareToRecord];
}

Затем, когда пользователь нажимает кнопку записи, я делаю:

- (IBAction)record:(id)sender {
    if (!self.isRecording) {
        self.isRecording = YES;
        [self.recorder record];
        self.recordButton.enabled = NO;
    }
}

Затем, чтобы остановить запись / воспроизведение:

- (IBAction)stop:(id)sender {
    if (self.isRecording) {
        [self.recorder stop];
        self.recordButton.enabled = YES;
        self.isRecording = NO;
    }

    if (self.isPlaying) {
        [self.player stop];
        self.isPlaying = NO;
        self.playButton.enabled = YES;
    }
}

После этого я хочу воспроизвести записанное, поэтому я делаю следующее:

- (IBAction)play:(id)sender {
    NSError *error = nil;
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:self.recorder.url error:&error];
    self.player.delegate = self;

    if (error) {
        NSLog(@"%@", error.localizedDescription);
    } else {
        self.isPlaying = YES;
        [self.player play];
        self.playButton.enabled = NO;
    }
}

Но когда я иду и играть в файл получитьOSStatus error -43 файл не найден.

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

EDIT 1: Я решил проблему ошибки OSStatus -43, это как-то связано с форматом кодирования, я закомментировал формат, и он правильно записал и воспроизвел файл, но мне нужно записать в сжатом формате. Кто-нибудь знает настройки для этого?

EDIT 2: Мне удалось найти настройки, которые работали для сжатого аудио AAC. 2-минутный аудиофайл выходит на 256 КБ, я обновил свой код, чтобы отразить текущее состояние. Спасибо всем, кто ответил за вашу помощь.

Да, позвольте мне отредактировать мой код 8vius
Может быть, этот файл все еще используется рекордером и, следовательно, недоступен для чтения? (просто удар в темноте, хотя) Till
Извините, если я немного ошибаюсь с этим, поскольку я едва использовал какие-либо классы, связанные со звуком, но есть ли[self.player prepareToPlay]? Bo A
Я полагаю, что в таком случае это приведет к ошибкам, и когда я остановлюсь, рекордер остановится, поэтому я сильно сомневаюсь в этом. 8vius
И вы звоните [self.recorder stop] правильно? Bo A

Ваш Ответ

4   ответа
0

ДелатьNSURL *soundFileURL глобальный для вашего класса, так что вы можете получить к нему доступ в любом месте вашего класса и установить так же, как сейчас (за исключениемsoundFileURL = [NSURL fileURLWithPath:soundFilePath]; вместоNSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];.

Тогда измени это

self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:self.recorder.url error:&error];

к этому

self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:&error];
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded 8vius
Error: User Rate Limit Exceeded 8vius
7

потому что никто больше не ответил (РЕДАКТИРОВАТЬ: теперь есть) (У меня нет большого опыта работы с аудио в iOS), но ...

Попробуйте изменить

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil];

в

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
Error: User Rate Limit Exceeded 8vius
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded 8vius
2

AVEncoderBitRateKey не работает сAAC Формат кодирования. Попробуйте этот код.

NSLog(@"%@", soundFileURL);

 NSDictionary *recordSettings = [NSDictionary 
                                        dictionaryWithObjectsAndKeys:
                                        [NSNumber numberWithInt:kAudioFormatMPEG4AAC],
                                        AVFormatIDKey,
                                        [NSNumber numberWithInt: AVAudioQualityMax],
                                        AVEncoderAudioQualityKey,
                                        [NSNumber numberWithInt: 1], 
                                        AVNumberOfChannelsKey,
                                        [NSNumber numberWithFloat:44100.0], 
                                        AVSampleRateKey,
                                        nil];
NSError *error = nil;

self.recorder = [[AVAudioRecorder alloc]
                 initWithURL:soundFileURL
                 settings:recordSettings
                 error:&error];
self.recorder.delegate = self;

if (error) {
    NSLog(@"error: %@", [error localizedDescription]);
    NSLog(@"error: %@", [error description]);
} else {
    [self.recorder prepareToRecord];
} 

EDIT 1:

OSStatus error -43 file not found это не проблема симулятора. Это журнал ошибок, который показывает вашrecording settings are not correct и требуетсяencoding format is not supported for the settings you have selected.

Когда вы получите эту ошибку, ваш файл будет создан в том формате, который вы указали. Но это будетnot initialize your audio recorder to start recording, Если у вас есть какие-либо сомнения, выберите те же настройки, которые были у вас в первом вопросе, и запишите и попробуйте воспроизвести их. Он не будет записывать и воспроизводить из-за неподдерживаемой настройки.

Так что дляcompressed encoding formatВы можете использовать настройки, как я дал выше в моем коде. Вы можете иметь.aac Формат для этой настройки. Это займет164KB per 10 seconds to record in aac формат. Для остальных форматов вы должны попытаться выяснить.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

режим воспроизведения:

NSError *_error = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&_error];

if (_error) {
    // handle error here
}

Это также должно устранить проблему, при которой звук не будет воспроизводиться при включенном переключателе отключения звука.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded 8vius

Похожие вопросы