本文用的音乐api 是百度的,一天可能只能放几次就不行了
import UIKit
import AVFoundation
class ViewController: UIViewController {
var player:AVPlayer!
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.white
let button = UIButton(frame:CGRect(x:50, y:100, width:50, height:50))
button.setTitle("Play", for: .normal)
button.setTitleColor(UIColor.red, for: .normal)
button.addTarget(self, action:#selector(play), for: .touchUpInside)
view.addSubview(button)
}
@objc func play(){
let url = URL(string:"http://tingapi.ting.baidu.com/v1/restserver/ting?size=1&type=1&callback=cb_list&_t=1468380543284&format=json&method=baidu.ting.billboard.billList")
//上面的size,type都可以自己设获得不同的歌,可以直接在浏览器打开看看返回内容
//因为涉及到网络播放,需要异步执行。
let newQueue = DispatchQueue(label:"test1")
newQueue.async { // 异步
//因为这个API返回的不是标准的json,所以要操作字符串
var str = try?String(contentsOf: url!, encoding: .utf8)
str = str!.substring(from: str!.index(str!.startIndex, offsetBy:12))
str!.remove(at: str!.index(str!.endIndex, offsetBy:-1))
str!.remove(at: str!.index(str!.endIndex, offsetBy:-1))
// 再转成data格式才能解析json
let jsData = str!.data(using: .utf8)
let info = try?JSONSerialization.jsonObject(with: jsData!, options: .allowFragments)as!NSDictionary
let songlist = (info!["song_list"]as!NSArray)[0]as!NSDictionary
//一定要先自己观察json数据的结构然后写
let songId = songlist["song_id"] as! String;
let songUrlStr = "http://ting.baidu.com/data/music/links?songIds=" + songId;
var songUrl = NSURL.init(string: songUrlStr)!
let detailData = try?Data(contentsOf: songUrl as URL)
let detail = try?JSONSerialization.jsonObject(with: detailData!, options: .allowFragments)as!NSDictionary
//再转
let song = (((detail!["data"]as!NSDictionary)["songList"]as!NSArray)[0]as!NSDictionary)["songLink"]as!String
//终于OK了,打印看看地址
songUrl = NSURL.init(string: song)!
print(song)
self.player = AVPlayer(url: songUrl as URL)
self.player.play()
// 注意: 要有耐心,网速可能很慢,得等缓冲完才能播放音乐
// 这个音乐 API 有限制次数,放几次可以就不行了。。
}
}
}
因为涉及到网络播放,所以上面代码是异步执行的。详细请看这里:队列