2017-08-06 6 views
1

Je voudrais construire une application qui est capable d'obtenir le nom de toute chanson en cours de lecture sur l'appareil (Par exemple si j'utilise Spotify ou tout autre joueur à jouer une chanson, l'application devrait être en mesure d'obtenir le titre). Le titre devrait alors simplement être stocké dans une variable.Swift IOS: Obtenir le titre de la chanson en cours de lecture

Je n'ai pas réussi à utiliser nowPlayingInfo ou MPMediaItemPropertyTitle.

Quelqu'un pourrait-il m'aider s'il vous plaît? C'est le code que j'ai essayé mais j'ai une erreur (Utilisation de l'identifiant non résolu 'playerItem') pour la ligne: let metadataList = playerItem.asset.metadata as! [AVMetadataItem]

import UIKit 
import MediaPlayer 
import AVFoundation 
class ViewController: UIViewController { 


var url:NSURL! 
let audioInfo = MPNowPlayingInfoCenter.default() 
var nowPlayingInfo:[String:Any] = [:] 
override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    print(url.path!) 

    let metadataList = playerItem.asset.metadata as! [AVMetadataItem] 
    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.value as! NSData) { 
        nowPlayingInfo[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(image: image) 
        println(image.description) 
       } 
      } 
     } 
    } 
    audioInfo.nowPlayingInfo = nowPlayingInfo 
+0

Pouvez-vous partager du code que vous avez essayé? – Sal

+0

Paul J'ai ajouté du code – Kenneth

Répondre

-2

Je pense que vous manquez le code: var playerItem = AVPlayerItem(URL: url) devant

let metadataList = playerItem.asset.metadata as! [AVMetadataItem] 

Si vous avez quelques musiques dans le dossier local et souhaitez obtenir l'œuvre, le titre, l'artiste et l'album de les musiques, vous pouvez créer un modèle nommé Music et une méthode pour obtenir musicArray qui contient les informations dont vous avez besoin. Il est si facile que vous pouvez utiliser var musics :[Music]? pour enregistrer les musiques du viewController, et la méthode pour obtenir les musiques qui triée par le titre de la musique (ou toute autre propriété que vous souhaitez utiliser):

private func getMusics(){ 
     Music.getMusicList { [unowned self] (musics) in 
      self.musics = musics.sorted{$0.title! < $1.title!} 
     } 
    } 

Dans le modèle Fichier de musique:

import Foundation 
import UIKit 
import AVFoundation 

struct Music { 
    var artwork : UIImage? 
    var title  : String? 
    var artist : String? 
    var album  : String? 
    var muscicURL : String? 

     init(artwork:UIImage,title:String,artist:String,album:String,muscicURL:String) { 
     self.artwork = artwork 
     self.title = title 
     self.artist = artist 
     self.album = album 
     self.muscicURL = muscicURL 

    } 
static func getMusicList(completion:@escaping ([Music]) -> Void){ 

     var musicImage : UIImage? 
     var musicTitle : String? 
     var musicArtist : String? 
     var musicAlbum : String? 
     var musicURL : String! 

    var musics = [Music]() 

    let folderURL = URL(fileURLWithPath: Bundle.main.resourcePath!) 

    do { 
     let songPaths = try FileManager.default.contentsOfDirectory(at: folderURL, includingPropertiesForKeys: nil, options: .skipsHiddenFiles) 

     _ = songPaths.map({ 
      let songPath = $0.absoluteString 
      if songPath.contains(".mp3"){ 

       musicURL = songPath 
       let mp3Asset = AVURLAsset.init(url: URL(string:songPath)!) 

       for metadataFormat in mp3Asset.availableMetadataFormats { 
        for metadataItem in mp3Asset.metadata(forFormat: metadataFormat){ 

         if metadataItem.commonKey == "artwork",let imageData = metadataItem.value as? Data{ 

          musicImage = UIImage.init(data: imageData)! 

         }else if metadataItem.commonKey == "title",let title = metadataItem.value as? String { 

          musicTitle = title 

         }else if metadataItem.commonKey == "artist",let artist = metadataItem.value as? String { 

          musicArtist = artist 

         }else if metadataItem.commonKey == "albumName",let album = metadataItem.value as? String { 

          musicAlbum = album 
         } 

        } 

       } 
       let music = Music(artwork: musicImage!, title: musicTitle!, artist: musicArtist!, album: musicAlbum!,muscicURL:musicURL!) 
       musics.append(music) 

      } 
     }) 
     completion(musics) 
     // print(musics) 

    } catch let error { 
     print(error.localizedDescription) 

    } 
} 

} 
+0

Voici une référence utile: https://stackoverflow.com/questions/28979013/how-do-i-get-the-album-artwork-of-the-currently-playing-music-using -Swift/48035857 # 48035857 –