Formato de audio para iOS y Android.
(6)
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 está siendo desarrollada tanto para Android como para iOS. La aplicación grabará el audio utilizando 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 almacenado en el servidor. El formato de sonido que estamos utilizando es AAC. En iOS está funcionando 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 reproducir el archivo AAC.
Mi pregunta es, qué formato debemos seleccionar para grabar y reproducir en Android (debería ser compatible con 2.3 a Jellybean) e iOS. ¿Debemos usar MP4?
Una de las soluciones que tenemos es que, en el lado de fondo, podemos convertir el archivo de audio a AAC, MP4 o 3GP y entregar los archivos compatibles a móviles según las versiones.
Android usa formato de salida MPEG 4 y codificador de audio AAC
iOS utiliza kAudioFormatMPEG
Android y iOS usan el mismo servidor para almacenar registros. 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 juega 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);
Con la combinación de MPEG4 y AAC, todo el audio se reproduce en Android. Pero en iOS, tuvimos que usar "m4a" como la extensión del archivo para que se reproduzca el audio de Android.
Hace poco completamos una aplicación con este tipo de funcionalidad de grabación y escucha tanto de iOS como de Android, a continuación se muestra el código que usamos para su referencia. Confiamos en nuestro servicio web y servidor para la conversión al formato .mp3, que puede reproducirse 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 el código de conversión de m4a a mp3 en .Net fácilmente, mire a su alrededor buscando en Google (cojo o faad alguna utilidad como esa).
Espero que esto ayude.
Programáticamente esto te ayudará y la extensión del archivo puede mp3 / mp4 para audio; Ambos apoyarán en reproductores multimedia. Fragmento de Android:
myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
myRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
fragmento de iOS
AVFormatIDKey: @(kAudioFormatMPEG4AAC)
Recientemente enfrentamos este problema de interoperabilidad. Intentamos grabar un archivo en formato aac en ambas plataformas, pero los archivos grabados con teléfonos Samsung no se reproducían en iOS. Así que tuvimos que usar 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 utilizamos 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 un archivo en .aac en iOS que se puede reproducir en ambas plataformas.