Formato de audio para iOS y Android

Lo siento si estoy haciendo una pregunta demasiado genérica.

Estamos en el proceso de desarrollar una aplicación que graba y reproduce audio en dispositivos móviles. Esta aplicación se está desarrollando para Android y iOS. La aplicación grabará audio usando el micrófono del dispositivo y lo almacenará en el servidor.

El usuario (en Android e iOS) puede abrir la aplicación y reproducir el sonido que está almacenado en el servidor. El formato de sonido que estamos utilizando es AAC. En iOS funciona bien. Podemos grabar y reproducir los archivos AAC.

Pero en Android (Samsung S3 y Samsung Galaxy Y) no podemos grabar sonido en formato AAC. Pero en S3 podemos jugar el archivo AAC.

Mi pregunta es, qué formato deberíamos seleccionar para grabar y jugar en Android (debería ser compatible con 2.3 a Jellybean) e iOS. ¿Deberíamos usar MP4?

Una solución que tenemos es que, en el lado de backend, podemos convertir el archivo de audio a AAC, MP4 o 3GP y proporcionar los archivos compatibles a los teléfonos móviles en función de las versiones.

Android e iOS usan el mismo servidor para los registros de almacenamiento. Todos los registros se guardan sin ninguna extensión.

Cuando Android descarga un registro del servidor, mi aplicación agrega una extensión ” .aac “.
Al usar iOS , agrega una extensión ” .m4a “.

El mismo registro funciona bien en ambas plataformas móviles.

Grabar en iOS:

NSDictionary recorderSettings = [[NSDictionary alloc] initWithObjectsAndKeys:             [NSNumber numberWithInt:kAudioFormatMPEG4AAC], AVFormatIDKey,             [NSNumber numberWithInt:16000],AVSampleRateKey,             [NSNumber numberWithInt:1],AVNumberOfChannelsKey,             [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,             [NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,             [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,             nil]; 

Para Android:

 myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); myRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); myRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); myRecorder.setAudioSamplingRate(16000); myRecorder.setAudioChannels(1); mRecorder.setOutputFile(fileName); 

Recientemente completamos una aplicación con este tipo de funcionalidad de grabación de ambos y escuchando desde iOS y Android, a continuación se muestra el código que utilizamos para su referencia. Confiamos en nuestro servicio web y servidor para la conversión al formato .mp3 que se puede reproducir fácilmente en ambos plataforma.

 //iPhone side code. records m4a file format (small in size) NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey, [NSNumber numberWithFloat:16000.0], AVSampleRateKey, [NSNumber numberWithInt: 1], AVNumberOfChannelsKey, nil]; NSError *error = nil; audioRecorder = [[AVAudioRecorder alloc] initWithURL:soundFileURL settings:recordSettings error:&error]; if (error) NSLog(@"error: %@", [error localizedDescription]); else [audioRecorder prepareToRecord]; //Android side code. (records mp4 format and it works straight away by giving mp3 extension.) MediaRecorder recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); recorder.setAudioEncodingBitRate(256); recorder.setAudioChannels(1); recorder.setAudioSamplingRate(44100); recorder.setOutputFile(getFilename()); try { recorder.prepare(); recorder.start(); myCount=new MyCount(thirtysec, onesecond); myCount.start(); recordingDone=true; count=0; handler.sendEmptyMessage(0); if(progressDialog.isShowing()) progressDialog.dismiss(); } catch (IllegalStateException e) { e.printStackTrace(); StringWriter strTrace = new StringWriter(); e.printStackTrace(new PrintWriter(strTrace)); CrashReportActivity.appendLog( "\nEXCEPTION : \n" + strTrace.toString() + "\n", Comment.this); } catch (IOException e) { e.printStackTrace(); StringWriter strTrace = new StringWriter(); e.printStackTrace(new PrintWriter(strTrace)); CrashReportActivity.appendLog( "\nEXCEPTION : \n" + strTrace.toString() + "\n", Comment.this); } 

Puede encontrar fácilmente el código de conversión de m4a a mp3 en .Net, mire a su alrededor buscando en Google (cojo o faad alguna utilidad así).

Espero que esto ayude.

Recientemente enfrentamos este problema de interoperabilidad. Intentamos grabar un archivo en formato aac en ambas plataformas, pero los archivos grabados con los teléfonos Samsung no se reprodujeron en iOS. Así que tuvimos que usar los formatos 3gp y aac para reproducir el archivo en múltiples dispositivos en Android e iOS.

A continuación se muestra el código que usamos al grabar un archivo en Android:

  mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mRecorder.setOutputFile(fileName); 

Mantuvimos la extensión del archivo grabado como .3gp.

En iOS, sin embargo, la grabación no se puede realizar en 3gp, por lo que grabamos el archivo en .aac en iOS, que se puede reproducir en ambas plataformas.

Con la combinación MPEG4 y AAC, todo el audio se reproduce en Android. Pero en iOS, tuvimos que usar “m4a” como la extensión de archivo para que se reproduzca el audio de Android.

Progtwigticamente esto te ayudará y la extensión de archivo puede ser mp3 / mp4 para audio; ambos admitirán reproductores de medios. Fragmento de Android:

 myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); myRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); myRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 

fragmento de iOS

 AVFormatIDKey: @(kAudioFormatMPEG4AAC) 

Android usa formato de salida MPEG 4 y codificador de audio AAC

iOS usa kAudioFormatMPEG