您的位置:首页 > 移动开发 > IOS开发

ios获取媒体资源以及媒体信息(元数据)---AVAsset

2016-06-12 00:00 537 查看
摘要: AVAsset是AVFoundation设计中的核心,它为一个面向资源的开发类。其定义了媒体资源混合呈现的方式,将媒体资源的静态属性模块化成一个整体,如标题,市场、元数据等。
AVMetadataItem是苹果为我们封装好的类,使用它我们可以打印出媒体文件的相关信息。如当我们拿到一首不知名的MP3时,我们可以通过其打印出这首歌的相关信息(歌名、歌手等)。

AVAsset它可以作为一个盛放媒体类型文件的容器,如我们获取系统相册中的视频、ipod中的视频、音乐类型的文件时,获取到的文件就可以放到AVAsset中。它是很强大的,在我理解它就像一个锅,一个盛放各种媒体资源的锅。无论你媒体资源是什么格式,我的这口锅都能把你变成一盘好菜。同时,在得到媒体文件的同时,我们也可以通过AVAsset访问其一些具体的信息,比如标题等等媒体文件中封装附带给我们的信息。

一、AVAsset简介,以及创建

AVAsset可以带给我们的方便:

1、无论是处理影片、MPEG-4的视频、MP3格式的音频等等,其都可以胜任。对于我们而言我们不用考虑是什么放在它内的媒体资源是什么类型,我们只需要面对AVAsset中的资源,对资源操作就可以了。

2、AVAsset获取资源我们只需要通过对应的URL就行。此URL可以是本地也可以是远程,其也就意味这它的创建可以直接通过URL,因为媒体文件的类型啊什么的,AVAsset可以自动处理。

[code=plain]NSURL *url = [NSURL URLWithString:@""];
AVURLAsset *asset = [[AVURLAsset alloc]initWithURL:url options:nil];  //options是一个字典,此种可以配置一                                                           些比较详细的媒体要求比如更加精确的时长和计时信息等

二、AVMetadataItem以及元数据的理解和操作

AVMetadataItem:当我们得到一个包含元数据项的数组的时候,通常希望找到所需要的具体元数据值。此时AVMetadataItem就特别方便。例如我们想得到一个M4A音频文件的歌手名称和歌曲的元数据,只需按照特定的方法进行查找(了解下,此处就不写具体的案例实现了,因为牵扯到数据格式、键空间、key的一些配置,需要罗列出来进行单独的阐明。但是这些东西不是此片文章的重点)。

元数据:简单的来讲元数据就是对数据的描述,比如我们得到的媒体文件其内部就“封装”了对这些数据的描述,以及数据的一些信息。可以这样理解,如mp3类文件,其内部就有对音频数据的描述如通道、标题等等的一些附带数据。有时候我们可以通过对元数据操作得到我们想要的信息。下面会有一个通过代码访问到一个mp3文件的歌曲名的相关代码。

[code=plain]NSURL *url = [[NSBundle mainBundle] URLForResource:@"song" withExtension:@"mp3"]; //往项目中拖入一个MP3                                                                                  类型的未知歌曲文件
AVAsset *asset   = [AVAsset assetWithURL:url];              //将文件放入AVAsset中,可以执行下面的查找操作
NSMutableArray *metadata = [NSMutableArray array];
for (NSString *format in asset.availableMetadataFormats) {  //使用availableMetadataFormats可以查询到媒体文件的元数据格式都有哪些,会返回一个字符串数组,里面包含了媒体文件中所有的元数据格式信息,如dataType(数据类型),title(标题)等等

[metadata addObjectsFromArray:[asset metadataForFormat:format]];  //metadataForFormat包含一个用于                                               定义元数据格式的NSString对象并返回一个定义好的元数据信息的数组
NSLog(@"%ld",metadata.count);
for (AVMetadataItem* meta in metadata) {
NSLog(@"meta--%@",meta);
}
}

在下面打印结果中value=Reality和value=Lost Frequencies分别是歌曲名称和歌手



不同类型的媒体文件中包含不同的元数据信息。大多数时候我们需要自己进行判断是否元数据中提供给我那些关于媒体数据的信息。此外当遇到大量数据需要处理的情况下有一个异步加载的方法可以供我们使用

loadValuesAsynchronouslyForKeys: completionHandler:

[code=plain]-(void)getInfoOfMusic{

//取得资源
NSURL *fileURL=[NSURL fileURLWithPath:filePath];
AVURLAsset *mp3Asset=[AVURLAsset URLAssetWithURL:fileURL options:nil];

NSFileManager *manage = [NSFileManager defaultManager];
NSDictionary *fileAtt = [manage attributesOfItemAtPath:filePath error:nil];

NSString *singer;//歌手
NSString *song;//歌曲
UIImage  *image;//图片
NSString *albumName;//专辑名
NSString *fileSize;//文件大小
NSString *voiceStyle;//音质类型

//根据歌曲计算
for (NSString *format in [mp3Asset availableMetadataFormats]) {
for (AVMetadataItem *metadataItem in [mp3Asset metadataForFormat:format]) {
if([metadataItem.commonKey isEqualToString:@"title"]){
song = (NSString *)metadataItem.value;//歌曲名

}else if ([metadataItem.commonKey isEqualToString:@"artist"]){
singer = (NSString *)metadataItem.value;//歌手
}
//            专辑名称
else if ([metadataItem.commonKey isEqualToString:@"albumName"])
{
albumName = (NSString *)metadataItem.value;

}else if ([metadataItem.commonKey isEqualToString:@"artwork"]) {//图片生成

NSDictionary *dict=(NSDictionary *)metadataItem.value;
NSData *data=[dict objectForKey:@"data"];
image=[UIImage imageWithData:data];//图片
}
}
}
//根据文件计算
//计算大小
float tempFlo = [[fileAtt objectForKey:@"NSFileSize"] floatValue]/(1024*1024);
fileSize = [NSString stringWithFormat:@"%.2fMB",[[fileAtt objectForKey:@"NSFileSize"] floatValue]/(1024*1024)];
//日期
NSString *tempStrr  = [NSString stringWithFormat:@"%@", [fileAtt objectForKey:@"NSFileCreationDate"]] ;

//根据音频大小判断音质
if(tempFlo <= 2){
voiceStyle = @"普通";
}else if(tempFlo > 2 && tempFlo <= 5){
voiceStyle = @"良好";
}else if(tempFlo > 5 && tempFlo < 10){
voiceStyle = @"标准";
}else if(tempFlo > 10){
voiceStyle = @"高清";
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: