Pregunta

He creado una aplicación de prueba para el iPhone. Escribí el siguiente código para grabar. Pero no está trabajando.


-(IBAction)start:(id)sender{
    recordSetting = [[NSMutableDictionary alloc] init];
    [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
    [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
    [recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
    [recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
    [recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    soundsDirectoryPath = [documentsDirectory stringByAppendingPathComponent:@"Sounds"];
    [[NSFileManager defaultManager] createFileAtPath:[NSString stringWithFormat:@"%@/Test.caf", soundsDirectoryPath] contents:nil attributes:nil];

    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/Test.caf", soundsDirectoryPath]];
    NSError *err = nil;
    if([recorder isRecording])
    {
        [recorder stop];
        recorder = nil;
    }
    recorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:&err];
    [recorder setDelegate:self];
    recorder.meteringEnabled = YES;
    if(err){
        NSLog(@"Error : %@", [err description]);
    }
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    BOOL audioHWAvailable = audioSession.inputIsAvailable;
    if (! audioHWAvailable) {
        UIAlertView *cantRecordAlert =
        [[UIAlertView alloc] initWithTitle: @"Warning"
                                   message: @"Audio input hardware not available"
                                  delegate: nil
                         cancelButtonTitle:@"OK"
                         otherButtonTitles:nil];
        [cantRecordAlert show];
        [cantRecordAlert release]; 
        return;
    }
    BOOL st = [recorder prepareToRecord];
    if(!st){
        NSLog(@"Failed");
    }
    recorder.meteringEnabled = YES;
    BOOL status = [recorder record];
    if(!status)
    NSLog(@"Failed");
}

-(IBAction)stop:(id)sender{
    if([recorder isRecording]){
        NSLog(@"Recording...");
    }else{
        NSLog(@"Not recording...");
    }
    [recorder stop];
}

Cuando llamo "start" método, que es la impresión "Error" después de llamar "prepareToRecord" y "Record" métodos.

Cuando llamo método "parada", se está imprimiendo "No grabación ..." mensaje.

¿Qué error que he hecho en este código.

Gracias.

¿Fue útil?

Solución

Sobre la base de la información adicional que ya ha proporcionado en los comentarios de interrogación, parece que hay un problema al crear el archivo asociado con la grabadora. Esto se indica por el valor NO devuelto por el método prepareToRecord.

Una cosa a destacar es que prepareToRecord crea el archivo de grabación por su cuenta, utilizando la URL suministrada en el método de init AVAudioRecorder. No hay necesidad de crear de forma explícita, ya que no utiliza NSFileManager.

Trate de registrar la soundsDirectoryPath, y asegúrese de que se trata de una ruta de archivo válida.

EDITAR: Encontrado el problema real. Es necesario crear el directorio antes de que se creó el archivo. Reemplazar esta línea:

[[NSFileManager defaultManager] createFileAtPath:[NSString stringWithFormat:@"%@/Test.caf", soundsDirectoryPath] contents:nil attributes:nil];

Con éste:

[[NSFileManager defaultManager] createDirectoryAtPath:soundsDirectoryPath withIntermediateDirectories:YES attributes:nil error:NULL];

La nueva línea sólo crea el directorio y no el archivo, pero que está bien porque el método prepareToRecord crea el archivo automáticamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top