¿Cómo grabo audio en un iPhone con AVAudioRecorder?

Ahora que iPhone 3.0 sdk es público, creo que puedo hacer esta pregunta para aquellos de ustedes que ya han estado jugando con la sdk 3.0. Quiero grabar audio en mi aplicación, pero quiero usar AVAudioRecorder y no la forma más antigua de grabar como muestra el ejemplo de SpeakHere. No hay ejemplos de cómo hacer mejor esto en el Centro de desarrollo de iPhone y solo hacer referencia a las clases. Soy un novato en el desarrollo de iPhone, así que estoy buscando una muestra simple para comenzar. Gracias por adelantado.

En realidad, no hay ejemplos en absoluto. Aquí está mi código de trabajo. La grabación se activa cuando el usuario presiona un botón en la barra de navegación. La grabación utiliza calidad cd (44100 muestras), estéreo (2 canales) lineal pcm. Cuidado: si desea utilizar un formato diferente, especialmente uno codificado, asegúrese de comprender completamente cómo configurar los ajustes de AVAudioRecorder (lea atentamente la documentación de los tipos de audio); de lo contrario, nunca podrá inicializarlo correctamente. Una cosa más. En el código, no estoy mostrando cómo manejar los datos de medición, pero puedes averiguarlo fácilmente. Finalmente, tenga en cuenta que el método AVAudioRecorder deleteRecording a partir de este escrito bloquea su aplicación. Es por eso que estoy eliminando el archivo grabado a través del Administrador de archivos. Cuando se realiza la grabación, guardo el audio grabado como NSData en el objeto editado actualmente usando KVC.

#define DOCUMENTS_FOLDER [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] - (void) startRecording{ UIBarButtonItem *stopButton = [[UIBarButtonItem alloc] initWithTitle:@"Stop" style:UIBarButtonItemStyleBordered target:self action:@selector(stopRecording)]; self.navigationItem.rightBarButtonItem = stopButton; [stopButton release]; 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; } [audioSession setActive:YES error:&err]; err = nil; if(err){ NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]); return; } recordSetting = [[NSMutableDictionary alloc] init]; [recordSetting setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey]; [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; [recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey]; [recordSetting setValue :[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; [recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; [recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey]; // Create a new dated file NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0]; NSString *caldate = [now description]; recorderFilePath = [[NSString stringWithFormat:@"%@/%@.caf", DOCUMENTS_FOLDER, caldate] retain]; NSURL *url = [NSURL fileURLWithPath:recorderFilePath]; err = nil; recorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:&err]; if(!recorder){ NSLog(@"recorder: %@ %d %@", [err domain], [err code], [[err userInfo] description]); UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Warning" message: [err localizedDescription] delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; return; } //prepare to record [recorder setDelegate:self]; [recorder prepareToRecord]; recorder.meteringEnabled = YES; 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; } // start recording [recorder recordForDuration:(NSTimeInterval) 10]; } - (void) stopRecording{ [recorder stop]; NSURL *url = [NSURL fileURLWithPath: recorderFilePath]; NSError *err = nil; NSData *audioData = [NSData dataWithContentsOfFile:[url path] options: 0 error:&err]; if(!audioData) NSLog(@"audio data: %@ %d %@", [err domain], [err code], [[err userInfo] description]); [editedObject setValue:[NSData dataWithContentsOfURL:url] forKey:editedFieldKey]; //[recorder deleteRecording]; NSFileManager *fm = [NSFileManager defaultManager]; err = nil; [fm removeItemAtPath:[url path] error:&err]; if(err) NSLog(@"File Manager: %@ %d %@", [err domain], [err code], [[err userInfo] description]); UIBarButtonItem *startButton = [[UIBarButtonItem alloc] initWithTitle:@"Record" style:UIBarButtonItemStyleBordered target:self action:@selector(startRecording)]; self.navigationItem.rightBarButtonItem = startButton; [startButton release]; } - (void)audioRecorderDidFinishRecording:(AVAudioRecorder *) aRecorder successfully:(BOOL)flag { NSLog (@"audioRecorderDidFinishRecording:successfully:"); // your actions here } 

