我想显示歌词的歌曲,目前正在播放的iOS系统播放器。
这是我的定制播放器:
import UIKit
import MediaPlayer
import AVFoundation
class NowPlayingController: NSObject {
var musicPlayer: MPMusicPlayerController {
if musicPlayer_Lazy == nil {
musicPlayer_Lazy = MPMusicPlayerController.systemMusicPlayer()
let center = NotificationCenter.default
center.addObserver(self,
selector: #selector(self.playingItemDidChange),
name: NSNotification.Name.MPMusicPlayerControllerNowPlayingItemDidChange,
object: musicPlayer_Lazy)
musicPlayer_Lazy!.beginGeneratingPlaybackNotifications()
}
return musicPlayer_Lazy!
}
private var musicPlayer_Lazy: MPMusicPlayerController?
var nowPlaying: MPMediaItem?
//If song changes
func playingItemDidChange(notification: NSNotification) {
nowPlaying = musicPlayer.nowPlayingItem
}
}为了从nowPlaying条目中获得歌词,我尝试了两种方法,两种方法都是始终返回nil。
此代码始终返回零:
let lyricsText = nowPlaying?.value(forProperty: MPMediaItemPropertyLyrics) as? NSString as String?在下面的代码中,MPMediaItemPropertyAssetURL总是返回nil而不是实际的nil:
let songUrl = nowPlaying?.value(forProperty: MPMediaItemPropertyAssetURL) as? NSURL as URL?
if songUrl != nil {
let songAsset = AVURLAsset(url: songUrl!, options: nil)
lyricsText = songAsset.lyrics所有歌曲都在设备上(由iTunes同步),包含歌词(显示在系统播放器中)和非DRM保护(撕破aac/mp3)。
我正在真正的设备上测试这个: iPhone 6S/IOS10.3
有什么建议,我可以如何得到歌词,或为什么MPMediaItemPropertyAssetURL返回零?
发布于 2017-04-22 14:02:01
我不知道为什么它不工作,但它看起来像相同的代码现在运行良好。也许它以某种方式连接到我现在用于player实例的单例。以下是Swift 3版本,100%起作用:
import UIKit
import MediaPlayer
import AVFoundation
class NowPlayingController: NSObject {
static let sharedController = NowPlayingController()
//MARK: Init
private override init () {
super.init()
var musicPlayer_Lazy: MPMusicPlayerController?
// System player instance
if musicPlayer_Lazy == nil {
musicPlayer_Lazy = MPMusicPlayerController.systemMusicPlayer()
NotificationCenter.default.addObserver(self,
selector: #selector(self.playingItemDidChange),
name: NSNotification.Name.MPMusicPlayerControllerNowPlayingItemDidChange,
object: musicPlayer_Lazy)
musicPlayer_Lazy!.beginGeneratingPlaybackNotifications()
}
self.musicPlayer = musicPlayer_Lazy!
}
// MARK: Class properties
var musicPlayer: MPMusicPlayerController!
var nowPlaying: MPMediaItem?
// MARK: Methods
func playingItemDidChange(notification: NSNotification) {
nowPlaying = musicPlayer.nowPlayingItem
NotificationCenter.default.post(newSongNotification as Notification)
}
func getLyrics() {
let songUrl = nowPlaying?.value(forProperty: MPMediaItemPropertyAssetURL) as? URL
let songAsset = AVURLAsset(url: songUrl!, options: nil)
let lyricsText = songAsset.lyrics
}
}发布于 2020-10-01 06:12:08
我知道这有点旧,但我只是花了大约4个小时研究如何从一个MP3文件中读取歌词,如果它有歌词的话。我使用的是AVAudioPlayer而不是MPMusicPlayerController。天哪,这太简单了.
SWIFT5.3为macOS (我不知道这是否适用于iOS,但我想会)
import AVFoundation
func getLyrics(url: URL) -> String? {
let asset = AVAsset(url: url)
return asset.lyrics
}注意,它是返回一个可选的,所以最好检查为零。希望这能节省一些人的研究时间。
参见苹果文档这里。
https://stackoverflow.com/questions/43222995
复制相似问题