You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:05:18