2010-04-20 10 views
6

To jest moja metoda:AVAudioRecorder nie odnotuje On Device

-(void) playOrRecord:(UIButton *)sender { 
    if (playBool == YES) { 
     NSError *error = nil; 
     NSString *filePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat: @"%d", [sender tag]] ofType:@"caf"]; 
     NSURL *fileUrl = [NSURL fileURLWithPath:filePath]; 
     AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileUrl error:&error]; 
     [player setNumberOfLoops:0]; 
     [player play];  
    } 
    else if (playBool == NO) { 
     if ([recorder isRecording]) { 
      [recorder stop]; 
      [nowRecording setImage:[UIImage imageNamed:@"NormalNormal.png"] forState:UIControlStateNormal]; 
      [nowRecording setImage:[UIImage imageNamed:@"NormalSelected.png"] forState:UIControlStateSelected]; 
     } 
     if (nowRecording == sender) { 
     nowRecording = nil; 
     return; 
     } 
     nowRecording = sender; 
     NSError *error = nil; 
     NSString *filePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat: @"%d", [sender tag]] ofType:@"caf"]; 
     NSURL *fileUrl = [NSURL fileURLWithPath:filePath]; 
     [sender setImage:[UIImage imageNamed:@"RecordingNormal.png"] forState:UIControlStateNormal]; 
     [sender setImage:[UIImage imageNamed:@"RecordingSelected.png"] forState:UIControlStateSelected];   
     recorder = [[AVAudioRecorder alloc] initWithURL:fileUrl settings:recordSettings error:&error]; 
     [recorder record]; 
    } 
} 

Większość z nich jest oczywista; playBool to BOOL, który jest TAK, gdy jest w trybie odtwarzania. Wszystko działa w symulatorze, ale gdy uruchomię go na urządzeniu, [rekord rejestratora] zwraca NIE. Czy ktoś ma pojęcia, dlaczego tak się dzieje?

Odpowiedz

3

Ok, rozwiązałem moje własne pytanie; Nie wiem dlaczego, ale muszę nagrywać do NSTemporaryDirectory na urządzeniu. Zmiana całkowicie to naprawiła.

+0

ponieważ nie możesz zmienić pakietu aplikacji !!! lol –

4

Jest tak, ponieważ nie można zmodyfikować pakietu aplikacji na urządzeniu (jest on podpisany). Możesz nagrywać do folderu docs dla swojej aplikacji lub do katalogu tmp.

1

Miałem dokładnie ten sam problem. Okazuje się, że natknąłem się na nieprawidłowo wygenerowaną instrukcję ścieżki. AVAudioRecorder zainicjował grzywnę - i bez incydentów - ale iOS po prostu nie pozwolił mi na nią pisać. Czemu? Sprawdź to:

/* The following code will fail - why? It fails because it is trying to write some path that is NOT accessible by 
    this app. 
NSString *recordedAudioPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 
           objectAtIndex:0] 
           stringByAppendingString:@"recorded.caf"]; 
*/ 
// Correction: 
NSString *recordedAudioPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 
           objectAtIndex:0]; 

recordedAudioPath = [recordedAudioPath stringByAppendingPathComponent:@"recorded.caf"]; 
NSURL *recordURL = [NSURL fileURLWithPath:recordedAudioPath]; 

To ma teraz sens. Dziękuję za kierowanie mną we właściwym kierunku.

+0

Wyglądają dokładnie tak samo ... – Gu1234

+0

Różnica polega na tym, że komponent ścieżki zostanie dodany w razie potrzeby. To zasadniczo dodaje/przed recorded.caf Dotychczasowy 'niepoprawny' kod będzie pracował jeśli użył: NSString * recordedAudioPath = [[NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask YES) objectAtIndex: 0] stringByAppendingString: @ "/ recorded.caf "]; –

17

Jeśli gdziekolwiek w kodzie masz takiej konfiguracji:

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

go zmienić na:

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

Ustawianie złą kategorię AVAudioSession spowoduje zapis/odtwarzanie na niepowodzenie.

1

Ponadto, upewnij się, że aplikacja ma dostępu do mikrofonu (czyli w ustawieniach iOS, przewiń w dół i znaleźć aplikację, i powinien mieć „Mikrofon”, które trzeba przejść na „on”)

+0

Co? Ten problem, który próbowałem usunąć przez dwa dni, nie mógł być czymś tak prostym, oczywiście to urządzenie ma uprawnienia mikrofonu, zobacz ... Och, to było to. Urządzenie/symulator całkowicie czerwony śledzia. iOS powinien przynajmniej zarejestrować błąd, a nie po cichu. Dzięki, czasami jest to coś tak podstawowego. –

Powiązane problemy