2013-04-11 54 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

相關問題