【问题标题】:Get info of audio file with his path - Objective-c iOS使用他的路径获取音频文件的信息 - Objective-c iOS
【发布时间】:2016-05-23 10:42:58
【问题描述】:

实际上,我正在用这段简单的代码播放一首歌:

    NSURL *url=[NSURL fileURLWithPath:clickedPath];
    AVPlayer *player = [AVPlayer playerWithURL:url];


    AVPlayerViewController *controller = [[AVPlayerViewController alloc] init];
    [self presentViewController:controller animated:YES completion:nil];
    controller.player = player;
    [player play];

我想做的是使用一个自定义视图显示歌曲的信息(艺术家、专辑名称和艺术作品等),该视图由 AVPlayerViewController 的 contentOverlayView 属性显示。 我在这里到处搜索,但没有发现任何对我的案例有用的东西(找到 MPMediaPlayer 解决方案或不工作的解决方案)。

你能帮帮我吗?我愿意测试您的建议并进行讨论!

提前致谢

【问题讨论】:

    标签: ios objective-c audio avplayer


    【解决方案1】:
    NSString *path = [[NSBundle mainBundle] pathForResource:@"youraudiomp3filename" ofType:@"mp3"];
    
    NSURL *url=[NSURL fileURLWithPath:path];
    AVPlayer *player = [AVPlayer playerWithURL:url];
    
    AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
    
    NSArray *metadata = [asset commonMetadata];
    NSString *title;
    NSString *artist;
    NSString *albumName;
    UIImageView *imageView;
    for (AVMetadataItem *item in metadata) {
        if ([[item commonKey] isEqualToString:@"title"]) {
            title = (NSString *)[item value];
        }
    
        if ([[item commonKey] isEqualToString:@"artist"]) {
            artist = (NSString *)[item value];
        }
    
        if ([[item commonKey] isEqualToString:@"albumName"]) {
            albumName = (NSString *)[item value];
        }
    
        if ([[item commonKey] isEqualToString:@"artwork"]) {
            NSData *data = [(NSDictionary *)[item value] objectForKey:@"data"];
            UIImage *img = [UIImage imageWithData:data] ;
            imageView.image = img;
            continue;
        }
    }
    

    然后您可以将资产设置为您的 AVPlayerViewController 的播放器,播放和呈现。

    【讨论】:

    • 感谢您的回答,将尽快尝试!我假设 NSString 路径可以替换为完整文件的路径?我想替换它,因为 tableview 的填充取决于 Document 文件夹的内容,而播放的歌曲取决于用户选择的内容!
    • 是的,你可以使用完整的文件路径
    • 例如第一个"变量在NSLog中正确显示,但是当获取专辑封面的时候,应用程序崩溃了。这是崩溃日志:2016-05-24 12:55: 43.654 FileStore[247:6669] -[__NSCFData objectForKey:]:无法识别的选择器发送到实例 0x137e3e290 2016-05-24 12:55:43.656 FileStore[247:6669] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因: '-[__NSCFData objectForKey:]: unrecognized selector sent to instance 0x137e3e290'. 你知道为什么 objectForKey 不能被项目对象识别吗?
    • 我试过 NSData *data = [item.value copyWithZone:nil];该应用程序不再崩溃,但是当我尝试显示 UIImageView 时,里面什么都没有,所以我认为数据中的 img 没有得到
    • 我已经解决了这个问题,看我的回答!但是,当您将我引向正确的方式时,我会将您的标记为正确的!再次感谢:)
    【解决方案2】:

    感谢@L A 的帮助,我已经成功地获得了所有歌曲的信息:

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    
    
            NSURL *url=[NSURL fileURLWithPath:clickedPath];
            NSLog(@"url : %@", url);
            avPlayer = [AVPlayer playerWithURL:url];
    
    
            AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
    
            NSArray *metadata = [asset commonMetadata];
            NSString *songTitle;
            NSString *artist;
            NSString *albumName;
            UIImageView *albumImageView = [[UIImageView alloc] init];
    
    
            for (AVMetadataItem *item in metadata) {
    
                if ([[item commonKey] isEqualToString:@"title"]) {
    
                    songTitle = (NSString *)[item value];
                    NSLog(@"song title : %@", songTitle);
    
                }
    
                if ([[item commonKey] isEqualToString:@"albumName"]) {
    
                    albumName = (NSString *)[item value];
                    NSLog(@"album name : %@", albumName);
    
                }
    
                if ([[item commonKey] isEqualToString:@"artist"]) {
    
                    artist = (NSString *)[item value];
                    NSLog(@"song artist : %@", artist);
    
                }
    
                if ([[item commonKey] isEqualToString:@"artwork"]) {
    
                    NSData *data = [item dataValue];
                    UIImage *img = [UIImage imageWithData:data] ;
                    albumImageView.image = img;
                    [albumImageView setTranslatesAutoresizingMaskIntoConstraints:NO];
                    continue;
    
                }
            }
    
    
            AVPlayerViewController *controller = [[AVPlayerViewController alloc] init];
            [self presentViewController:controller animated:YES completion:nil];
            [controller.contentOverlayView addSubview:albumImageView];
            controller.player = avPlayer;
            [avPlayer play];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      相关资源
      最近更新 更多