如何在Objective-C中从Documents目录获取MP3等音频文件?
问题
我需要在用户的Documents目录中存储和检索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; }
我尝试用类似方法处理音频,但代码无法编译——AVPlayerItem并没有objectWithContentsOfFile方法。同时我也不确定AVPlayerItem是否是正确的返回类型:我不想仅播放音频,而是要获取实际的.mp3文件用于邮件分享等场景。
请问如何修改以下代码,实现从Documents目录获取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; }
解决方案
因为你需要的是获取实际音频文件用于分享,而非仅播放,所以AVPlayerItem并不合适——它是用于播放逻辑的封装对象,不是文件本身。推荐两种更贴合需求的实现方式:
方式1:获取音频文件的NSData(适合直接传递数据分享)
如果需要直接拿到文件的二进制数据,可以返回NSData类型:
-(NSData*)getAudioDataNamed:(NSString*)name { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = paths.firstObject; NSString *filePath = [documentsDirectory stringByAppendingPathComponent:name]; // 先判断文件是否存在,避免返回无效数据 if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { return [NSData dataWithContentsOfFile:filePath]; } return nil; }
方式2:获取音频文件的NSURL(适合系统分享接口直接调用)
大部分iOS分享接口(比如邮件、AirDrop)支持直接传入文件URL,这种方式更高效(无需加载整个文件到内存):
-(NSURL*)getAudioFileURLNamed:(NSString*)name { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = paths.firstObject; NSString *filePath = [documentsDirectory stringByAppendingPathComponent:name]; if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { return [NSURL fileURLWithPath:filePath]; } return nil; }
额外提示
- 不要用
AVPlayerItem来获取文件:它是播放链路的一部分,和文件本身的获取、分享逻辑无关。 - 如果后续需要播放该音频,可通过上述方法拿到的
NSURL初始化AVPlayerItem:NSURL *audioURL = [self getAudioFileURLNamed:@"test.mp3"]; AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:audioURL];
内容的提问来源于stack exchange,提问作者user6631314
相关产品推荐
相关产品推荐

