2012-08-28 15 views
10

Estoy tratando de grabar audio en el dispositivo usando AVAudioRecorder. Ese archivo se transmite a un servidor web y quiero reproducir ese archivo resultante en un navegador web.AVAudioRecorder record AAC/m4a

He intentado varias combinaciones de configuraciones en el dispositivo ... nada parece codificar el archivo en el formato AAC correcto .

QuickTime dice que no sabe cómo reproducir este archivo.

Código de ejemplo

private void InitializeRecordingSession() { 
     string fileName = string.Format("{0}.m4a", Guid.NewGuid()); 
     string tmpdir = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + "/audio"; 
      if (!Directory.Exists(tmpdir)) 
       Directory.CreateDirectory(tmpdir); 
      audioFilePath = Path.Combine(tmpdir, fileName); 

      Console.WriteLine("Audio File Path: " + audioFilePath); 

      var url = NSUrl.FromFilename(audioFilePath); 
      var settings = new AVAudioRecorderSettings() { 
       AudioFormat = AudioFormatType.MPEG4AAC, 
       SampleRate = 44100, 
       NumberChannels = 1, 
       AudioQuality = AVAudioQuality.High,  
      }; 

      recorder = AVAudioRecorder.ToUrl(url, settings, out error); 

      //Set Recorder to Prepare To Record 
      recorder.PrepareToRecord(); 
    } 

Editar -Por poner este código en la línea antes de

recorder = AVAudioRecorder.ToUrl(url, settings, out error); 

Todo funcionó.

NSError error;  
AVAudioSession audioSession = AVAudioSession.SharedInstance(); 
audioSession.SetCategory(AVAudioSession.CategoryRecord, out error); 
audioSession.SetActive(true, out error); 
+0

Me pregunto si usted ha encontrado la solución a esto, ya que se enfrentó al mismo problema. – justinkoh

Respuesta

6

El iOS SDK es aparentemente estúpido. Establecer la clave de ID de formato en kAudioFormatMPEG4AAC no es suficiente para que realmente codifique el archivo; en QuickTime se reproducirá pero en sus propiedades solo verá AAC y no encontrará más detalles. Cambiar la extensión del archivo de salida a m4a debería ayudar a hacer el truco y hacer que aplique la codificación correcta.

+0

Estoy bastante seguro de que lo intenté y no funcionó. Pero lo intentaré de nuevo. –

+0

esto todavía no funciona "Este no es un archivo que entienda QuickTime" –

+0

Me temo que este método tampoco funcionó para mí. – justinkoh

30

Para codificadores acelerados por hardware, solo una sesión puede estar activa en cualquier momento. Esto significa que, para AAC, funcionará en el simulador (donde se utiliza un codificador de software) pero puede fallar en el dispositivo (donde se utiliza un codificador de hardware) a menos que su aplicación active el AVAudioSession.

También estaba intentando usar AVAudioRecorder para grabar audio en un formato codificado AAC preferiblemente en un archivo .m4a. He tenido una gran cantidad de tiempo haciendo esto. Rápidamente pude obtener el código para grabar en AAC dentro de un archivo de audio central (.caf), pero no pude hacer que AVAudioRecorder formatee correctamente un .m4a. Estaba a punto de reescribir el código de grabación en mi aplicación utilizando la API de Unidades de audio de nivel inferior, pero en su lugar lo puse en el segundo plano y lo agregué al código para manejar la sesión de audio compartida. Una vez que se configuró, volví e intenté guardar como .m4a y simplemente funcionó.

Aquí es un código de ejemplo:

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *docsDir = [dirPaths objectAtIndex:0]; 
NSURL *tmpFileUrl = [NSURL fileURLWithPath:[docsDir stringByAppendingPathComponent:@"tmp.m4a"]]; 
NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey, 
         [NSNumber numberWithFloat:16000.0], AVSampleRateKey, 
         [NSNumber numberWithInt: 1], AVNumberOfChannelsKey, 
         nil]; 
NSError *error = nil; 
AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:tmpFileUrl settings:recordSettings error:&error]; 
[recorder prepareToRecord]; 

AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryRecord error:nil]; 
[session setActive:YES error:nil]; 

[recorder record]; 

Luego de finalizar la grabación utilicé:

[recorder stop]; 
AVAudioSession *session = [AVAudioSession sharedInstance]; 
int flags = AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation; 
[session setActive:NO withFlags:flags error:nil]; 

A continuación, el archivo en 'tmpFileUrl' se puede utilizar a su gusto.

+1

¡Esto se debe aumentar en innumerables veces! – mahboudz

+0

Respuesta increíble. Gracias, esto me ahorró mucho tiempo! –

3

¡Las pistas sobre AVAudioSession son muy útiles!

Desde setActive:withFlags:error: se ha convertido en obsoleto en iOS 6.0 el código para detener la sesión de audio debe ajustarse a:

AVAudioSession *session = [AVAudioSession sharedInstance]; 
int flags = AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation; 
[session setActive:NO withOptions:flags error:nil]; 
Cuestiones relacionadas