iOS一个模仿百度音乐盒的音乐播放器(带EQ均衡器)

本文介绍了作者在业余时间开发的一款iOS音乐播放器,模仿百度音乐盒功能,包括EQ均衡器、指定位置播放、快进快退、锁屏耳机线控等。在开发过程中,作者参考了多个资源,最终因资料匮乏导致项目历时一年多。文章提到了在实现EQ均衡器时遇到的挑战,以及尝试使用TheAmazingAudioEngine和AudioKit等第三方库的经验,并解释了放弃它们的原因。最终,作者自己编写了播放引擎,实现了边下边播和断点续传。完整的工程代码已开源在GitHub上。
摘要由CSDN通过智能技术生成

工作之余, 断断续续写了这么一个音乐播放器, 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(
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值