AVAsset无法识别NSURL - 崩溃 - iOS

时间:2015-02-22 16:01:48

标签: ios objective-c filepath nsurl avassetreader

我正在制作iOS应用。它的一个功能是它可以保存记录并保存音频文件。

为了保存录制的音频文件的URL,我将它们存储在NSUserDefaults中作为filePaths,如下所示:

  

文件:///var/mobile/Containers/Data/Application/17F8E799-D7E1-4B3C-9DFE-7BA48E346314/Documents/recordName.aif

我正在使用名为" FVSoundWaveDemo"尝试为录制的文件显示声波。但我的网址有问题......

" 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];

那么我如何获得AVAsset才能使用filePath URL?

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

我已经被困在这几天了,如果你可以帮助我,那将非常感谢,谢谢。

谢谢你的时间,Dan。

2 个答案:

答案 0 :(得分:4)

最终计算出来。我进行了以下更改以使其工作:

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这样的东西时,这不起作用。相反,您必须确保保存网址,以便包含" 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部分一起使用。

希望这可以帮助任何有类似问题的人。

答案 1 :(得分:0)

这样的事情?

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