美文网首页iOS OC 学习手册
iOS如何获取本地的音乐歌曲mp3的信息数据

iOS如何获取本地的音乐歌曲mp3的信息数据

作者: 高级搬砖工 | 来源:发表于2016-07-21 10:30 被阅读3704次

    今天在做一款音乐播放器的时候需要支持文件共享本地导入音乐,但是导入进去的mp3是只有歌曲名字加格式的,有些甚至歌曲名字都不对只是一个.mp3文件,例如:

    本地mp3文件.png

    但是这时候我们的界面上是需要显示歌曲的信息的,歌手,歌曲名字,专辑,缩略图等等信息,其实这些信息在.mp3里面是可以找到的,但是也不能全找到。估计是这些生成的时候没有加到里面,话不多说直接进入正题。这里以我的用法为例,可根据自己情况灵活变动。

    • 获取到mp3文件(我这里是获取的所有文件放到数组。如不需要可以单个获取)
      NSArray *mp3Array = [NSBundle pathsForResourcesOfType:@"mp3" inDirectory:[[NSBundle mainBundle] resourcePath]];

    • 遍历数组得到每个文件的路径并得到AVURLAsset的对象
      for (NSString *filePath in mp3Array) {
      NSURL *url = [NSURL fileURLWithPath:filePath];
      NSString *MusicName = [filePath lastPathComponent];
      AVURLAsset *mp3Asset = [AVURLAsset URLAssetWithURL:url options:nil];
      NSLog(@"%@",mp3Asset);

    • 获取文件中数据格式类型
      for (NSString *format in [mp3Asset availableMetadataFormats]) {

    • 获取特定格式类型
      for (AVMetadataItem *metadataItem in [mp3Asset metadataForFormat:format]) {
      NSLog(@"commonKey = %@",metadataItem.commonKey);

                if ([metadataItem.commonKey isEqualToString:@"artwork"]) {
                    NSString *mime = [(NSDictionary *)metadataItem.value objectForKey:@"MIME"];
                    NSData *data = [(NSDictionary *)metadataItem.value objectForKey:@"data"];
                    UIImageView.image = [UIImage imageWithData:data];
                    NSLog(@"mime: %@",mime);
                    
                }
                else if([metadataItem.commonKey isEqualToString:@"title"])
                {
                    NSString *title = (NSString *)metadataItem.value;
                    NSLog(@"title: %@",title);
                    
                }
                else if([metadataItem.commonKey isEqualToString:@"artist"])
                {
                    NSString *artist = (NSString *)metadataItem.value;
                    NSLog(@"artist: %@",artist);
                    
                }
                else if([metadataItem.commonKey isEqualToString:@"albumName"])
                {
                    NSString *albumName = (NSString *)metadataItem.value;
                    NSLog(@"albumName: %@",albumName);
                    
                }
      

    以上就是具体如何获取本地的歌曲信息了。如有不明白可参考这篇内容:

    关于AVFoundation

    • 下面为大家贴上本人在项目中的实例应用代码:

        + (NSMutableArray *)MusicInfoArray
      {
       NSMutableArray *resultArray = [[NSMutableArray alloc] init];
      NSArray *mp3Array = [NSBundle pathsForResourcesOfType:@"mp3" inDirectory:[[NSBundle mainBundle] resourcePath]];
      
      for (NSString *filePath in mp3Array) {
        NSURL *url = [NSURL fileURLWithPath:filePath];
        NSString *MusicName = [filePath lastPathComponent];
        AVURLAsset *mp3Asset = [AVURLAsset URLAssetWithURL:url options:nil];
        NSLog(@"%@",mp3Asset);
        for (NSString *format in [mp3Asset availableMetadataFormats]) {
            NSMutableDictionary *infoDict = [[NSMutableDictionary alloc] init];
            [infoDict setObject:MusicName forKey:@"MusicName"];
            NSLog(@"format type = %@",format);
            for (AVMetadataItem *metadataItem in [mp3Asset metadataForFormat:format]) {
                NSLog(@"commonKey = %@",metadataItem.commonKey);
                
                if ([metadataItem.commonKey isEqualToString:@"artwork"]) {
                    NSString *mime = [(NSDictionary *)metadataItem.value objectForKey:@"MIME"];
                    NSLog(@"mime: %@",mime);
                    
                    [infoDict setObject:mime forKey:@"artwork"];
                }
                else if([metadataItem.commonKey isEqualToString:@"title"])
                {
                    NSString *title = (NSString *)metadataItem.value;
                    NSLog(@"title: %@",title);
                    
                    [infoDict setObject:title forKey:@"title"];
                }
                else if([metadataItem.commonKey isEqualToString:@"artist"])
                {
                    NSString *artist = (NSString *)metadataItem.value;
                    NSLog(@"artist: %@",artist);
                    
                    [infoDict setObject:artist forKey:@"artist"];
                }
                else if([metadataItem.commonKey isEqualToString:@"albumName"])
                {
                    NSString *albumName = (NSString *)metadataItem.value;
                    NSLog(@"albumName: %@",albumName);
                    
                    [infoDict setObject:albumName forKey:@"albumName"];
                }
            }
            
            [resultArray addObject:infoDict];
        }
      }
      
      return resultArray;
      }
      

    每一次的学习和记录都是成长道路上的一小步。

    相关文章

      网友评论

      • __阳阳:你好, 问下这样获取到的音乐文件能不能拿来上传到自己服务器上?
      • 愚虫:好像不行
        高级搬砖工:@平仄云_38da 断电调试一下。看看值对不对
        a355f639d2ef:获取缩略图不行,有缩略图的文件 会奔溃
        高级搬砖工:@愚虫 是可以的,我现在线上的项目还在用这个

      本文标题:iOS如何获取本地的音乐歌曲mp3的信息数据

      本文链接:https://www.haomeiwen.com/subject/lzkbjttx.html