2011-07-07 48 views
2

我有以下問題要問:從ID3標籤中獲取專輯封裝/從Java轉換功能到Objective-C

如何使用iOS應用程序編譯taglib?

我有點困惑,因爲我將文件夾添加到我的項目中,試圖編譯它,但它卻失敗了1640錯誤。

如何讓它成功編譯 - 我問的原因是taglib允許從標籤中提取專輯封面。

如果有人知道基於Objective-C的專輯圖片抽取類,它會有所幫助 - 我不知道爲什麼Apple在Core Foundation中沒有添加這樣做的方法 - 因爲有一些提取某些數據的方法來自ID3標籤。

我看不出爲什麼沒有一些 Objective-C的做法。

任何幫助表示讚賞。

編輯:

後在嘗試做這個小時小時,我發現一個Java函數here似乎做的工作很好,但我還沒有得到關於如何轉換線索它到Objective-C(或者更不用說C++),因爲它的類型看起來與Objective-C/C++中的類型完全不同。

如果有人知道一種方法來轉換它,它將真的幫助,因爲這似乎是我的最後一個選擇,因爲我已經嘗試了很多其他人。

+0

什麼樣的錯誤?你確定他們不是與標題欄搜索路徑或類似問題有關嗎? – Kay

+0

您是否真的嘗試過我在下面的第二條評論中關聯的討論?它清楚地說明了如何僅使用Apple的框架訪問ID3信息。 –

+0

是的,我做了,併成功地爲它獲得了藝術家,專輯和歌曲標題信息。我也能夠記錄標籤的內容,但專輯封面沒有固定的標籤。所以不知何故,我必須處理原始的ID3標籤,並以某種方式在那裏找到圖像。這是我不知道的一點。 –

回答

11
- (void)loadArtworksForFileAtPath:(NSString *)path completion:(void (^)(NSArray *))completion 
{ 
    NSURL *u = [NSURL fileURLWithPath:path]; 
    AVURLAsset *a = [AVURLAsset URLAssetWithURL:u options:nil]; 
    NSArray *k = [NSArray arrayWithObjects:@"commonMetadata", nil]; 

    [a loadValuesAsynchronouslyForKeys:k completionHandler: ^{ 
     NSArray *artworks = [AVMetadataItem metadataItemsFromArray:a.commonMetadata 
      withKey:AVMetadataCommonKeyArtwork keySpace:AVMetadataKeySpaceCommon]; 

     NSMutableArray *artworkImages = [NSMutableArray array]; 
     for (AVMetadataItem *i in artworks) 
     { 
      NSString *keySpace = i.keySpace; 
      UIImage *im = nil; 

      if ([keySpace isEqualToString:AVMetadataKeySpaceID3]) 
      { 
       NSDictionary *d = [i.value copyWithZone:nil]; 
       im = [UIImage imageWithData:[d objectForKey:@"data"]]; 
      } 
      else if ([keySpace isEqualToString:AVMetadataKeySpaceiTunes]) 
       im = [UIImage imageWithData:[i.value copyWithZone:nil]]; 

      if (im) 
       [artworkImages addObject:im]; 
     } 

     completion(artworkImages); 
    }]; 
} 
+0

謝謝soooo它有點修改完美的作品! –

+0

不適用於我。不知何故,它返回一個非空數組,元素個數爲-0。我能做什麼? – nemesis

+2

也許你可以澄清你的意思是一個非空數組與0個元素? – hatfinch

3

如果你只是想訪問已存儲在設備即從iPod應用上的音樂作品,然後檢查this article演示瞭如何使用蘋果提供的現有框架做,特別是MediaPlayer的框架。

如果不是,那麼提供更多關於您想要實現的信息的信息可能是明智的,並且還會提供您在嘗試編譯TagLib時遇到的錯誤示例。

編輯:

另一種解決方案可以是使用一個嵌入式網頁視圖並使用JavaScript庫如this one加載,解析和提取專輯封面?

+0

我不想從iPod庫中獲取音樂 - 他們是存儲在應用程序文檔目錄中的MP3和M4A文件。 TagLib輸出的大部分錯誤都是缺少文件(#include) - 我不太確定它們的位置。如果有任何可以直接導入到Xcode的框架可以幫助 - 因爲我只是將文件夾拖入我的項目中。 –

+1

@ jack-greenhill看看在[本論壇討論](http://www.iphonedevbook.com/forum/iphone-development-questions/805-reading-mp3-id-tags.html)上討論的任何內容是否有幫助。它使用iPhone本機框架來訪問自定義MP3文件中的ID3數據。除非你有這種方式處理第三方庫的經驗(*你的問題和評論建議不*),我建議遠離任何沒有明確說明它支持iOS的東西,並提供關於如何編譯的文檔;不幸的是TagLib既沒有。 –

+1

@ jack-greenhill像micpringle說的......第三方libs ...如果你真的想這樣做,你可以從這裏開始並按照下面的鏈接:http://stackoverflow.com/questions/6578080/how-do-i -create -aa-file-in-xcode-4/6580117#6580117 – Kay

6

這是@hatfinch上面的只是答案,但固定的和現在的工作。

- (void)artworksForFileAtPath:(NSString *)path block:(void(^)(NSArray *artworkImages))block 
{ 
    NSURL *url = [NSURL fileURLWithPath:path]; 
    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil]; 
    NSArray *keys = [NSArray arrayWithObjects:@"commonMetadata", nil]; 
    [asset loadValuesAsynchronouslyForKeys:keys completionHandler:^{ 
     NSArray *artworks = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata 
                  withKey:AVMetadataCommonKeyArtwork 
                  keySpace:AVMetadataKeySpaceCommon]; 

     NSMutableArray *artworkImages = [NSMutableArray array]; 
     for (AVMetadataItem *item in artworks) { 
      NSString *keySpace = item.keySpace; 
      if ([keySpace isEqualToString:AVMetadataKeySpaceID3]) { 
       NSDictionary *d = [item.value copyWithZone:nil]; 
       [artworkImages addObject:[UIImage imageWithData:[d objectForKey:@"data"]]]; 
      } else if ([keySpace isEqualToString:AVMetadataKeySpaceiTunes]) { 
       [artworkImages addObject:[UIImage imageWithData:[item.value copyWithZone:nil]]]; 
      } 
     } 
     if(block) { 
      block(artworkImages); 
     } 
    }]; 
}