我想在用户的文档目录中存储和检索音频文件,例如 MP3。 当我对图像执行此操作时,我可以简单地将文件作为 UIImage 获取。 但是,我正在努力思考使用什么格式来检索音频。
对于图像我可以做:
-(UIImage*)getImageNamed: (NSString*) name {
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString* path = [documentsDirectory stringByAppendingPathComponent:
[NSString stringWithString: name] ];
UIImage *img = [UIImage imageWithContentsOfFile:path];
return img;
}
return nil;
}
我正在尝试对音频使用类似的方法,但它无法编译,因为没有 objectWithContentsOfFile 这样的方法。另外,我不确定 AVPlayerItem 是返回音频文件的正确方法。 (我不想只从文档目录中的位置播放它,而是获取实际的 .mp3 文件以通过电子邮件等方式共享)
如何编辑以下代码以从文档目录中检索音频文件(例如 mp3)而不是图像?
-(id)getAudioFileNamed: (NSString*) name {
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString* path = [documentsDirectory stringByAppendingPathComponent:
[NSString stringWithString: name] ];
AVPlayerItem* item = [AVPlayerItem objectWithContentsOfFile:path];//pseudo method
return item;
}
return nil;
}
感谢您的建议
这是检查输入的文件是否为mp3格式的方法。
#import <UniformTypeIdentifiers/UniformTypeIdentifiers.h>
- (BOOL)isMP3FileAtURL:(NSURL *)url {
NSError *error = nil;
NSDictionary *resourceValues = [url resourceValuesForKeys:@[NSURLContentTypeKey] error:&error];
if (error) {
NSLog(@"Error retrieving file resource values: %@", error);
return NO;
}
UTType *contentType = resourceValues[NSURLContentTypeKey];
return [contentType conformsToType:UTTypeMP3];
}
将其集成到您的代码中,就像这样
-(id)getAudioFileNamed: (NSString*) name {
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString* path = [documentsDirectory stringByAppendingPathComponent:
[NSString stringWithString: name] ];
NSURL *url = [NSURL fileURLWithPath:path];
if ([self isMP3FileAtURL: url]) {
AVPlayerItem* item = [AVPlayerItem playerItemWithURL:url];//pseudo method
return item;
} else {
return nil;
}
}
return nil;
}
我调整了一下,使其更具可读性,所以最终应该是这样的。
- (nullable AVPlayerItem *)getAudioFileNamed:(NSString *)name {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithString: name]];
NSURL *url = [NSURL fileURLWithPath:path];
if ([self isMP3FileAtURL: url]) {
return [AVPlayerItem playerItemWithURL:url];
} else {
return nil;
}
}