Аудиоформат для iOS и Android
Извините, если я задаю слишком общий вопрос.
Мы находимся в процессе разработки приложения, которое записывает и воспроизводит аудио на мобильных устройствах. Это приложение разрабатывается как для Android, так и для iOS. Приложение будет записывать звук с помощью микрофона устройства и сохранять его на сервере.
Пользователь (на Android и iOS) может открыть приложение и воспроизвести звук, который хранится на сервере. Формат звука, который мы используем - AAC. В iOS все работает нормально. Мы можем записывать и воспроизводить файлы AAC.
Но на Android (Samsung S3 и Samsung Galaxy Y) мы не можем записывать звук в формате AAC. Но в S3 мы можем воспроизвести файл AAC.
У меня вопрос, какой формат мы должны выбрать для записи и воспроизведения в Android (должен поддерживать от 2.3 до Jellybean) и iOS. Должны ли мы использовать MP4?
Одно из решений, которое у нас есть, это то, что на внутренней стороне мы можем преобразовать аудиофайл в AAC, MP4 или 3GP и передать поддерживаемые файлы на мобильные телефоны в зависимости от версий.
6 ответов
Android и iOS используют один и тот же сервер для хранения записей. Все записи сохраняются без каких-либо расширений.
Когда Android загружает запись с сервера, мое приложение добавляет расширение ".aac".
При использовании iOS добавляется расширение ".m4a".
Одна и та же запись хорошо работает на обеих мобильных платформах.
Запись на 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];
Для 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);
Недавно мы завершили одно приложение с функциями такого рода, записывающими их с обеих сторон и слушающими как с iOS, так и с Android. Ниже приведен код, который мы использовали для вашей справки. Мы использовали наш веб-сервис и сервер для преобразования в формат.mp3, который можно легко воспроизвести в обоих форматах. Платформа.
//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);
}
Вы можете легко найти код преобразования из m4a в mp3 в.Net, осмотреться, прибегая к помощи googling (отстой или неважно какая-нибудь подобная утилита).
Надеюсь это поможет.
Недавно мы столкнулись с этой проблемой совместимости. Мы пытались записать файл в формате aac на обеих платформах, но файлы, записанные с помощью телефонов Samsung, не воспроизводились в iOS. Поэтому мы должны были использовать как 3gp, так и aac форматы, чтобы проигрывать файл на нескольких устройствах в Android и IOS.
Ниже приведен код, который мы использовали при записи файла в Android:
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mRecorder.setOutputFile(fileName);
Мы сохранили расширение записанного файла как.3gp.
В iOS, однако, запись не может быть выполнена в 3gp, поэтому мы записали файл в.aac в iOS, который можно воспроизводить на обеих платформах.
Благодаря комбинации MPEG4 и AAC все аудио воспроизводится на Android. Но на iOS нам пришлось использовать "m4a" в качестве расширения файла, чтобы воспроизводить звук Android.
Программно вам это поможет и расширение файла может mp3/mp4 для аудио; оба будут поддерживать медиаплееры. Фрагмент Android:
myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
myRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
Фрагмент iOS
AVFormatIDKey: @(kAudioFormatMPEG4AAC)
Android использует выходной формат MPEG 4 и аудиокодер AAC
iOS использует kAudioFormatMPEG
Попробуйте это, у меня была та же проблема, что и она отлично работает.
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);