是否可以在不下载孔文件的情况下获取ID3标签(尤其是持续时间)?
我需要从http网址获取mp3文件的持续时间。
我试过这样做:
AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
NSString *duration = [NSString stringWithFormat:@"%.2f",CMTimeGetSeconds(asset.duration)];
但是它需要时间,特别是当它是一个大文件时。 好吗?
答案 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传递给请求,该请求指定范围。
另请查看示例,了解Range标头字段的格式:
http://en.wikipedia.org/wiki/List_of_HTTP_header_fields
e.g。这是Range标头的语法:
Range: bytes=0-1000
您需要通过addValue:forHTTPHeaderField实例方法设置此标头。