AVAsset无法识别NSURL - 崩溃 - iOS。

4
我正在制作一款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”这段代码,我想替换它并且让应用程序使用filePath URL代替。就像我在问题中展示的filePath URL那样。
我尝试了各种方法,比如试图将“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];

那么我如何使用文件路径URL使AVAsset正常工作呢?

请记住,我正在尝试查看应用程序保存的录制音频文件,而不是开发人员可以添加到Xcode项目中的本地导入音频文件。

我已经困在这里好几天了,如果您能帮助我,那将不胜感激,谢谢。

感谢您的时间,丹。

2个回答

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时不要在字符串开头包含"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
您可以看到它没有以“file:///”开头的部分。这个字符串现在将与本答案的第一部分一起使用。
希望这能帮助任何和我有类似问题的人。

1
哇,这真的救了我。我很惊讶这个答案竟然这么难找到。谢谢!! - Olivia Stork
否则,要删除“file://”只需执行[yourURL path]即可。 - iPatel

0

像这样的东西?

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

1
刚刚尝试了一下,但是没有成功 :( 还有其他的想法吗? - Supertecnoboff
顺便感谢你的帮助。 - Supertecnoboff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接