2015-02-22 3 views
4

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

Для того, чтобы сохранить URL, записанных звуковых файлов, я их хранение в NSUserDefaults качестве путей файлов, как так:

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

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'

И это потому, что библиотека, я использую, использует 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?

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

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

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

ответ

4

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

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-адрес так, чтобы он NOT включал бит «file: ///» в начале строки. Для того, чтобы сделать это, убедитесь, что вы сохраните значение строки пути и не NSURL строкового пути, как так:

NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentPath_ = [searchPaths objectAtIndex:0]; 
    NSString *pathToSave = [documentPath_ stringByAppendingPathComponent:@"audioName.aif"]; 

Теперь спасти «pathToSave» NSString туда, где вы хотите, и использовать его, когда вы хотите загрузить файл.Делая это приведет к аудио URL файла сохраняются следующим образом:

/var/mobile/Containers/Data/Application/45ABF4BD-FA0E-43F7-B936-7DE29D8F28ED/Documents/23Feb2015_074118pm.aif

Вы видите, что не имеет «файл: ///» бит на старте. Эта строка теперь будет работать с частью 1 этого ответа.

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

+1

Ничего себе это действительно спасло меня. Я был удивлен, что этот ответ так трудно найти. Спасибо! –

+0

В противном случае для удаления «file: //» просто do '[yourURL path]' будет работать. – iPatel

0

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

NSURL* assetURL = [NSURL URLWithString:@"file://your-file.aif"]; 
AVURLAsset* asset = [AVURLAsset URLAssetWithURL:assetURL options:nil]; 
+1

Только что попробовал, и это не сработало :(Любые другие идеи? – Supertecnoboff

+0

Спасибо за помощь, кстати. – Supertecnoboff

 Смежные вопросы

  • Нет связанных вопросов^_^