AVAsset 无法识别 NSURL - 崩溃 - iOS
AVAsset not recognising NSURL - Crashing - iOS
我正在制作一个 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。就像我在上面的问题中显示的文件路径URL。
我尝试了各种方法,例如尝试将文件路径 "convert" 转换为正常的 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 一起工作呢?
记住我试图让它查看应用程序保存的录制音频文件,不是本地导入的音频文件,开发人员可以将其添加到Xcode 项目。
我已经被困在这几天了,如果你能帮助我,那将不胜感激,谢谢。
谢谢你的时间,丹。
是这样的吗?
NSURL* assetURL = [NSURL URLWithString:@"file://your-file.aif"];
AVURLAsset* asset = [AVURLAsset URLAssetWithURL:assetURL options:nil];
最后想通了。我进行了以下更改以使其正常工作:
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
你看它的开头没有 "file:///" 位。该字符串现在可用于此答案的第 1 部分。
希望这对遇到与我类似问题的人有所帮助。
我正在制作一个 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。就像我在上面的问题中显示的文件路径URL。
我尝试了各种方法,例如尝试将文件路径 "convert" 转换为正常的 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 一起工作呢?
记住我试图让它查看应用程序保存的录制音频文件,不是本地导入的音频文件,开发人员可以将其添加到Xcode 项目。
我已经被困在这几天了,如果你能帮助我,那将不胜感激,谢谢。
谢谢你的时间,丹。
是这样的吗?
NSURL* assetURL = [NSURL URLWithString:@"file://your-file.aif"];
AVURLAsset* asset = [AVURLAsset URLAssetWithURL:assetURL options:nil];
最后想通了。我进行了以下更改以使其正常工作:
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
你看它的开头没有 "file:///" 位。该字符串现在可用于此答案的第 1 部分。
希望这对遇到与我类似问题的人有所帮助。