2012-03-14 14 views
11

Actualmente estoy desarrollando una aplicación que admite la grabación de audio en la aplicación. El usuario puede obtener una vista de tabla estándar de los archivos de audio guardados localmente que ya ha grabado a través de la aplicación, o presionar un botón para ir a una nueva vista de grabación, desde donde es posible grabar una nueva sesión de audio, que automáticamente obtendrá guardado en la zona de pruebas de la aplicación. Ahora esta función funciona bien la mayor parte del tiempo. Puedo grabar nuevos archivos y reproducirlos desde la aplicación, pero a veces al azar el grabador de audio no se podrá iniciar una grabación en este método:AVAudioRecorder El método de registro devuelve NO en momentos aleatorios

-(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] 
} 

Es decir, el NSLog imprimirá “No empezamos la grabación ", lo que indica que no pudo iniciar la grabación. Esto da como resultado que un archivo de audio vacío se esté guardando en la aplicación con un tamaño de archivo constante de exactamente 4096 bytes. Esto es cómo se inicializa el objeto grabador de audio:

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

También hay controles NSLog que comprueba si el error es nulo o no, por lo que en este punto estoy seguro de que la inicialización no parece fallar. ¿Qué podría hacer exactamente que el método de grabación falle en tiempos aparentemente aleatorios, mientras que funciona perfectamente bien en la mayoría de los casos?

Respuesta

23

antes de iniciar la grabación de una sesión de audio debe ser inicializado:

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

Véase el answer aceptado para su referencia.

+0

Voy a intentar esto y volver. Solo necesito probarlo el tiempo suficiente para asegurarme de que el error desaparezca – Luffen

+0

¡Esto funcionó, gracias! :) – Luffen

+0

@Luffen Me alegra que ayude. En cuanto al 4096, supongo que es una parte del encabezado de un archivo multimedia que se ha escrito en el disco como preparación, pero la grabación falló y la parte de datos del archivo no se llenó. –

0

¿El contenido es siempre el mismo o se genera uno nuevo cada vez?

¿Podría intentar explícitamente llamar a prepareToRecord antes de grabar y verificar si tiene éxito o no?

Cuestiones relacionadas