获取 ID3 标签而不在 iphone 应用程序中下载整个文件?

Posted

技术标签:

【中文标题】获取 ID3 标签而不在 iphone 应用程序中下载整个文件?【英文标题】:fetch ID3 tags without downloading the whole file in iphone app? 【发布时间】:2013-04-11 09:01:41 【问题描述】:

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

我需要从 http url 获取 mp3 文件的时长。

我试过这样做:

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

但这需要时间,尤其是当它是一个大文件时。 请问有什么办法吗?

【问题讨论】:

【参考方案1】:

简短回答:是如果它们是 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 下载包含 ID3v2 标头的 MP3 文件的初始部分

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

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


继续.. 我提到的另一个问题中的 Ruby 代码是一个功能齐全的示例。

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

然后,您使用您最喜欢的 HTTP 库为您使用的任何语言打开一个 HTTP 连接,但请确保 HTTP 协议的版本是 >= 1.1 ,并且您使用 HTTP 选项“范围”读取前 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

例如这是 Range 标头的语法:

 Range: bytes=0-1000

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

【讨论】:

谢谢,但问题是如何下载初始部分并获取它? 我已添加到我的答案中 - 请查看 Mac 开发人员库文档以了解方法调用的详细信息。 developer.apple.com/library/mac/#documentation/Cocoa/Reference/…

以上是关于获取 ID3 标签而不在 iphone 应用程序中下载整个文件?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 支持的 ID3 标签中的 APIC 格式都有哪些?

ID3 标记 Objective-C

Scrollview 不显示其内容的顶部而不在 iphone 应用程序中向下滚动

使用 id3v2 获取 MP3 ID3 (V2) 标签

使用 Java ID3 标签库从 MP3 文件中获取图像

从 MP3 Streaming 获取 ID3 标签