Aunque esta es una pregunta contestada (y algo así como antigua) he decidido publicar mi código de trabajo completo para otros que encontraron difícil encontrar un buen ejemplo de reproducción y reproducción (listo para usar), incluidos codificados, pcm, reproducir a través del altavoz , escriba en el archivo aquí es:

AudioPlayerViewController.h:

 #import  #import  @interface AudioPlayerViewController : UIViewController { AVAudioPlayer *audioPlayer; AVAudioRecorder *audioRecorder; int recordEncoding; enum { ENC_AAC = 1, ENC_ALAC = 2, ENC_IMA4 = 3, ENC_ILBC = 4, ENC_ULAW = 5, ENC_PCM = 6, } encodingTypes; } -(IBAction) startRecording; -(IBAction) stopRecording; -(IBAction) playRecording; -(IBAction) stopPlaying; @end 

AudioPlayerViewController.m:

 #import "AudioPlayerViewController.h" @implementation AudioPlayerViewController - (void)viewDidLoad { [super viewDidLoad]; recordEncoding = ENC_AAC; } -(IBAction) startRecording { NSLog(@"startRecording"); [audioRecorder release]; audioRecorder = nil; // Init audio with record capability AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryRecord error:nil]; NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] initWithCapacity:10]; if(recordEncoding == ENC_PCM) { [recordSettings setObject:[NSNumber numberWithInt: kAudioFormatLinearPCM] forKey: AVFormatIDKey]; [recordSettings setObject:[NSNumber numberWithFloat:44100.0] forKey: AVSampleRateKey]; [recordSettings setObject:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey]; [recordSettings setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; [recordSettings setObject:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; [recordSettings setObject:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey]; } else { NSNumber *formatObject; switch (recordEncoding) { case (ENC_AAC): formatObject = [NSNumber numberWithInt: kAudioFormatMPEG4AAC]; break; case (ENC_ALAC): formatObject = [NSNumber numberWithInt: kAudioFormatAppleLossless]; break; case (ENC_IMA4): formatObject = [NSNumber numberWithInt: kAudioFormatAppleIMA4]; break; case (ENC_ILBC): formatObject = [NSNumber numberWithInt: kAudioFormatiLBC]; break; case (ENC_ULAW): formatObject = [NSNumber numberWithInt: kAudioFormatULaw]; break; default: formatObject = [NSNumber numberWithInt: kAudioFormatAppleIMA4]; } [recordSettings setObject:formatObject forKey: AVFormatIDKey]; [recordSettings setObject:[NSNumber numberWithFloat:44100.0] forKey: AVSampleRateKey]; [recordSettings setObject:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey]; [recordSettings setObject:[NSNumber numberWithInt:12800] forKey:AVEncoderBitRateKey]; [recordSettings setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; [recordSettings setObject:[NSNumber numberWithInt: AVAudioQualityHigh] forKey: AVEncoderAudioQualityKey]; } NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/recordTest.caf", [[NSBundle mainBundle] resourcePath]]]; NSError *error = nil; audioRecorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSettings error:&error]; if ([audioRecorder prepareToRecord] == YES){ [audioRecorder record]; }else { int errorCode = CFSwapInt32HostToBig ([error code]); NSLog(@"Error: %@ [%4.4s])" , [error localizedDescription], (char*)&errorCode); } NSLog(@"recording"); } -(IBAction) stopRecording { NSLog(@"stopRecording"); [audioRecorder stop]; NSLog(@"stopped"); } -(IBAction) playRecording { NSLog(@"playRecording"); // Init audio with playback capability AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil]; NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/recordTest.caf", [[NSBundle mainBundle] resourcePath]]]; NSError *error; audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; audioPlayer.numberOfLoops = 0; [audioPlayer play]; NSLog(@"playing"); } -(IBAction) stopPlaying { NSLog(@"stopPlaying"); [audioPlayer stop]; NSLog(@"stopped"); } - (void)dealloc { [audioPlayer release]; [audioRecorder release]; [super dealloc]; } @end 

