2017-04-05 20 views
5

현재 iOS 시스템 플레이어에서 재생중인 노래의 가사를 표시하고 싶습니다. nowPlaying 항목에서가사 가져 오는 방법 iOS10 (Swift 3)에서 노래 재생

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 
    } 
} 

얻으려면 가사 나는이 방법을 시도하고 항상 반환 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에서 동기화)됩니다

let lyricsText = nowPlaying?.value(forProperty: MPMediaItemPropertyLyrics) as? NSString as String? 

코드 MPMediaItemPropertyAssetURL를 다음에서 항상 nil 대신 실제 URL의 반환

이 코드는 항상 nil을 반환 가사 (시스템 플레이어에 표시됨) 및 DRM으로 보호되지 않은 (찢어진 aac/mp3).

내가 실제 장치에서이 테스트를하고있어

: 아이폰 기가/아이폰 OS 10.3

내가 가사를 얻을 수있는 방법 어떤 제안 또는 왜 MPMediaItemPropertyAssetURL이 전무를 반환?

+0

요즘, 대부분의 아이튠즈의 콘텐츠는 페어 플레이의 DRM으로 보호 또는 애플의 음악 (도 페어 플레이에 의해 보호 몰라?.) 항상이 유형의 콘텐츠입니다 중 'MPMediaItemPropertyAssetURL'을 반환하지 않습니다. iOS가 음악을 재생하는 "주크 박스"방식으로 만 사용해야합니다. 보다 정교한 유스 케이스는 불가능합니다. –

+0

아래에서이 방법을 사용해 보셨습니까? 'let lyric = nowPlaying? .lyrics는 assetUrl = nowPlaying? .assetURL' 또한 – Bluewings

+0

@RhythmicFistman을 주목합니다. 내 콘텐츠가 iTunes Store 콘텐츠가 아니기 때문에 그렇지 않습니다. 그러나 나는 어쨌든'false' (노래에 DRM이 없음을 의미)를 반환하는 다음과 같은 방법으로 double을 체크했다 :'nowPlaying? .hasProtectedAsset' – dandepeched

답변

1

내가 왜 작동하지 않았는지 모르겠지만 같은 코드가 제대로 작동하는 것처럼 보입니다. 어쩌면 어떻게 든 플레이어 인스턴스에 사용하고있는 싱글 톤에 연결되었을 것입니다. 여기 스위프트 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 
    } 
}