AVAudioRecorder не создает файлы .m4a, которые можно открыть и воспроизвести

Я пытаюсь изменить приложение iOS, которое может отправлять аудиофайлы (безопасно/зашифрованные) на другие устройства iOS. Он использует AVAudioRecorder для записи аудиофайлов и использует AVAudioPlayer для воспроизведения любых полученных аудиофайлов.

Теперь я пытаюсь изменить приложение для создания и отправки файлов, совместимых с Android. Я изменил существующий код AVAudioRecorder следующим образом:

[settings setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
[settings setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey];
[settings setValue:[NSNumber numberWithInt:16] forKey:AVEncoderBitRateKey];
[settings setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey];
[settings setValue:[NSNumber numberWithFloat:48000.0] forKey:AVSampleRateKey];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dirPath = [paths objectAtIndex:0];

NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"yyyy-MM-dd HH-mm"];

NSString *filename = [NSString stringWithFormat:@"%@.aac", [format stringFromDate:NSDate.date]];

Файлы, созданные этим, воспроизводятся на Mac, на устройстве iOS, но не на устройстве Android. Если расширение файла было вручную изменено для завершения в ".m4a", файл воспроизводится на Android.

(Преимущество формата ".aac" в том, что старые версии приложения могут получать эти файлы и воспроизводить их обратно - я поддерживал обратную совместимость.)

Итак, я сделал это изменение:

NSString *filename = [NSString stringWithFormat:@"%@.m4a", [format stringFromDate:NSDate.date]];

Однако результирующий файл (который создается без ошибок из AVAudioRecorder) не может воспроизводиться на компьютерах Mac или на устройствах iOS. И я жду, чтобы узнать, работает ли он на Android.

Когда AVAudioPlayer пытается открыть этот файл, он выдает:

Ошибка домена = NSOSStatusErrorDomain Code = 1685348671 "Операция не удалось завершить. (Ошибка OSStatus 1685348671.)" Код 1685348671 → "dta?": файл имеет неправильный формат, а не действительный экземпляр аудиофайла его типа или не распознается как аудиофайл.

Простое переименование файла с ".aac" снова не изменит того факта, что он не может быть загружен ни на что на Mac или iOS.

Сейчас кажется, что лучшим решением было бы создать файл ".aac" , а затем конец Android заменить ".aac" на ".m4a" и попытаться воспроизвести его.

Вопрос 1: Кто-нибудь знает, почему изменение расширения имени файла может привести к ошибке AVAudioPLayer? BTW, файл ".m4a", который я создал выше, не может быть открыт ничем, что у меня есть на Mac, поэтому я не могу определить, является ли проблема с файловым форматом или невозможностью iOS или Macs прочитать этот тип файла.

Для любопытных я поставил копию файла ".aac" и ".m4a" из AVAudioRecorder, здесь:

https://dl.dropboxusercontent.com/u/14939586/2013-07-08%2013-24.m4a https://dl.dropboxusercontent.com/u/14939586/2013-07-08%2010-11.aac

Вопрос 2: Пока я устанавливаю AVAudioRecorder на один канал, результирующий файл является стерео. Зачем? (По крайней мере, это то, что VLC говорит о метаданных)

Вопрос 3: В любом случае следует указать AAC-LC для кодирования без потерь? Или я могу сделать это только в том случае, если я перейду из AVAudioRecorder в API более низкого уровня?

9
задан mahboudz 09 июля '13 в 0:32
источник поделиться
2 ответов

Ответ на вопрос 1 заключается в том, что вы должны правильно настроить аудио-сессию, иначе файл m4a не будет правильно отформатирован. Код звукового сеанса, который я сейчас установил, незадолго до начала записи:

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

Я установил сессию для воспроизведения после завершения записи, чтобы воспроизводить аудиофайлы.

Вопрос 2 - проблема в VLC, которая отображает неправильное количество каналов. Аудиофайл в окне MacOS Finder Get Info отображается как один канал.

Вопрос 3 не отвечает.

8
ответ дан mahboudz 09 июля '13 в 14:55
источник поделиться

Для создания и записи звука в файле ".m4a", который воспроизводится в iOS, а также в android, я использую следующий код:

NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];

[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];


AudioRecorder = [[AVAudioRecorder alloc] initWithURL:fileOutPutUrl settings:recordSetting error:nil];
[AudioRecorder setDelegate:self];
[AudioRecorder recordForDuration:RecordLimitTime];  // Record Limit if require
if ([AudioRecorder prepareToRecord]) {
    [AudioRecorder record];
}

В Android-стороне мне не нужно менять код для воспроизведения только файла ".mp3", в android просто измените расширение с "fileName.m4a" на "fileName.mp3", и это удивительно работает. и в iOS file = "fileName.m4a" воспроизводится плавно.

3
ответ дан g212gs 07 янв. '16 в 13:03
источник поделиться

Другие вопросы по меткам