Отображение обложки для файла.MP3

В настоящее время я пытаюсь отобразить обложку альбома для локально сохраненной дорожки.MP3 в ImageView. Кто-нибудь знает, как получить это произведение в Swift, чтобы достичь этого?

Я нашел это решение ( iOS AVFoundation: Как мне получить обложку из mp3-файла?), Но код написан в Objective C. Я просто хочу взять изображение, встроенное в мой MP3, и отобразить его в ImageView.

Я посмотрел на документацию API для MPMediaItemArtwork и нашел пример, который также выполняет то, что я пытаюсь достичь в Objective C, здесь ( http://www.codeitive.com/0zHjkUjUWX/not-able-to-get-the-uiimage-from-mpmediaitempropertyartwork.html), но не может найти решение. Мой код выглядит следующим образом:

import UIKit
import AVFoundation
import MediaPlayer

class ViewController: UIViewController {
let audioPath:NSURL! = NSBundle.mainBundle().URLForResource("SippinOnFire", withExtension: "mp3")

@IBOutlet var artistImage: UIImageView!
@IBOutlet var trackLabel: UILabel!
@IBOutlet var artistLabel: UILabel!
@IBOutlet var sliderValue: UISlider!
var player:AVAudioPlayer = AVAudioPlayer()


@IBAction func play(sender: AnyObject) {


    let audioInfo = MPNowPlayingInfoCenter.defaultCenter()
println(audioInfo)


    player.play()
    //println("Playing \(audioPath)")


    let playerItem = AVPlayerItem(URL: audioPath)
    let metadataList = playerItem.asset.metadata as! [AVMetadataItem]


    for item in metadataList {
        if let stringValue = item.value {
           println(item.commonKey)
            if item.commonKey == "title" {
                trackLabel.text = stringValue as? String
            }
            if item.commonKey  == "artist" {
                artistLabel.text = stringValue as? String
            }
            if item.commonKey  == "artwork" {
                if let audioImage = UIImage(data: item.value as! NSData) {
                    let audioArtwork = MPMediaItemArtwork(image: audioImage)
                    println(audioImage.description)
                }
           }


        }
    }
}
@IBAction func pause(sender: AnyObject) {

    player.pause()
}
@IBAction func stop(sender: AnyObject) {

    player.stop()
    player.currentTime = 0;
}
@IBAction func sliderChanged(sender: AnyObject) {

    player.volume = sliderValue.value

}

override func viewDidLoad() {
    super.viewDidLoad()

             var error:NSError? = nil

    player = AVAudioPlayer(contentsOfURL: audioPath!, error: &error)

    player.volume = 0.5;

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

Вот снимок экрана моего образца файла.mp3. Как вы можете видеть, действительно есть обложка альбома, которую можно увидеть в разделе "получить информацию" в Finder. Я также открыл.mp3 в своем iTunes, чтобы удостовериться и подтвердил, что в разделе "get info", а также на вкладке "artwork" есть обложка.

Тем не менее, при попытке использовать commonKey для назначения изображения для моего imageView, я обнаружил, что не существует commonKey для "artwork".

образец данных MP3

Спасибо

3 ответа

Решение

Измените свой фрагмент кода на это (я уже проверял это):

Я добавил напечатанные строки, прокомментированные в интересных местах, не стесняйтесь комментировать, чтобы увидеть, что происходит.

   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
                }
            }
        }
    }

ОБНОВЛЕНИЕ: немного очистки этого кода

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
   }
}

ОБНОВЛЕНИЕ: для Swift 4

for item in metadataList {

    guard let key = item.commonKey?.rawValue, 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 Data : artistImage.image = UIImage(data: value as! Data)
    default:
      continue
   }
}

Попробуйте вот так:

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

Примечание. Вам нужно будет вызвать beginReceivingRemoteControlEvents(), иначе он не будет работать на реальном устройстве. Вам также нужно будет установить фоновые режимы вашего приложения (Audio и AirPlay) и установить для вашей категории AVAudioSession значение AVAudioSessionCategoryPlayback и установить его активным:

do {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: .mixWithOthers)
    print("Playback OK")
    try AVAudioSession.sharedInstance().setActive(true)
    print("Session is Active")
} catch {
   print(error)
}

введите описание изображения здесь

Попробуй это:

Похоже, что иногда iOS 8 возвращает ноль при первой попытке получить эту информацию:

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")
                }
            }
        }
    }
Другие вопросы по тегам