iOS:获取文件的元数据

我在服务器上有一个mp3文件。 我想得到这个文件的信息,比如这个文件的大小,艺术家名称是什么,专辑名称是什么,文件创建时间,修改时间等等。我想要所有这些信息。

是否可以在不实际下载整个文件的情况下获取此信息? 使用NSURLConnection还是其他?

编辑:

以下代码未向我提供所需信息,即由艺术家姓名等创建的文件

  NSError *rerror = nil; NSURLResponse *response = nil; NSURL *url = [NSURL URLWithString:@"http://link.to.mp3"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"HEAD"]; NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&rerror]; NSString *resultString = [[[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding] autorelease]; NSLog(@"URL: %@", url); NSLog(@"Request: %@", request); NSLog(@"Result (NSData): %@", result); NSLog(@"Result (NSString): %@", resultString); NSLog(@"Response: %@", response); NSLog(@"Error: %@", rerror); if ([response isMemberOfClass:[NSHTTPURLResponse class]]) { NSLog(@"AllHeaderFields: %@", [((NSHTTPURLResponse *)response) allHeaderFields]); } 

“AllHeaderFields”是:

 AllHeaderFields: { "Cache-Control" = "max-age=0"; Connection = "keep-alive"; "Content-Encoding" = gzip; "Content-Type" = "text/plain; charset=ascii"; Date = "Fri, 17 Feb 2012 12:44:59 GMT"; Etag = 19202n; Pragma = public; Server = dbws; "x-robots-tag" = "noindex,nofollow"; } 

是的,不是。 文件大小和修改日期等内容通常作为HEAD响应的一部分。 但并非总是如此:使用大量动态url,您将无法获得所有信息。

至于艺术家和专辑名称,它们是MP3的ID3的一部分,它包含在文件中,因此您将无法通过HEAD请求获取它们。 由于ID3标记通常位于文件的开头,因此您可以尝试仅抓取该部分,然后读取ID3标记。 但是你无法使用NSURLConnection来实现它,因为它不支持仅获取文件的一部分,所以你需要找到一种更低级的HTTP获取数据的方法。

在不下载整个文件或使用低级API的情况下,很可能将ID3信息嵌入到MP3文件(艺术家姓名,曲目标题)中。 该function是AVFoundation框架的一部分。

要查看的类是AVAsset ,特别是它的网络友好子类AVURLAssetAVAsset具有名为commonMetadataNSArray属性。 此commonMetadata属性将包含AVMetadataItem实例,当然假设引用URL包含元数据。 您通常会使用AVMetadataItemcommonKey属性来引用该项。 我发现这种迭代通过数组检查commonKeys方法很commonKeys因此我创建了一个NSDictionary使用commonKey属性作为keyvalue属性作为object 。 像这样:

 -(NSDictionary *)dictionaryOfMetadataFromAsset:(AVAsset *)asset{ NSMutableDictionary *metaData = [[NSMutableDictionary alloc] init]; for (AVMetadataItem *item in asset.commonMetadata) { if (item.value && item.commonKey){ [metaData setObject:item.value forKey:item.commonKey]; } } return [metaData copy]; } 

通过添加这种简单的方法, AVAsset的元数据变得非常容易使用。 以下是通过URL获取MP3元数据的示例:

 NSURL *mp3URL = [NSURL URLWithString:@"http://'AddressOfMP3File'"]; AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:mp3URL options:nil]; NSDictionary *metaDict = [self dictionaryOfMetadataFromAsset:asset]; NSLog(@"Available Metadata :%@",metaDict.allKeys); NSLog(@"title:%@",[metaDict objectForKey:@"title"]); 

我发现这段代码似乎只加载MP3文件的前几秒。 另请注意,此代码是同步的; 所以要谨慎使用。 但是AVURLAsset确实具有文档中描述的一些异步function。

拥有AVAsset您可以使用它创建AVPlayerItem并将其提供给AVPlayer并播放或不播放。

是的,你的目标是NSURLConnection。

我想你想发送一个HEAD请求你想要了解的资源,然后检查你在connection:didReceiveResponse:收到的信息connection:didReceiveResponse:connection:didReceiveData:

编辑

诚然,我没有完整地阅读你的问题。 获取ID3信息是不可能的,但您应该能够获得文件大小和创建日期等。

这个答案确实提供了一些关于如何获取ID3信息的好信息。 您需要设置一个php页面来检查服务器端的mp3文件并返回您需要的信息而不是整个mp3。