无需在iphone应用程序中下载整个文件即可获取ID3标签?

时间:2013-04-11 09:01:41

标签: iphone objective-c url mp3 id3

是否可以在不下载孔文件的情况下获取ID3标签(尤其是持续时间)?

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

我试过这样做:

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

但是它需要时间,特别是当它是一个大文件时。 好吗?

1 个答案:

答案 0 :(得分:2)

简答:是如果是ID3v2标签

您想要阅读哪个ID3标签版本?

ID3v1标记位于文件的末尾,最后128个字节。使用Net :: HTTP,似乎不可能向前搜索文件的末尾并且只读取最后N个字节。如果您尝试使用headers = {“Range”=> “bytes = 128-”},似乎总是下载完整的文件。 resp.body.size =>文件大小 。但没有大的损失,因为ID3版本1在这一点上已经过时,因为它的局限性,例如固定长度格式,只有ASCII文本,......)。 iTunes使用ID3版本2.2.0。

ID3v2标签位于文件的开头 - 支持流式传输 - 您可以通过HTTP协议> = 1.1下载MP3文件的初始部分,其中包含ID3v2标头

之前我回答了几乎相同的问题,这是专门针对Ruby实现的。

请查看此问题: Read ID3 Tags of Remote MP3 File in Ruby/Rails?


<强>续.. 我提到的另一个问题中的Ruby代码是一个功能完备的例子。

您可以设置要获取的预定字节大小,该大小足以让您认为它包含完整的ID3标记,例如1000字节

然后使用您喜欢的HTTP库打开HTTP连接,无论您使用何种语言,但请确保HTTP协议的版本是&gt; = 1.1,并使用HTTP选项“Range”读取前1000个字节“,它只从您尝试通过HTTP访问的文件中下载给定范围的字节。

iOS上的具体实现取决于您使用的库。

以下是Objective-C中GET请求的示例:   Simple objective-c GET request

您需要做的就是将Range-header传递给请求,该请求指定范围。

请参阅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

e.g。这是Range标头的语法:

 Range: bytes=0-1000

您需要通过addValue:forHTTPHeaderField实例方法设置此标头。