AVAsset не распознает NSURL — сбой — iOS

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

Чтобы сохранить URL-адреса записанных аудиофайлов, я сохраняю их в NSUserDefaults как filePath следующим образом:

file:///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-адрес, пытался использовать AVAssets и так далее. Но все, что я пытаюсь, просто приходит с этой ошибкой:

Завершение работы приложения из-за необработанного исключения «NSRangeException», причина: «*** -[__NSArrayM objectAtIndex:]: индекс 0 за пределами пустого массива»

И это потому, что библиотека, которую я использую, использует AVAssets следующим образом:

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.

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

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


person Supertecnoboff    schedule 22.02.2015    source источник


Ответы (2)


Разобрался в итоге. Я сделал следующие изменения, чтобы заставить его работать:

1) Я использовал fileURLWithPath вместо URLWithString вот так:

NSURL *assetURL = [NSURL fileURLWithPath:passURL];
AVURLAsset *asset = [AVURLAsset assetWithURL:assetURL];

2) Раньше, когда я сохранял URL-адрес аудиофайла, я сохранял его как NSString следующим образом:

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

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

person Supertecnoboff    schedule 23.02.2015
comment
Вау, это действительно спасло меня. Я был удивлен, что этот ответ было так трудно найти. Спасибо!! - person Olivia Stork; 18.08.2015
comment
В противном случае для удаления файла://' просто выполните [yourURL path], и это сработает. - person iPatel; 10.09.2016

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

NSURL* assetURL = [NSURL URLWithString:@"file://your-file.aif"];
AVURLAsset* asset  = [AVURLAsset URLAssetWithURL:assetURL options:nil];
person Thorsten    schedule 22.02.2015
comment
Только что попробовал, и это не сработало :( Есть другие идеи? - person Supertecnoboff; 23.02.2015
comment
Кстати, спасибо за помощь. - person Supertecnoboff; 23.02.2015