背景:天天听着网易云音乐,想着哪天要是自己能做一个类似网易云音乐的播放器就好了(大三还没毕业)。在CocoaChina代码库里面逛了有些日子了,就干脆下载几个音乐播放器的demo来练练手。实践结果告诉我:一个完整的播放器确实要做很多功能,确实有些难度。那么就开始说说我做的本地音乐播放器吧。


个人觉得吧,无论做什么项目或工程,都要先架构好再写,不然真的会很凌乱地。以前吧,我总是拿着东西就写,从不管什么架构,什么分层的。如果逮着某个部分就写,写到最后你会发现,你的代码耦合性太强了,不容易分离。当另一个控制器或者View层或者Model层要用到当前数据,不容易传递。(传递当然是可以传递的,只是逻辑看起来很别扭)。我个人还是比较喜欢先分好层,再写代码。当然也有人喜欢全部写好,再把每个部分分离出来,归类为不同的层。我更喜欢前者。


好啦,开始说说我整个工程的架构吧:

  • 采用MVC的模式来管理项目,层管理控件,View层显示控件,Model层处理数据。
  • 歌词界面归为View层(视图内的要显示东西太多,分离出来),其余控件在主控制器初始化显示。
  • 自定义UITableViewCell来显示歌词,并且用算法按照播放进度来显示歌词的颜色。
  • 有一些算法处理可以归为Category分类或者自己建一个工具类。

再说说这个工程里面的控件结构位置的概述吧:

第一个界面:

  • 模糊的背景里面是一个UIImageView,采用了高斯(毛玻璃)效果。中间那个圆圈图片也是一个UIImageView,并且修改他的Layer变成圆形。不难看出,这两个UIImageView 的图片是一样的,其实是从当前MP3音乐里面提取出来的。
  • 上面歌名和歌手是用两个UILabel来显示,信息也是从当前MP3歌曲里面提取出来的。
  • 下面有一个UISlider来控制歌曲播放进度。
  • 还有两个UILabel分别来显示当前播放时间和歌曲总时长,歌曲里面提取出来的总时长是时间戳NSTimeInterval的单位,我们用算法格式化转发为我们熟知的时间格式。
  • 最下面自然是三个UIButton,来控制歌曲的播放暂停、上一曲、下一曲。

    第二个界面:

  • 显示歌词的部分,使用一个UIScrollView作为父视图。真正显示歌词的部分是一个自定义cellUITableView。这个UIScrollViewcontentSize有两个屏幕宽度,UITableView放在第二个屏幕宽度的位置,效果就是:向右滑动就到歌词界面。

  • 继承UILabelZFLabel,并增加一个进度属性,按照当前歌曲进度播放来绘制这个UILabel的颜色(即播放到哪里,歌词颜色就显示到哪里)。把这个ZFLabel作为自定义的cell
  • 第一个界面其实还有一个当前歌词的显示,其实也就是让他等于当前歌词显示的ZFLabel而已。

除此之外,本工程用了两个计时器。第一个计时器为NSTimer,用来更新第一个界面的播放时间。第二个计时器为CADisplayLink,用来更新歌词。为什么要用两个不一样的计时器?第一个计时器NSTimer我就不多说了,相信大家用得最多。第二个计时器不需要设置时间,每秒有固定的调用频率,而且调用精确度相当高,比NSTimer高。因为要显示歌词嘛,为了不出现卡顿的现象,就采用CADisplayLink计时器。

至于播放器类,当然是用系统的类AVAudioPlayer啦。一方面,我喜欢原生开发。另一方面,把系统的学会了,第三方的也是基于系统的嘛,学起来也很容易的。


对音频最大的认识:

每个MP3里面都已经录制好了这首歌的信息,比如:歌曲图片(被我提取出来用来显示高斯效果和中央旋转图)、歌手、歌曲名字、专辑名称。

我们可以用AVURLAssetAVMetadataItem提取出歌曲里面的信息。

代码:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>@interface AssetModel : NSObject/**图片*/
@property(nonatomic,strong) UIImage *image;
/**歌曲名*/
@property(nonatomic,strong) NSString *songName;
/**歌手*/
@property(nonatomic,strong) NSString *artist;
/**专辑名称*/
@property(nonatomic,strong) NSString *albumName;/**初始化歌曲的信息,包括歌曲的图片、歌曲名、歌手、专辑名称信息 @param url 歌曲的url路径
 @return 初始化好的对象*/
