繁体   English   中英

Swift IOS:获取当前正在播放的歌曲的标题

[英]Swift IOS : Get the title of current song playing

我想构建一个能够获取设备上当前正在播放的歌曲名称的应用程序(例如,如果我正在使用Spotify或任何其他播放器播放歌曲,则该应用程序应该能够获取标题)。 然后,标题应仅存储在变量中。

我无法成功使用nowPlayingInfo或MPMediaItemPropertyTitle。

有人可以帮我吗? 这是我尝试过的代码,但出现错误:

使用未解析的标识符“ playerItem”

对于该行:

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

我认为您错过了代码:前面的var playerItem = AVPlayerItem(URL: url)

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

如果本地文件夹中有几首音乐,并且想要获取音乐的插图,标题,艺术家和专辑,则可以创建一个名为Music的模型和一种获取musicArray的方法,该方法包含所需的信息。 您可以轻松使用各种var musics :[Music]? 将音乐保存在viewController中,并使用方法获取按音乐标题(或您要使用的其他属性)排序的音乐:

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

在音乐文件模型中:

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)

    }
 }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM