使用他的路径获取音频文件的信息 - Objective-c iOS

Posted

技术标签:

【中文标题】使用他的路径获取音频文件的信息 - Objective-c iOS【英文标题】:Get info of audio file with his path - 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 解决方案或不工作的解决方案)。

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

提前致谢

【问题讨论】:

【参考方案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];

【讨论】:

以上是关于使用他的路径获取音频文件的信息 - Objective-c iOS的主要内容,如果未能解决你的问题,请参考以下文章

java 怎么获取音频文件时长

安卓获取多媒体(包括 视频音频图片)数据

获取音频文件的路径问题

WPF C#,从音频文件中获取信息

如何将从blob url获取的音频数据保存到mysql db中的文件系统和路径中

获取视频文件格式信息的工具和方法