【发布时间】:2017-04-05 06:01:12
【问题描述】:
我想显示当前由 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 项目中获取歌词,我尝试了 2 种方法,它们都总是返回 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 的任何建议?
【问题讨论】:
-
如今,大多数 iTunes 内容要么受 FairPlay DRM 保护,要么受 Apple Music 保护(也受 FairPlay 保护?不知道。)并且此类内容总是返回 nil
MPMediaItemPropertyAssetURL。你只应该以“点唱机”的方式使用它,iOS 会为你播放音乐。更复杂的用例是不可能的。 -
您是否尝试过像下面这样访问?
let lyric = nowPlaying?.lyrics let assetUrl = nowPlaying?.assetURL还要注意 -
@RhythmicFistman 情况并非如此,因为我的内容不是 iTunes Store 内容。但无论如何我已经用以下方法仔细检查了返回
false(意味着歌曲上没有DRM):nowPlaying?.hasProtectedAsset -
@Bluewings 我刚试过,都返回
nill
标签: ios swift swift3 avfoundation mpmediaitem