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

标签 iphone objective-c url mp3 id3

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

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

我尝试这样做:

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

但这需要时间,尤其是当文件很大时。 请问有什么想法吗?

最佳答案

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

您要读取哪个 ID3 标签版本?

ID3v1 标签位于文件末尾的最后 128 个字节中。使用 Net::HTTP 似乎不可能向前查找文件末尾并仅读取最后 N 个字节。如果您尝试使用 headers = {"Range"=> "bytes=128-"} ,它似乎总是下载完整的文件。 resp.body.size => 文件大小。但没有什么大的损失,因为 ID3 版本 1 由于它的局限性(例如固定长度格式、只有 ASCII 文本等),目前已经过时了。 iTunes 使用 ID3 版本 2.2.0。

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

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

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


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

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

然后,您可以使用您最喜欢的 HTTP 库(无论您使用哪种语言)打开 HTTP 连接,但请确保 HTTP 协议(protocol)的版本 >= 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 header 字段的格式:

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

例如这是 Range header 的语法:

 Range: bytes=0-1000

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

关于iphone - 获取ID3标签而不下载iPhone应用程序中的整个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15944665/

相关文章:

iphone - 从 iPhone 应用程序中启动指南针应用程序

iphone - Xcode - scribble, guard edges 和 guard malloc

objective-c - 将 NSString 转换为 char 问题

css - 当我哈希链接到一个 ID 时,为什么我的页面看起来不一样?

iphone - 在iPhone上写入SQLite数据库时,我可以读取它吗?

c# - NSUserDefaults-Xamarin

objective-c - Swift 中的故障安全断言

objective-c - Mac 应用程序下载、验证(通过 md5)并运行另一个大型应用程序?

java - 如何制作基于 Java 的图标 URL

MYSQL 服务器 - 如果不为空则只更新值