从 Objective-C 或 Swift 的文档目录中检索音频文件,例如 mp3

问题描述 投票:0回答:1

我想在用户的文档目录中存储和检索音频文件,例如 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;
}

感谢您的建议

ios swift objective-c avfoundation nsdocumentdirectory
1个回答
0
投票

这是检查输入的文件是否为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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.