Espero que esto ayude a algunos de ustedes, chicos.

He subido un proyecto de muestra. Puedes echar un vistazo.

Grabadora de voz

Es realmente útil. El único problema que tuve fue el tamaño del archivo de sonido creado después de la grabación. Necesitaba reducir el tamaño del archivo, así que hice algunos cambios en la configuración.

 NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init]; [recordSetting setValue :[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey]; [recordSetting setValue:[NSNumber numberWithFloat:16000.0] forKey:AVSampleRateKey]; [recordSetting setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey]; 

Tamaño de archivo reducido de 360 ​​kb a solo 25 kb (grabación de 2 segundos).

He intentado que este código funcione durante las últimas 2 horas y aunque no mostró ningún error en el simulador, había uno en el dispositivo.

Resulta, al menos en mi caso, que el error vino del directorio utilizado (paquete):

 NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/recordTest.caf", [[NSBundle mainBundle] resourcePath]]]; 

No fue escribible o algo así … No hubo ningún error, excepto el hecho de que prepareToRecord falló …

Por lo tanto, lo reemplacé por:

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *recDir = [paths objectAtIndex:0]; NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/recordTest.caf", recDir]] 

Ahora funciona como un encanto.

Espero que esto ayude a otros.

Gracias a @Masimo Cafaro y Shaybc pude lograr las siguientes tareas

en iOS 8:

Grabar audio y guardar

Reproducir grabación guardada

1.Agrega “AVFoundation.framework” a tu proyecto

en archivo .h

2. Añada a continuación la instrucción de importación ‘AVFoundation / AVFoundation.h’.

3.Defina “AVAudioRecorderDelegate”

4. Cree un diseño con los botones Grabar, Reproducir y sus acción methids

5. Definir grabadora y reproductor, etc.

Aquí está el código de ejemplo completo que puede ayudarlo.

ViewController.h

 #import  #import  @interface ViewController : UIViewController  @property(nonatomic,strong) AVAudioRecorder *recorder; @property(nonatomic,strong) NSMutableDictionary *recorderSettings; @property(nonatomic,strong) NSString *recorderFilePath; @property(nonatomic,strong) AVAudioPlayer *audioPlayer; @property(nonatomic,strong) NSString *audioFileName; - (IBAction)startRecording:(id)sender; - (IBAction)stopRecording:(id)sender; - (IBAction)startPlaying:(id)sender; - (IBAction)stopPlaying:(id)sender; @end 

Entonces haz el trabajo en

ViewController.m

 #import "ViewController.h" #define DOCUMENTS_FOLDER [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] @interface ViewController () @end @implementation ViewController @synthesize recorder,recorderSettings,recorderFilePath; @synthesize audioPlayer,audioFileName; #pragma mark - View Controller Life cycle methods - (void)viewDidLoad { [super viewDidLoad]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } #pragma mark - Audio Recording - (IBAction)startRecording:(id)sender { AVAudioSession *audioSession = [AVAudioSession sharedInstance]; NSError *err = nil; [audioSession setCategory :AVAudioSessionCategoryPlayAndRecord error:&err]; if(err) { NSLog(@"audioSession: %@ %ld %@", [err domain], (long)[err code], [[err userInfo] description]); return; } [audioSession setActive:YES error:&err]; err = nil; if(err) { NSLog(@"audioSession: %@ %ld %@", [err domain], (long)[err code], [[err userInfo] description]); return; } recorderSettings = [[NSMutableDictionary alloc] init]; [recorderSettings setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey]; [recorderSettings setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; [recorderSettings setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey]; [recorderSettings setValue :[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; [recorderSettings setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; [recorderSettings setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey]; // Create a new audio file audioFileName = @"recordingTestFile"; recorderFilePath = [NSString stringWithFormat:@"%@/%@.caf", DOCUMENTS_FOLDER, audioFileName] ; NSURL *url = [NSURL fileURLWithPath:recorderFilePath]; err = nil; recorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recorderSettings error:&err]; if(!recorder){ NSLog(@"recorder: %@ %ld %@", [err domain], (long)[err code], [[err userInfo] description]); UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Warning" message: [err localizedDescription] delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; return; } //prepare to record [recorder setDelegate:self]; [recorder prepareToRecord]; recorder.meteringEnabled = YES; 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]; return; } // start recording [recorder recordForDuration:(NSTimeInterval) 60];//Maximum recording time : 60 seconds default NSLog(@"Recroding Started"); } - (IBAction)stopRecording:(id)sender { [recorder stop]; NSLog(@"Recording Stopped"); } - (void)audioRecorderDidFinishRecording:(AVAudioRecorder *) aRecorder successfully:(BOOL)flag { NSLog (@"audioRecorderDidFinishRecording:successfully:"); } #pragma mark - Audio Playing - (IBAction)startPlaying:(id)sender { NSLog(@"playRecording"); AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil]; NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@.caf", DOCUMENTS_FOLDER, audioFileName]]; NSError *error; audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; audioPlayer.numberOfLoops = 0; [audioPlayer play]; NSLog(@"playing"); } - (IBAction)stopPlaying:(id)sender { [audioPlayer stop]; NSLog(@"stopped"); } @end 

enter image description here

 This is from Multimedia programming guide... - (IBAction) recordOrStop: (id) sender { if (recording) { [soundRecorder stop]; recording = NO; self.soundRecorder = nil; [recordOrStopButton setTitle: @"Record" forState: UIControlStateNormal]; [recordOrStopButton setTitle: @"Record" forState: UIControlStateHighlighted]; [[AVAudioSession sharedInstance] setActive: NO error:nil]; } else { [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryRecord error: nil]; NSDictionary *recordSettings = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithFloat: 44100.0], AVSampleRateKey, [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey, [NSNumber numberWithInt: 1], AVNumberOfChannelsKey, [NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey, nil]; AVAudioRecorder *newRecorder = [[AVAudioRecorder alloc] initWithURL: soundFileURL settings: recordSettings error: nil]; [recordSettings release]; self.soundRecorder = newRecorder; [newRecorder release]; soundRecorder.delegate = self; [soundRecorder prepareToRecord]; [soundRecorder record]; [recordOrStopButton setTitle: @"Stop" forState: UIControlStateNormal]; [recordOrStopButton setTitle: @"Stop" forState: UIControlStateHighlighted]; recording = YES; } } 

En el siguiente enlace puede encontrar información útil sobre la grabación con AVAudioRecording. En este enlace, en la primera parte, “Uso del audio”, hay un delimitador llamado “Grabación con la clase AVAudioRecorder” que lo guía al ejemplo.

AudioVideo Conceptual MultimediaPG

Ok, la respuesta que recibí me ayudó en la dirección correcta y estoy muy agradecido. Me ayudó a descubrir cómo grabar realmente en el iPhone, pero pensé que también incluiría algún código útil que obtuve de la Biblioteca de Referencia del iPhone:

AudioandVideoTechnologies

Usé este código y lo agregué al ejemplo de avTouch bastante fácilmente. Con la muestra de código anterior y la muestra de la biblioteca de referencia, pude hacer que esto funcionara bastante bien.

para formato wav debajo de configuración de audio

 NSDictionary *audioSetting = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithFloat:44100.0],AVSampleRateKey, [NSNumber numberWithInt:2],AVNumberOfChannelsKey, [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey, [NSNumber numberWithInt:kAudioFormatLinearPCM],AVFormatIDKey, [NSNumber numberWithBool:NO], AVLinearPCMIsFloatKey, [NSNumber numberWithBool:0], AVLinearPCMIsBigEndianKey, [NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved, [NSData data], AVChannelLayoutKey, nil]; 

ref: http://objective-audio.jp/2010/09/avassetreaderavassetwriter.html

COMIENZO

 NSError *sessionError = nil; [[AVAudioSession sharedInstance] setDelegate:self]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError]; [[AVAudioSession sharedInstance] setActive: YES error: nil]; UInt32 doChangeDefaultRoute = 1; AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute); NSError *error = nil; NSString *filename = [NSString stringWithFormat:@"%@.caf",FILENAME]; NSString *path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:filename]; NSURL *soundFileURL = [NSURL fileURLWithPath:path]; NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey, [NSNumber numberWithInt:AVAudioQualityMedium],AVEncoderAudioQualityKey, [NSNumber numberWithInt:AVAudioQualityMedium], AVSampleRateConverterAudioQualityKey, [NSNumber numberWithInt: 1], AVNumberOfChannelsKey, [NSNumber numberWithFloat:22050.0],AVSampleRateKey, nil]; AVAudioRecorder *audioRecorder = [[AVAudioRecorder alloc] initWithURL:soundFileURL settings:recordSettings error:&error]; if (!error && [audioRecorder prepareToRecord]) { [audioRecorder record]; } 

