2015-05-14 16 views
5

Ich versuche, das Albumcover für eine lokal gespeicherte .MP3-Spur in einem ImageView anzuzeigen. Kann jemand dieses Kunstwerk in Swift holen, um dies zu erreichen?Anzeigen von Artwork für .MP3-Datei

Ich habe diese Lösung gefunden (iOS AVFoundation: How do I fetch artwork from an mp3 file?), aber der Code ist in Objective C. Ich möchte einfach das Bild in meine MP3 eingebettet greifen und es in meinem ImageView anzeigen.

Ich habe die API-Dokumentation für MPMediaItemArtwork angeschaut und ein Beispiel gefunden, das auch das erreicht, was ich hier in Objective C erreichen möchte (http://www.codeitive.com/0zHjkUjUWX/not-able-to-get-the-uiimage-from-mpmediaitempropertyartwork.html), aber keine Lösung finden kann. Mein Code ist wie folgt:

Hier ist ein Screenshot meiner Beispieldatei .mp3. Wie Sie sehen können, gibt es in der Tat Albumcover, die beide im Bereich "get info" im Finder sichtbar sind. Ich habe auch die .mp3-Datei in meinem iTunes geöffnet, um sicherzugehen und habe bestätigt, dass es dort sowohl im Abschnitt "get info" als auch unter dem Tab "artwork" Bilder gibt.

Wenn ich jedoch versuche, den commonKey zu verwenden, um das Bild meinem imageView zuzuweisen, finde ich, dass es keinen commonKey für "artwork" gibt.

sample MP3 data

Dank

Antwort

6

Ändern Sie Ihr Codeschnipsel in dieses (ich tes bereits ted es):

I added println lines commented in places of interest, Feel free to uncomment in order to see what is happening.

for item in metadataList { 
     if item.commonKey == nil{ 
      continue 
     } 

     if let key = item.commonKey, let value = item.value { 
      //println(key) 
      //println(value) 
      if key == "title" { 
       trackLabel.text = value as? String 
      } 
      if key == "artist" { 
       artistLabel.text = value as? String 
      } 
      if key == "artwork" { 
       if let audioImage = UIImage(data: value as! NSData) { 
        //println(audioImage.description) 
        artistImage.image = audioImage 
       } 
      } 
     } 
    } 

UPDATE: A bit of clean up of this code

for item in metadataList { 

    guard let key = item.commonKey, let value = item.value else{ 
     continue 
    } 

    switch key { 
    case "title" : trackLabel.text = value as? String 
    case "artist": artistLabel.text = value as? String 
    case "artwork" where value is NSData : artistImage.image = UIImage(data: value as! NSData) 
    default: 
     continue 
    } 
} 
+0

Perfekt! Das war die Lösung, die für mich funktionierte! Danke für Ihre Hilfe. Also war es richtig, .metadata anstelle von .commonmetadata zu verwenden? Ist die Metadatenabdeckung nur eine Vertiefung? Kudos und Prost! – Unconquered82

3

wie diese versuchen:

let audioInfo = MPNowPlayingInfoCenter.defaultCenter() 
var nowPlayingInfo:[String:AnyObject] = [:] 
let playerItem = AVPlayerItem(URL: url) 
let metadataList = playerItem.asset.metadata 
for item in metadataList { 
    if item.commonKey != nil && item.value != nil { 
     if item.commonKey == "title" { 
      println(item.stringValue) 
      nowPlayingInfo[MPMediaItemPropertyTitle] = item.stringValue 
     } 
     if item.commonKey == "type" { 
      println(item.stringValue) 
      nowPlayingInfo[MPMediaItemPropertyGenre] = item.stringValue 
     } 
     if item.commonKey == "albumName" { 
      println(item.stringValue) 
      nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = item.stringValue 
     } 
     if item.commonKey == "artist" { 
      println(item.stringValue) 
      nowPlayingInfo[MPMediaItemPropertyArtist] = item.stringValue 
     } 
     if item.commonKey == "artwork" { 
      if let image = UIImage(data: item.dataValue) { 
       nowPlayingInfo[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(image: image) 
       println(image.description) 
      } 
     } 
    } 
} 

audioInfo.nowPlayingInfo = nowPlayingInfo 

Hinweis: Sie rufen beginReceivingRemoteControlEvents müssen() sonst wird es nicht auf dem tatsächlichen Gerät zu arbeiten.

do { 
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
    print("AVAudioSession Category Playback OK") 
    do { 
     try AVAudioSession.sharedInstance().setActive(true) 
     print("AVAudioSession is Active") 
    } catch let error as NSError { 
     print(error.localizedDescription) 
    } 
} catch let error as NSError { 
    print(error.localizedDescription) 
} 

enter image description here

+0

habe ich versucht, den Code oben bereits vorherigen, jedoch gibt es keine commonKey für "Kunstwerk" aufgeführt, so dass das Bild an anderer Stelle in der Datei zu speichern werden müssen. Wenn ich meine commonKey Artikel alle println, die anzeigt, ist [title Typ Urheberrechte Albumname artist] Wenn ich auf die Datei „Info bekommen:“ Ich eindeutig auch beide Kunstwerk für den mp3 im Vorschaubereich sehen können, wie Artwork unter der Registerkarte "Artwork" in iTunes. Es gibt jedoch kein "artwork" commonKey, mit dem dies erfasst werden kann. – Unconquered82

+0

Es extrahiert die Informationen aus der Datei, Ihr Song enthält wahrscheinlich kein Bildmaterial. Stellen Sie sicher, dass Ihre MP3-Datei ein eingebettetes Bild enthält. –

+0

Ich habe meine Frage aktualisiert, um einen Screenshot der Titelinformationen hinzuzufügen.Wie Sie sehen können, ist in der .mp3 Grafik eingebettet. Ich habe keinen zweiten Screenshot der Registerkarte "Artwork" in iTunes gemacht, aber das Artwork erscheint auch dort. – Unconquered82

0

Versuchen Sie folgendes::

Es scheint, dass manchmal Sie auch Ihre Anwendung Background-Modi (Audio und AirPlay) und stellen Sie Ihre AVAudioSession Kategorie AVAudioSessionCategoryPlayback und es aktiv gesetzt müssen iOS 8 gibt beim ersten Versuch null zurück, um diese Information zu erhalten:

if let audioCenter = MPNowPlayingInfoCenter.defaultCenter(){ 
     if let audioInfo = audioCenter.nowPlayingInfo{ 
      if let artwork = audioInfo[MPMediaItemPropertyArtwork] as? MPMediaItemArtwork 
      { 
       var image: UIImage? = artwork.imageWithSize(artwork.bounds.size) 

       if image == nil { 
        image = artwork.imageWithSize(artwork.bounds.size); 
       } 

       if image != nil{ 
        println("image loaded") 
       } 
      } 
     } 
    }