我希望能够显示当前正在播放的 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
。这段代码始终返回 nil:
let lyricsText = nowPlaying?.value(forProperty: MPMediaItemPropertyLyrics) as? NSString as String?
在以下代码中,
MPMediaItemPropertyAssetURL
总是返回 nil
而不是实际的 URL: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/iOS 10.3上进行测试。
有什么建议可以让我获取歌词或者解决MPMediaItemPropertyAssetURL返回nil的问题吗?
MPMediaItemPropertyAssetURL
。你只能以“自动唱机”的方式使用它,让iOS为你播放音乐。更复杂的用例是不可能的。 - Rhythmic Fistmanlet lyric = nowPlaying?.lyrics let assetUrl = nowPlaying?.assetURL
还请注意。 - BluewingsnowPlaying?.hasProtectedAsset
- dandepechednil
。 - dandepeched