2012-03-14 8 views
14

In un'app che sto attualmente sviluppando, ho più o meno colpito un muro di mattoni. Nell'applicazione è possibile inserire una vista che elenca tutti i file audio salvati localmente in una vista tabella standard. Da qui puoi fare clic su di essi per riprodurli o premere un pulsante di registrazione qui sotto per creare una nuova registrazione, che verrà automaticamente salvata nella sandbox delle app.Corruzione apparentemente casuale di file usando AVAudioRecorder (A volte il file non può essere riprodotto) - iOS

Ora tutto funziona perfettamente, il più delle volte. Posso sedermi e fare registrazioni e riprodurle. Posso sedermi e testare questo e quello per circa 45 senza alcun problema. Poi all'improvviso, a volte casuali, colpirò un problema molto strano. Il problema è che il registratore all'improvviso inizia a salvare solo file corrotti che non possono essere riprodotti e hanno una dimensione di 4096 byte, indipendentemente dalla durata della registrazione.

Io uso l'AVAudioRecorder in modo del tutto normale, la sua creazione come questo:

// 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; 

comincio la registrazione in questo modo:

if (!isRecording) { 
    isRecording = YES; 
    [audioRecorder record]; 

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

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

E poi fermarla con questo:

if (isRecording) { 
    [audioRecorder stop]; 

    // Stop the timer 
    [timeCheck invalidate]; 
} 

Non ho idea di cosa potrebbe causare questo problema. Finora ho provato quasi tutto. Ho verificato che l'oggetto del registratore sia riciclato correttamente (quindi hai una nuova istanza per ciascuna registrazione) e che il vecchio riferimento è deallocato e così via, per assicurarti che non abbia nulla a che fare con gli oggetti interferenti, ma niente lo risolve.

C'è qualcuno che ha una leggera idea di cosa potrebbe causare problemi con i file danneggiati?

+1

Quindi lei sta dicendo la variabile errore è sempre pari a zero dopo Audiorecorder viene inizializzato, giusto? –

+0

Sì, corretto :) In realtà ho alcuni controlli di errore rapidi di seguito per NSLog per assicurarmi che sia inizializzato correttamente e che NSError sia nullo e così via. – CodingBeagle

+0

Capito, miglioriamo il tuo codice allora, il problema dovrebbe probabilmente diventare ovvio o scomparire. Invece di utilizzare isRecording var, è possibile utilizzare una registrazione di proprietà audioRecorder; non riesco a vedere l'inizializzazione della sessione audio ma probabilmente l'hai omessa. Comunque ti suggerirei anche di migliorare la gestione degli errori, la risposta sotto potrebbe essere usata come riferimento: http://stackoverflow.com/questions/1010343/how-do-i-record-audio-on-iphone-with -avaudiorecorder –

risposta

6

Nota: Poiché l'OP è inattivo per alcuni giorni e suppongo che questa domanda debba essere risolta per riferimento futuro del pubblico, quindi postare questa risposta.

È necessario ottenere AVAudioSession prima di iniziare la registrazione.

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; 
} 

Riferimento: https://stackoverflow.com/a/9706731/188331

+0

Questo era davvero il problema :) È passato un po 'di tempo da quando ho controllato le mie domande più vecchie, quindi mi dispiace, ma questa è davvero la soluzione al problema. – CodingBeagle