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

今天在做一款音乐播放器的时候需要支持文件共享本地导入音乐,但是导入进去的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;
    }
    

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容