iOS: formatting de audio para grabar encoding de voz para transferencia de networking

Estoy buscando un buen formatting de audio para save grabaciones de voz a nivel local y para el transporte a través de la networking. Los requisitos son:

  • Calidad decente. Estos clips, cuando se reciben, se escucharán muchas veces.
  • El flujo de trabajo debe admitir el recorte y el desvanecimiento antes del transporte.
  • Tamaño de file decente

Este es mi enfoque actual para la grabación:

// SEE IMA4 vs M4A http://stackoverflow.com/questions/3509921/recorder-works-on-iphone-3gs-but-not-on-iphone-3g NSDictionary *recordSettings = [[NSDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithFloat: 11025], AVSampleRateKey, [NSNumber numberWithInt: kAudioFormatLinearPCM], AVFormatIDKey, [NSNumber numberWithInt: 1], AVNumberOfChannelsKey, [NSNumber numberWithBool:NO], AVLinearPCMIsFloatKey, [NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey, nil]; NSError *error = nil; self.audioRecorder = [[ AVAudioRecorder alloc] initWithURL:self.recordingFile settings:recordSettings error:&error]; 

Y enfoque para la encoding:

 NSString *file = [NSString stringWithFormat:@"recordingConverted%x.caf", arc4random()]; self.filePath = [NSTemporaryDirectory() stringByAppendingPathComponent: file]; NSFileManager *fileManager = [NSFileManager defaultManager]; if ([fileManager fileExistsAtPath:self.filePath]) { NSError *error; if ([fileManager removeItemAtPath:self.filePath error:&error] == NO) { NSLog(@"removeItemAtPath %@ error:%@", self.filePath, error); } } NSLog(@"IN: %@", self.recordingFile); NSLog(@"OUT: %@", self.filePath); AVAsset *avAsset = [AVAsset assetWithURL:self.recordingFile]; // get the first audio track NSArray *tracks = [avAsset tracksWithMediaType:AVMediaTypeAudio]; if ([tracks count] == 0) return nil; AVAssetTrack *track = [tracks objectAtIndex:0]; // create the export session // no need for a retain here, the session will be retained by the // completion handler since it is referenced there AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:avAsset presetName:AVAssetExportPresetAppleM4A]; if (nil == exportSession) return nil; // create trim time range CMTime startTime = CMTimeMake(self.speakingBeginTime*44100, 44100); CMTime stopTime = CMTimeMake((self.speakingBeginTime+[self.duration doubleValue])*44100, 44100); CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(startTime, stopTime); // create fade in time range CMTime startFadeInTime = startTime; CMTime endFadeInTime = CMTimeMake((self.speakingBeginTime+RECORDING_INTERVAL)*1.5*44100, 44100); CMTimeRange fadeInTimeRange = CMTimeRangeFromTimeToTime(startFadeInTime, endFadeInTime); // setup audio mix AVMutableAudioMix *exportAudioMix = [AVMutableAudioMix audioMix]; AVMutableAudioMixInputParameters *exportAudioMixInputParameters = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track]; [exportAudioMixInputParameters setVolumeRampFromStartVolume:0.0 toEndVolume:1.0 timeRange:fadeInTimeRange]; exportAudioMix.inputParameters = [NSArray arrayWithObject:exportAudioMixInputParameters]; // configure export session output with all our parameters exportSession.outputURL = [NSURL fileURLWithPath:self.filePath]; // output path exportSession.outputFileType = AVFileTypeAppleM4A; // output file type exportSession.timeRange = exportTimeRange; // trim time range exportSession.audioMix = exportAudioMix; // fade in audio mix // MAKE THE EXPORT SYNCHRONOUS dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); [exportSession exportAsynchronouslyWithCompletionHandler:^{ dispatch_semaphore_signal(semaphore); }]; dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_release(semaphore); if (AVAssetExportSessionStatusCompleted == exportSession.status) { return self.filePath; //NSLog(@"AVAssetExportSessionStatusCompleted"); } else if (AVAssetExportSessionStatusFailed == exportSession.status) { // a failure may happen because of an event out of your control // for example, an interruption like a phone call comming in // make sure and handle this case appropriately NSLog(@"AVAssetExportSessionStatusFailed %@", exportSession.error.localizedDescription); } else { NSLog(@"Export Session Status: %d", exportSession.status); } 

Actualmente, el performance en un clip de audio de 3 segundos es: 62,228 bytes para PCM y 36,654 bytes para codificado. Parece que podría hacerlo mejor.

He encontrado la guía aquí:

http://gamua.com/blog/2010/06/sound-on-ios-best-practices/

para ser útil en la selección de formattings de sonido (especialmente los comentarios)

También hay algunos buenos ejemplos aquí:

¿Cómo grabo audio en iPhone con AVAudioRecorder?

especialmente el ejemplo con varios formattings para exportar, y esta respuesta:

https://stackoverflow.com/a/3870385/2214106

que networkingujo significativamente el tamaño del file.