问题描述
因此,我尝试根据侦听器是调到播客还是广播电台来创建临时JSON。
因为我们已经有了所有播客信息,所以不需要向远程JSON询问它。但是我们仍然需要具有以下能力:当MusicPlayer在View中播放时,它可以显示封面,艺术家和标题。
所以我的想法是在MusicPlayer类中以及媒体播放器将数据发送到以下内容时创建一个简单的JSON Struct
func getArtBoard(artist: String,song: String,cover: String) {
guard let url = URL(string: cover) else { return }
getData(from: url) { [weak self] image in
guard let self = self,let downloadedImage = image else {
return
}
let artwork = MPMediaItemArtwork.init(boundsSize: downloadedImage.size,requestHandler: { _ -> UIImage in
return downloadedImage
})
self.Nowplaying(with: artwork,artist: artist,song: song)
}
}
它还会将其保存到-
内部class MusicPlayer {
struct NowPlaying: Codable,Identifiable {
var id: ObjectIdentifier
var artist : String
var song : String
var cover : String
}
//more code here
}
但是我遇到两个错误
问题:
完整代码。
import Foundation
import AVFoundation
import MediaPlayer
import AVKit
class MusicPlayer {
static let shared = MusicPlayer()
static var mediatype = ""
struct NowPlaying: Codable,Identifiable {
var id: ObjectIdentifier
var artist : String
var song : String
var cover : String
}
var player: AVPlayer?
let playerViewController = AVPlayerViewController()
func gettype(completion: @escaping (String) -> Void){
completion(MusicPlayer.mediatype)
}
func getNowPlayingView(completion: @escaping (String) -> Void){
completion(MusicPlayer.mediatype)
}
func startBackgroundMusic(url: String,type:String) {
MusicPlayer.mediatype = String(type)
//let urlString = "http://stream.radiomedia.com.au:8003/stream"
let urlString = url
guard let url = URL.init(string: urlString) else { return }
let playerItem = AVPlayerItem.init(url: url)
player = AVPlayer.init(playerItem: playerItem)
do {
try AVAudioSession.sharedInstance().setCategory(.playback,mode: .default,options: [.duckOthers,.defaultToSpeaker,.mixWithOthers,.allowAirPlay])
print("Playback OK")
// let defaults = UserDefaults.standard
// defaults.set("1",forKey: defaultsKeys.musicplayer_connected)
try AVAudioSession.sharedInstance().setActive(true)
print("Session is Active")
} catch {
// let defaults = UserDefaults.standard
// defaults.set("0",forKey: defaultsKeys.musicplayer_connected)
print(error)
}
#if targetEnvironment(simulator)
self.playerViewController.player = player
self.playerViewController.player?.play()
print("SIMULATOR")
#else
self.setupRemoteTransportControls()
player?.play()
#endif
}
func startBackgroundMusicTwo() {
let urlString = "http://stream.radiomedia.com.au:8003/stream"
//let urlString = url
guard let url = URL.init(string: urlString) else { return }
let playerItem = AVPlayerItem.init(url: url)
player = AVPlayer.init(playerItem: playerItem)
do {
try AVAudioSession.sharedInstance().setCategory(.playback,forKey: defaultsKeys.musicplayer_connected)
print(error)
}
#if targetEnvironment(simulator)
self.playerViewController.player = player
self.playerViewController.player?.play()
print("SIMULATOR")
#else
self.setupRemoteTransportControls()
player?.play()
#endif
}
func setupRemoteTransportControls() {
// Get the shared MPRemoteCommandCenter
let commandCenter = MPRemoteCommandCenter.shared()
// Add handler for Play Command
commandCenter.playCommand.addTarget { [uNowned self] event in
if self.player?.rate == 0.0 {
self.player?.play()
return .success
}
return .commandFailed
}
// Add handler for Pause Command
commandCenter.pauseCommand.addTarget { [uNowned self] event in
if self.player?.rate == 1.0 {
self.player?.pause()
return .success
}
return .commandFailed
}
// self.Nowplaying(artist: "Anna",song: "test")
}
func Nowplaying(with artwork: MPMediaItemArtwork,artist: String,song: String){
MPNowPlayingInfoCenter.default().NowPlayingInfo = [
MPMediaItemPropertyTitle:song,MPMediaItemPropertyArtist:artist,MPMediaItemPropertyArtwork: artwork,MPNowPlayingInfoPropertyIsLiveStream: true
]
// self.getArtBoard();
}
func setupNowPlayingInfo(with artwork: MPMediaItemArtwork) {
MPNowPlayingInfoCenter.default().NowPlayingInfo = [
// MPMediaItemPropertyTitle: "Some name",// MPMediaItemPropertyArtist: "Some name",//MPMediaItemPropertyPlaybackDuration: CMTimeGetSeconds(currentItem.duration),//MPNowPlayingInfoPropertyPlaybackRate: 1,//MPNowPlayingInfoPropertyElapsedplaybackTime: CMTimeGetSeconds(currentItem.currentTime())
]
}
func getData(from url: URL,completion: @escaping (UIImage?) -> Void) {
URLSession.shared.dataTask(with: url,completionHandler: {(data,response,error) in
if let data = data {
completion(UIImage(data:data))
}
})
.resume()
}
func getArtBoard(artist: String,song: song)
}
}
func stopBackgroundMusic() {
guard let player = player else { return }
player.pause()
}
}
更新
但是在获取数据时遇到了问题。
Type 'MusicPlayer.NowPlayingData.Type' cannot conform to 'encodable'; only struct/enum/class types can conform to protocols
我使用的代码。 -https://developer.apple.com/documentation/foundation/jsonencoder
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let data = try encoder.encode(NowPlayingData)
print(String(data: data,encoding: .utf8)!)
要写的是我写的
func getArtBoard(artist: String,cover: String) {
MusicPlayer.NowPlayingData(artist: artist,song: song,cover: cover)
}
数据尝试编码
func getArtBoard(artist: String,cover: String) {
//MusicPlayer.NowPlayingData(artist: artist,cover: cover)
let pear = "{'artist':\(artist),'song': \(song),'cover':\(cover)}"
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
MusicPlayer.JN = try encoder.encode(pear)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)