工作之余, 断断续续写了这么一个音乐播放器, eq实现各种音效, 指定位置播放, 快进快退, 锁屏耳机线控等等, 基本就是参考百度音乐盒的功能来实现的.(项目地址最后放出, 项目中的资源接口, 是抓百度音乐盒的接口, 所以项目仅作为交流学习, 禁止商业目的, 否则后果自负)
EQ均衡器写起来真是大费周章, 期间还差点就放弃了, 后来知道大概后, 发现写起来也很简单(这就是这个播放器写了一年多的主要原因), 主要是可参考的资料太少, 期间参考过, 也尝试使用过其他第三方库, 如下:
1)http://msching.github.io/blog/archives/, 极力推荐的一个博客, 介绍了很多播放器和音乐的知识, 可惜我发现的比较晚, 要不能节省好多时间. 更可惜的是唯独缺少eq均衡, 混响的知识,
2) TheAmazingAudioEngine(项目主页), 此项目作者现在已经宣布放弃更新了, 具体可看项目主页说明. 此项目可以很容易的实现eq均衡器和其他一些混响效果(使用的简单介绍), 但是用起来比较坑的是, 它默认开启录音, 所有项目后台运行时, 状态栏会出现一个红色, 高40的指示界面, 就像后台运行百度地图会出现一个”百度地图持续为您导航”一样. 项目播放原理是对音频文件进行逐帧渲染, 期间加上音效, 只能播放本地文件.
3) AudioKit(项目主页), 是上面的项目作者推荐的项目. 功能很强大, 可以说是一个工具集, 我开始就是打算用其中的:AKAudioPlayer来播放音频, 后来放弃了, 原因是第一发现了一个bug, 如果播放两个采样率不同的音频文件, 就会发现播放速度有问题; 第二它的内部文件加载原理会导致一个很长的加载时间卡顿(比如一个4M大小的mp3文件, 加载要1.7s左右); 第三只是一个简单的eq均衡器, 没必要搞的这么复杂.
所有最后总结之前的经验和参考之前使用过的第三方库, 自己写了播放引擎.
因为考虑到播放器要做缓存, 播放记录什么的, 所以对在线播放做的是边下载边播放, 同时也做了断点续传的操作, 歌曲信息归档写入本地.
音乐数据使用写文件操作写入本地, 当文件下载到一个给定的长度后, 就通知播放器可以开始播放了.
如果要从指定的位置开始播放, 那么用读写文件的操作, 拷贝一份从指定位置开始的音乐文件副本给播放器
///下载音乐
public func getMusic(songId: String) {
waiting = false
dataTask?.cancel()
self.songId = songId
QSALog("songId: \(songId)")
let song = ArchiveManager.archiveManagerDecode(songId: songId)
if song.count != 0 {
oneSong = song
musicPath = NSHomeDirectory() + "/Documents" + "/" + songId + "." + "\(song["format"] as! String)"
delegate?.music!(createComplete: oneSong)
//isAdequateResources = true
if song["finish"] as! String != "1" {
QSALog("断点续传歌曲")
offset = musicPath.getFileSize()
delegate?.musicDownload!(updateProgress: Double(offset) / Double(song["size"] as! NSNumber))
if offset > 104857 {
QSAAudioPlayer.shared.play(endTime: Int(song["time"] as! NSNumber), path: musicPath)
} else {
isAdequateResources = false
}
self.resumeMusicDownload(song: song, offset: offset)
} else {
QSALog(