博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
获取音视频文件AVMetadata数据
阅读量:5823 次
发布时间:2019-06-18

本文共 1990 字,大约阅读时间需要 6 分钟。

  • 做音乐播放器应用有时候需要获取音乐文件的一些数据信息,比如该音乐文件中的封面图片,艺人名,专辑名等,如何获取呢?本人抛砖引玉,写一个获取封面图片的类供大家参考.
  • 创建一个工具类

    #import 
    #warning 需要引入AVFoundation.framework@interface AVMetadataInfo : NSObject/**获取音视频文件的Metadata信息(可以获取到mp3以及m4a的相关信息)*AVMetadataCommonKeyArtwork这个参数是可以换的,换不同的参数可以取得不同的值*[注意]此方法中用到了信号量将异步操作转换成了同步操作,尽量在主线程中使用@param fileURL 文件的URL地址@return 一个包含了相关内容的字典*/+ (NSDictionary *)dataInfoFromFileURL:(NSURL *)fileURL;复制代码

  • 实现方法

    + (NSDictionary *)dataInfoFromFileURL:(NSURL *)fileURL{    // 创建字典    NSMutableDictionary *dic = [NSMutableDictionary dictionary];    // 创建信号量(将异步变成同步)    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);        AVAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil];    [asset loadValuesAsynchronouslyForKeys:@[@"commonMetadata"]                        completionHandler:^{                            // 发送信号量                            dispatch_semaphore_signal(semaphore);                        }];    // 无限等待    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);    // 获取数据    NSArray *artworks = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata                                                    withKey:AVMetadataCommonKeyArtwork                                                    keySpace:AVMetadataKeySpaceCommon];    for (AVMetadataItem *item in artworks){        if ([item.keySpace isEqualToString:AVMetadataKeySpaceID3]){            NSDictionary *dict = [item.value copyWithZone:nil];                        // 获取图片            UIImage  *image = [UIImage imageWithData:[dict objectForKey:@"data"]];            [dic setObject:image forKey:@"Artwork"];        }        if ([item.keySpace isEqualToString:AVMetadataKeySpaceiTunes]){            // 获取图片            UIImage *image = [UIImage imageWithData:[item.value copyWithZone:nil]];            [dic setObject:image forKey:@"Artwork"];        }    }    return [NSDictionary dictionaryWithDictionary:dic];}复制代码

转载于:https://juejin.im/post/5b8f77255188255c520ced66

你可能感兴趣的文章
2018我跳出了舒适区,发现自己缺的不仅是技术,另外还得探索其它挣钱渠道
查看>>
ajax及分页器
查看>>
angular源码分析6-脏值检测实现
查看>>
6、 restful API
查看>>
云时代架构读后感9--如何实现单点登录
查看>>
消息队列
查看>>
windows远程连接报:身份错误,函数不支持的解决办法
查看>>
Nginx篇--解读nginx配置
查看>>
The Elements of C# Style - Programming
查看>>
js焦点轮播图
查看>>
python day3
查看>>
实验1
查看>>
DispatcherServlet 前置控制器
查看>>
Lambda
查看>>
使用Prometheus和Grafana监控服务
查看>>
现阶段如何开始使用v-ray for unrealengine
查看>>
Flume总结(1)--单个agent采集的基本配置
查看>>
SpringBoot整合Kafka和Storm
查看>>
引用数据类型的深拷贝
查看>>
C++ Primer笔记----第十六章 模板和泛型编程
查看>>