Я делаю приложение для 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.

Я застрял на этом уже несколько дней, если вы можете мне помочь, я буду очень признателен, спасибо.

Спасибо за ваше время, Дэн.

4
Supertecnoboff 22 Фев 2015 в 19:01

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 этого ответа.

Надеюсь, это поможет любому, у кого есть похожие проблемы со мной.

4
Supertecnoboff 23 Фев 2015 в 19:51

Что-то вроде этого?

NSURL* assetURL = [NSURL URLWithString:@"file://your-file.aif"];
AVURLAsset* asset  = [AVURLAsset URLAssetWithURL:assetURL options:nil];
0
Thorsten 22 Фев 2015 в 22:05