2013-03-29 1 views
1

Этот код работал, но когда я перешел на iOS 6, он остановил поддержку mp4.AVAudioRecorder записывает неверный файл?

готовлюсь написать

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *docsDir = [dirPaths objectAtIndex:0]; 
NSString *soundFilePath = [docsDir stringByAppendingPathComponent:@"Temp.mp4"]; 
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath]; 
NSDictionary *recordSettings = [[NSDictionary alloc] initWithObjectsAndKeys: 
           [NSNumber numberWithFloat: 32000], AVSampleRateKey, 
           [NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey, 
           [NSNumber numberWithInt: 1], AVNumberOfChannelsKey, 
           nil]; 
NSError *error = nil; 
self.audioRecorder = nil; 
AVAudioRecorder *audioRecorderBuffer = [[AVAudioRecorder alloc] 
             initWithURL:soundFileURL 
             settings:recordSettings 
             error:&error]; 
self.audioRecorder = audioRecorderBuffer; 
self.audioRecorder.delegate = self; 
if (error) 
    NSLog(@"error: %@", [error localizedDescription]); 
else 
    [self.audioRecorder prepareToRecord]; 

затем записать, STO, сохраните его, и когда я пытаюсь играть:

_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:_audioURL error:&error]; 
_audioPlayer.delegate = self; 
if (error) 
    NSLog(@"Error: %@", [error localizedDescription]); 
else { 
    [_audioPlayer prepareToPlay]; 
    if (![_audioPlayer play]) { 
     NSLog(@"Play Error: %@", error); 
    } 
} 

я получаю и ошибка:

Ошибка: Операция не мог» t будет завершено. (Ошибка OSStatus 1685348671.)

Код работает в несжатом формате. Сжатый mp4 работает на iPhone 4 с прошивкой 6, работал также на iPhone 4S с прошивкой 5.x, но не работает на iPhone 4S, ни Iphone 5 с прошивкой 6.

AVAudioRecorder записи и записывает файл, то AVAudioPlayer имеет Ошибка Ошибка: операция не может быть завершена. (Ошибка OSStatus 1685348671.). В документации указано, что формат файла поврежден.

Любые идеи?

+0

У меня точно такая же проблема. Он завершает запись, но файлы не воспроизводятся. Есть комментарии? – KiNG

ответ

0

Попробуйте добавить следующее перед [self.audioRecorder prepareToRecord]

AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryRecord error:nil]; 
[session setActive:YES error:nil]; 

Проверить эту question/answer

0

Я только имел очень похожий вопрос с поврежденными файлами - для меня это сводилось к тому, что те, кто не мог Запись не запретила доступ к микрофону. Это означало, что prepareToRecord работал (и обрезал файл), и record сообщал, что он работает, но на самом деле он ничего не записывал.

Этот код (скоро не Objective-C) получает состояние разрешения:

let val : AVAudioSessionRecordPermission = AVAudioSession.sharedInstance().recordPermission() 
switch(val){ 
case AVAudioSessionRecordPermission.Undetermined : 
    print("permission undetermined") 
    break 
case AVAudioSessionRecordPermission.Denied : 
    print("permission denied") 
    break 
case AVAudioSessionRecordPermission.Granted : 
    print("permission granted") 
    break 
default : 
    print("permission unknown") 
    break 
} 

И я использовал это, когда я хочу, чтобы записать:

AVAudioSession.sharedInstance().requestRecordPermission({(granted: Bool)-> Void in 
    if granted { 
     self.internalRecorder.prepareToRecord() 
     self.internalRecorder.record() 
    } else { 
     // can't record - update UI 
    } 
}) 

Надеется, что это экономит кого-то некоторое время, если они сталкиваются с той же проблемой.