+(AssetModel *)AssetModelWithURL:(NSURL *)url;
-(AssetModel *)initAssetWithURL:(NSURL *)url;@end
#import "AssetModel.h"@implementation AssetModel+(AssetModel *)AssetModelWithURL:(NSURL *)url
{return [[self alloc] initAssetWithURL:url];
}-(AssetModel *)initAssetWithURL:(NSURL *)url
{AVURLAsset *mp3Asset = [AVURLAsset URLAssetWithURL:url options:nil];for (NSString *format in [mp3Asset availableMetadataFormats]) {for (AVMetadataItem *metadataItem in [mp3Asset metadataForFormat:format]) {if ([metadataItem.commonKey isEqual:@"artwork"]) {//提取图片self.image = [UIImage imageWithData:(NSData *)metadataItem.value];}else if ([metadataItem.commonKey isEqualToString:@"title"]){//提取歌曲名self.songName = (NSString *)metadataItem.value;}else if ([metadataItem.commonKey isEqualToString:@"artist"]){//提取歌手self.artist = (NSString *)metadataItem.value;}else if ([metadataItem.commonKey isEqualToString:@"albumName"]){//提取专辑名称self.albumName = (NSString *)metadataItem.value;}}}return self;
}@end

对动画的最大认识:

CoreAnimation里面有四种:基础动画、帧动画、转场动画、组动画。而该工程只是用到了基础动画CABasicAnimation。点击播放音乐时候,就让中央旋转图开始沿着Z轴方向旋转。当然,要设置中央旋转图(UIImageView)的旋转时间、旋转角度之类的。

以上就是我这几天写该工程的心得~~~

详细代码:https://github.com/HZhenF/MyMusicPlayer.git

iOS-纯代码编写本地音乐播放器AVAudioPlayer相关推荐

  1. 纯C模拟本地音乐播放器

    主界面 代码 文件结构 face.h #include<stdio.h>int face_user(); int face_play(); int face_play2();void fa ...

  2. python 播放本地音乐_实战项目—python实现本地音乐播放器

    随着网络的发展,我们已经很少将音乐下载到本地,而是直接在线听歌,方便而又直接.也许你用的音乐播放器是这个 也许是这个 这都不是重点,今天我们要用python自己打造一款音乐播放器. 具体思路 使用py ...

  3. 安卓仿网易云界面的本地音乐播放器的实现

    前言:读研究生之前,老板让学IOS,老老实实看了一个学期的IOS(在这里强烈安利一下腾讯课堂的小码哥IOS视频,基本刚开始只需要10块买第一部,后面的就可以用可视币来兑换了,质量还不错,能学到很多东西 ...

  4. [HTML5]简单网页本地音乐播放器

    既然HTML5提出与本地交互方便,就想写个HTML5的本地音乐播放器.一开始问题主要集中在怎么读取本地文件路径,我想肯定可以用JS实现去操作本地文件(因为node.js很容易实现读取本地文件,但是原生 ...

  5. 我的音乐(Musicoco)- 本地音乐播放器开发总结

    开源一个功能相对齐全的本地音乐播放器 简述 从五月末就开始利用空余时间开发这款 app ,不知不觉三个月过去了. App 名称:我的音乐,我给取了个别名:Musicoco. Android 手机本地音 ...

  6. 炫 音乐可视化 html5 在线,HTML5打造的炫酷本地音乐播放器-喵喵Player

    将之前捣腾的音乐频谱效果加上一个播放列表就成了现在的喵喵播放器(Meow meow Player,额知道这名字很二很装萌~),全HTML5打造的网页程序,可本地运行也可以挂服务器上用. 在线Demo及 ...

  7. python 本地音乐播放器制作过程

    制作这个播放器的目的是为了将下载下来的mp3文件进行随机或是顺序的播放.选择需要播放的音乐的路径,选择播放方式,经过测试可以完美的播放本地音乐. [阅读全文] 在开始之前介绍一个免费下载mp3音乐的网 ...

  8. 利用PyQt5制作本地音乐播放器

    介绍 本文是对之前的音乐播放器的一些改进和功能实现.只写了有变化的部分,具体部分请看上一篇博客. [利用PyQt5和QSS制作本地音乐播放器(初稿)](https://blog.csdn.net/we ...

  9. 基于 Qt5 ( C++ ) 开发的一个小巧精美的本地音乐播放器

    LightMusicPlayer --南京大学2019秋季学期 "高级程序设计" 课程设计三 基于Qt5开发的一个小巧精美的本地音乐播放器 代码注释详细,适合作为一个用于入门的Qt ...

  10. 简易的本地音乐播放器 适用于Java初学者

    简易的本地音乐播放器 适用于Java初学者 我知道肯定会有人说都1202年了怎么还有人在用AudioClip,没有别的原因,因为我也刚学Java,刚好看到一个这样的教程就刚好写了一个这样的播放器. 我 ...

最新文章

  1. CMU贺斌教授团队提出:冥想可以增强对脑机接口的控制
  2. 网站迁移的一般步骤、常见问题及解决措施
  3. java url 上传文件_Java使用HttpURLConnection上传文件(转)
  4. 如何查看CRM WebUI,C4C和Hybris里的页面技术信息
  5. 简述osi参考模型各层主要功能_OSI网络模型
  6. mysql数据库加权随机_SQL:随机选择一行,但考虑到权重
  7. android view stop,android – onDestroyView片段永远不会在onStop之后调用
  8. Linux之内核调试sysrq
  9. 转发 微博 Qzone 微信 基础知识|存储相关的名词
  10. 2008秋季-计算机软件基础-0922课堂用例(2)
  11. Linux音频驱动-声音采集过程
  12. 云服务器发送开锁信息给单车,云服务器发送开锁信息给单车
  13. 把ICDAR2019-LSVT原始数据集转为REC任务识别数据
  14. Autodesk 3ds Max 2011 / 3ds Max Design 2011)简体中文版 32位+64位
  15. SV学习(8)——随机约束和分布、约束块控制
  16. 【2021年蓝桥杯Java-B组国赛题解】
  17. UVALive 4394 String painter——dp
  18. Linux下禁用root远程登录并且新建一个用户赋予root权限
  19. 痛苦的对接体验——软工第一次结对作业
  20. 微信小游戏个人游戏发布《自省自查报告》

热门文章

  1. 计算机网络路由器的配置连接不上,路由器安装设置好后电脑还是不能上网解决办法...
  2. VapourSynth压制教程 【Waifu2x N卡 放大教程】
  3. 学习Python编程看哪些书比较好?推荐这10本
  4. 机器人动作编辑器说明
  5. 超实用的几款Macos/Macbook/iMac 影片剪辑软件
  6. Gradle编译时,assets文件未打包进apk
  7. 如何区分网线是几类的_5类、6类网线双绞线如何区分又怎么样使用?
  8. 条件期望,重期望,相关知识点
  9. [转] Node.js 服务端实践之 GraphQL 初探
  10. 解决创建MAVEN工程速度慢的问题