Я делаю приложение для iOS. Одна из его особенностей заключается в том, что он может сохранять записи и сохранять аудиофайлы.
Чтобы сохранить URL-адреса записанных аудиофайлов, я сохраняю их в NSUserDefaults как пути к файлам, например:
файл: ///var/mobile/Containers/Data/Application/17F8E799-D7E1-4B3C-9DFE-7BA48E346314/Documents/recordName.aif
Я использую библиотеку под названием «FVSoundWaveDemo», чтобы попытаться отобразить звуковую волну для записанного файла. Но у меня проблема с URL ...
Пример в «FVSoundWaveDemo» загружает локально импортированный файл следующим образом:
NSString* filename = [NSString stringWithFormat:@"song1.m4a"];
NSURL* url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:filename ofType:nil]];
_soundWaveView.soundURL = url;
Вы видите бит с "song1.m4a", я хочу заменить его и заставить приложение использовать вместо него URL-адрес filePath. Как URL-адрес filePath, который я указал выше в своем вопросе.
Я пробовал всевозможные вещи, например, пытался «преобразовать» filePath в обычный URL-адрес, пытаться использовать AVAsset и так далее. Но все, что я пытаюсь сделать, приводит к этой ошибке:
Завершение работы приложения из-за неперехваченного исключения «NSRangeException», причина: «*** - [__ NSArrayM objectAtIndex:]: индекс 0 за пределами границ для пустого массива»
И это потому, что библиотека, которую я использую, использует такие AVAsset:
AVAssetReader* reader = [[AVAssetReader alloc] initWithAsset:songAsset error:&error];
AVAssetTrack* songTrack = [songAsset.tracks objectAtIndex:0];
NSDictionary* outputSettingsDict = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithInt:kAudioFormatLinearPCM],AVFormatIDKey,
[NSNumber numberWithInt:1],AVNumberOfChannelsKey,
[NSNumber numberWithInt:8],AVLinearPCMBitDepthKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsNonInterleaved,
nil];
Так как же мне заставить AVAsset просто работать с URL-адресом filePath?
Помните, что я пытаюсь заставить его просматривать записанный аудиофайл, сохраненный приложением, НЕ локально импортированный аудиофайл, который разработчик может добавить в проект Xcode.
Я застрял на этом уже несколько дней, если вы можете мне помочь, я буду очень признателен, спасибо.
Спасибо за ваше время, Дэн.
2 ответа
Разобрался в конце концов. Я внес следующие изменения, чтобы заставить его работать:
1) Я использовал fileURLWithPath вместо URLWithString вот так:
NSURL *assetURL = [NSURL fileURLWithPath:passURL];
AVURLAsset *asset = [AVURLAsset assetWithURL:assetURL];
2) Раньше, когда я сохранял URL-адрес аудиофайла, я сохранял его как NSString, например:
файл: ///var/mobile/Containers/Data/Application/17F8E799-D7E1-4B3C-9DFE-7BA48E346314/Documents/recordName.aif
Это не работает, если вы хотите использовать что-то вроде AVPlayer. Вместо этого вы должны убедиться, что сохранили URL-адрес, чтобы он НЕ включал бит "file: ///" в начало строки. Для этого убедитесь, что вы сохранили значение строкового пути, а не NSURL строкового пути, например:
NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath_ = [searchPaths objectAtIndex:0];
NSString *pathToSave = [documentPath_ stringByAppendingPathComponent:@"audioName.aif"];
Теперь сохраните NSString "pathToSave" в любом месте и используйте его, когда хотите загрузить файл. В результате URL-адрес аудиофайла будет сохранен следующим образом:
/var/mobile/Containers/Data/Application/45ABF4BD-FA0E-43F7-B936-7DE29D8F28ED/Documents/23Feb2015_074118pm.aif
Вы видите, что в начале у него нет бита «file: ///». Эта строка теперь будет работать с частью 1 этого ответа.
Надеюсь, это поможет любому, у кого есть похожие проблемы со мной.
Что-то вроде этого?
NSURL* assetURL = [NSURL URLWithString:@"file://your-file.aif"];
AVURLAsset* asset = [AVURLAsset URLAssetWithURL:assetURL options:nil];
Похожие вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.