DETENER

 [audioRecorder stop]; [audioRecorder release]; audioRecorder = nil; 
 -(void)viewDidLoad { // Setup audio session AVAudioSession *session = [AVAudioSession sharedInstance]; [session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; // Define the recorder setting NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init]; [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey]; [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; [recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey]; // Initiate and prepare the recorder recorder = [[AVAudioRecorder alloc] initWithURL:outputFileURL settings:recordSetting error:NULL]; recorder.delegate = self; recorder.meteringEnabled = YES; [recorder prepareToRecord]; } - (IBAction)btnRecordDidClicked:(UIButton *)sender { if (player1.playing) { [player1 stop]; } if (!recorder.recording) { AVAudioSession *session = [AVAudioSession sharedInstance]; [session setActive:YES error:nil]; // Start recording [recorder record]; [_recordTapped setTitle:@"Pause" forState:UIControlStateNormal]; } else { // Pause recording [recorder pause]; [_recordTapped setTitle:@"Record" forState:UIControlStateNormal]; } [_stopTapped setEnabled:YES]; [_playTapped setEnabled:NO]; } - (IBAction)btnPlayDidClicked:(UIButton *)sender { if (!recorder.recording){ player1 = [[AVAudioPlayer alloc] initWithContentsOfURL:recorder.url error:nil]; [player1 setDelegate:self]; [player1 play]; } } - (IBAction)btnStopDidClicked:(UIButton *)sender { [recorder stop]; AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setActive:NO error:nil]; } - (void) audioRecorderDidFinishRecording:(AVAudioRecorder *)avrecorder successfully:(BOOL)flag{ [_recordTapped setTitle:@"play" forState:UIControlStateNormal]; [_stopTapped setEnabled:NO]; [_playTapped setEnabled:YES]; } 

Según las respuestas anteriores, hice algunos cambios y obtuve el resultado correcto.

Paso 1: debajo de “inf.plist” agrega los permisos de uso del micrófono ==>

  NSMicrophoneUsageDescription ${PRODUCT_NAME} Microphone Usage 

Paso 2:

  1. Guarde el archivo de audio de registro en el directorio de documentos locales

  2. Reproducir / Detener grabación

  3. Obtenga la duración del archivo de audio guardado

Aquí está el código fuente. Por favor eche un vistazo a la vez y úselo.

ViewController.h

 #import  #import  @interface ViewController : UIViewController{ AVAudioPlayer *audioPlayer; AVAudioRecorder *audioRecorder; } -(IBAction) startRecording; -(IBAction) stopRecording; -(IBAction) playRecording; -(IBAction) stopPlaying; @end 

ViewController.m

 #import "ViewController.h" @interface ViewController ()  @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } -(IBAction) startRecording{ // Setup audio session AVAudioSession *audioSession = [AVAudioSession sharedInstance]; NSError *err = nil; [audioSession setCategory :AVAudioSessionCategoryPlayAndRecord error:&err]; if(err) { NSLog(@"audioSession: %@ %ld %@", [err domain], (long)[err code], [[err userInfo] description]); return; } [audioSession setActive:YES error:&err]; err = nil; if(err) { NSLog(@"audioSession: %@ %ld %@", [err domain], (long)[err code], [[err userInfo] description]); return; } AVAudioSessionRecordPermission permissionStatus = [audioSession recordPermission]; switch (permissionStatus) { case AVAudioSessionRecordPermissionUndetermined:{ [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) { // CALL YOUR METHOD HERE - as this assumes being called only once from user interacting with permission alert! if (granted) { // Microphone enabled code NSLog(@"Mic permission granted. Call method for granted stuff."); [self startRecordingAudioSound]; } else { // Microphone disabled code NSLog(@"Mic permission indeterminate. Call method for indeterminate stuff."); // UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)!) } }]; break; } case AVAudioSessionRecordPermissionDenied: // direct to settings... NSLog(@"Mic permission denied. Call method for denied stuff."); break; case AVAudioSessionRecordPermissionGranted: // mic access ok... NSLog(@"Mic permission granted. Call method for granted stuff."); [self startRecordingAudioSound]; break; default: // this should not happen.. maybe throw an exception. break; } } #pragma mark - Audio Recording - (BOOL)startRecordingAudioSound{ NSError *error = nil; NSMutableDictionary *recorderSettings = [[NSMutableDictionary alloc] init]; [recorderSettings setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey]; [recorderSettings setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; [recorderSettings setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey]; [recorderSettings setValue :[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; [recorderSettings setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; [recorderSettings setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey]; // Create a new audio file NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentPath_ = [searchPaths objectAtIndex: 0]; NSString *pathToSave = [documentPath_ stringByAppendingPathComponent:[self dateString]]; NSLog(@"the path is %@",pathToSave); // File URL NSURL *url = [NSURL fileURLWithPath:pathToSave];//FILEPATH]; //Save recording path to preferences NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; [prefs setURL:url forKey:@"Test1"]; [prefs synchronize]; audioRecorder = [[AVAudioRecorder alloc] initWithURL:url settings:recorderSettings error:&error]; if (!audioRecorder) { NSLog(@"Error establishing recorder: %@", error.localizedFailureReason); return NO; } // Initialize degate, metering, etc. audioRecorder.delegate = self; audioRecorder.meteringEnabled = YES; //self.title = @"0:00"; if (![audioRecorder prepareToRecord]) { NSLog(@"Error: Prepare to record failed"); //[self say:@"Error while preparing recording"]; return NO; } if (![audioRecorder record]) { NSLog(@"Error: Record failed"); // [self say:@"Error while attempting to record audio"]; return NO; } NSLog(@"Recroding Started"); return YES; } #pragma mark - AVAudioRecorderDelegate - (void) audioRecorderDidFinishRecording:(AVAudioRecorder *)avrecorder successfully:(BOOL)flag{ NSLog (@"audioRecorderDidFinishRecording:successfully:"); } #pragma mark - AVAudioPlayerDelegate - (void) audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{ NSLog (@"audioPlayerDidFinishPlaying:successfully:"); } - (NSString *) dateString { // return a formatted string for a file name NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"ddMMMYY_hhmmssa"; return [[formatter stringFromDate:[NSDate date]]stringByAppendingString:@".aif"]; } -(IBAction) stopRecording{ NSLog(@"stopRecording"); [audioRecorder stop]; NSLog(@"stopped"); } -(IBAction) playRecording{ //Load recording path from preferences NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; NSURL *temporaryRecFile = [prefs URLForKey:@"Test1"]; //Get Duration of Audio File AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:temporaryRecFile options:nil]; CMTime audioDuration = audioAsset.duration; float audioDurationSeconds = CMTimeGetSeconds(audioDuration); NSLog(@"Duration Of Audio: %f", audioDurationSeconds); audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:temporaryRecFile error:nil]; audioPlayer.delegate = self; [audioPlayer setNumberOfLoops:0]; audioPlayer.volume = 1; [audioPlayer prepareToPlay]; [audioPlayer play]; NSLog(@"playing"); } -(IBAction) stopPlaying{ NSLog(@"stopPlaying"); [audioPlayer stop]; NSLog(@"stopped"); } @end