2013-04-11 53 views
2

是否可以在不下载洞文件的情况下获取ID3标签(尤其是持续时间)?获取ID3标签而无需在iPhone应用程序中下载整个文件?

我需要从http url获取mp3文件的持续时间。

我试着这样做:

AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil]; NSString *duration = [NSString stringWithFormat:@"%.2f",CMTimeGetSeconds(asset.duration)];

,但它需要时间,特别是当它是一个很大的文件。 有什么想法吗?

回答

2

简短的回答:是的如果他们是ID3v2标签

其ID3标签版本是你想读什么书?

的ID3v1标签是在文件的结尾,在最后128个字节。使用Net :: HTTP,似乎不可能向文件结尾寻找并只读取最后N个字节。如果您尝试使用标题= {“范围” =>“字节= 128”},它似乎总是下载完整的文件。 resp.body.size =>文件大小。但是,没有大的损失,因为ID3第1版是在这一点上非常过时,因为它的局限性,如固定长度格式的,只有ASCII文本,...)。 iTunes使用ID3版本2.2.0。

ID3v2标签是在文件开头 - 支持流媒体 - 你可以下载MP3文件,该文件包含的ID3v2头的起始部分,通过HTTP协议> = 1.1

我回答漂亮以前的许多问题都是针对Ruby实现的。

请检查这个问题: Read ID3 Tags of Remote MP3 File in Ruby/Rails?


续.. 在我提到的其他问题的Ruby代码是一个全功能的例子。

您可以设置你认为它包含了完整的ID3标签,如您希望获取足够大的字节预定大小1000个字节

然后,您可以使用自己喜欢的HTTP库为你使用任何语言打开HTTP连接,但要确保在HTTP协议的版本为> = 1.1,以及你阅读使用HTTP选项的第一个1000个字节“范围”,它只从您尝试通过HTTP访问的文件下载给定范围的字节。

iOS上的具体实现要看你用什么库。

这里是GET请求在Objective-C的示例: Simple objective-c GET request

所有你需要做的是一个Range报头传递到请求,该请求指定的范围内。

见API:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableURLRequest_Class/Reference/Reference.html

同时检查的例子中的Range头部字段需要如何被格式化:

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

例如这是Range头的语法:

Range: bytes=0-1000 

你需要设置通过的addValue这个头:forHTTPHeaderField实例方法。

+0

谢谢,但问题是如何下载最初的部分并获取它? – 2013-04-11 09:15:15

+0

我加入了我的答案 - 请检查Mac Developer Library文档以了解方法调用的细节。 https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableURLRequest_Class/Reference/Reference.html – Tilo 2013-04-12 17:24:00

相关问题