2012-03-14 10 views
11

Attualmente sto sviluppando un'applicazione che supporta la registrazione audio in-app. L'utente può ottenere una vista tabella standard dei file audio salvati localmente che ha già registrato tramite l'app, o premere un pulsante per andare a una nuova vista di registrazione, da dove è possibile registrare una nuova sessione audio, che otterrà automaticamente salvato nella sandbox delle app. Ora questa funzione funziona bene la maggior parte del tempo. Posso registrare i nuovi file e riprodurli dalla app, ma a volte casuali del registratore audio mancherò di avviare una registrazione in questo metodo:Il metodo di registrazione di AVAudioRecorder restituisce NO a caso al momento

-(void) startRecording 
{ 
if (!isRecording) 
{ 
    isRecording = YES; 

    BOOL recordingSucess = [audioRecorder record]; 

    if (recordingSucess) 
     NSLog(@"WE STARTED THE RECORDING!"); 
    else 
     NSLog(@"WE DID NOT START THE RECORDING!"); 

    // Start the timer 
    recordTiming = [NSDate date]; 

    timeCheck = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timeCheck) userInfo:nil repeats:YES] 
} 

Cioè, il NSLog stamperà “Non abbiamo iniziato il registrazione ", a indicare che non è stato possibile avviare la registrazione. Ciò si traduce in un file audio vuoto ancora in fase di salvataggio per l'app con una dimensione costante del file di esattamente 4096 byte. Questo è come l'oggetto registratore audio viene inizializzato:

-(id) initWithContentURL:(NSURL *)contentURL 
{ 
self = [super init]; 

if (self) 
{ 
    NSLog(@"Initializing audio recorder!"); 

    // Specific settings for the audio recording 
    NSDictionary *recordSettings = [NSDictionary 
            dictionaryWithObjectsAndKeys: 
            [NSNumber numberWithInt:AVAudioQualityMin], 
            AVEncoderAudioQualityKey, 
            [NSNumber numberWithInt:8], 
            AVEncoderBitRateKey, 
            [NSNumber numberWithInt: 2], 
            AVNumberOfChannelsKey, 
            [NSNumber numberWithFloat:22000.0], 
            AVSampleRateKey, 
            nil]; 

    NSError *error = nil; 

    audioRecorder = [[AVAudioRecorder alloc] initWithURL:contentURL settings:recordSettings error:&error]; 
    audioRecorder.delegate = self; 
} 

C'è anche controlli NSLog che controlla per vedere se l'errore è nullo o no, quindi a questo punto sono sicuro che l'inizializzazione non sembra fallire. Che cosa esattamente potrebbe causare il fallimento del metodo di registrazione in momenti apparentemente casuali, mentre funziona perfettamente bene nella maggior parte delle altre volte?

risposta

23

Prima che la registrazione viene avviata una sessione audio deve essere inizializzato:

AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
NSError *err = nil; 
[audioSession setCategory :AVAudioSessionCategoryPlayAndRecord error:&err]; 
if(err){ 
    NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]); 
    return; 
} 
err = nil; 
[audioSession setActive:YES error:&err]; 
if(err){ 
    NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]); 
    return; 
} 

Vedi l'accettato answer per riferimento.

+0

Ci proverò e tornerò. Basta testarlo abbastanza a lungo per assicurarci che il bug scompaia – Luffen

+0

Questo ha funzionato, grazie! :) – Luffen

+0

@Luffen è contento che aiuti. Per quanto riguarda il 4096, suppongo che sia una parte di intestazione di un file multimediale che è stata scritta sul disco come preparazione, ma la registrazione è fallita e la parte di dati del file non è stata riempita. –

0

Il contentURL è sempre lo stesso o ne viene generato uno ogni volta?

Inoltre, potresti provare a chiamare esplicitamente prepareToRecord prima di registrare e verificare se ha esito positivo o meno?

Problemi correlati