首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在iOS10 (Swift 3)中为现在播放歌曲找到歌词

如何在iOS10 (Swift 3)中为现在播放歌曲找到歌词
EN

Stack Overflow用户
提问于 2017-04-05 06:01:12
回答 2查看 2.8K关注 0票数 5

我想显示歌词的歌曲,目前正在播放的iOS系统播放器。

这是我的定制播放器:

代码语言:javascript
复制
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

此代码始终返回零:

代码语言:javascript
复制
let lyricsText = nowPlaying?.value(forProperty: MPMediaItemPropertyLyrics) as? NSString as String?

在下面的代码中,MPMediaItemPropertyAssetURL总是返回nil而不是实际的nil

代码语言:javascript
复制
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返回零?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-22 14:02:01

我不知道为什么它不工作,但它看起来像相同的代码现在运行良好。也许它以某种方式连接到我现在用于player实例的单例。以下是Swift 3版本,100%起作用:

代码语言:javascript
复制
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
    }
}
票数 2
EN

Stack Overflow用户

发布于 2020-10-01 06:12:08

我知道这有点旧,但我只是花了大约4个小时研究如何从一个MP3文件中读取歌词,如果它有歌词的话。我使用的是AVAudioPlayer而不是MPMusicPlayerController。天哪,这太简单了.

SWIFT5.3为macOS (我不知道这是否适用于iOS,但我想会)

代码语言:javascript
复制
import AVFoundation

func getLyrics(url: URL) -> String? {
    let asset = AVAsset(url: url)
    return asset.lyrics
}

注意,它是返回一个可选的,所以最好检查为零。希望这能节省一些人的研究时间。

参见苹果文档这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43222995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档