IOS开发之简单音频播放器
今天第一次接触IOS开发的UI部分,之前学OC的时候一直在模拟的使用Target-Action回调模式,今天算是真正的用了一次。为了熟悉一下基本控件的使用方法,和UI部分的回调,下面开发了一个特别简易的音频播放器,来犒劳一下自己这一天的UI学习成果。在用到UI的控件时如果很好的理解之前博客在OC中的Target-Action回调模式,感觉控件的用法会很顺手。下面的简易播放器没有用到多高深的技术,只是一些基本控件和View的使用。
话不多说简单的介绍一下今天的音频播放器。在播放器中我们用到了UIProgressView(进度条)来显示音频的播放进度,用UILabel显示播放的当前时间和总时间。用UIImageView和UIImagel来加入图片,用UISegmentedControl来控制播放和暂停,用滑动器UISlider来控制音频的音量。上面的执行组件都是UIKit中的组件,我们要定时的获取音频的播放时间,我们还要用到NSTimer来定时获取CurrentTime。播放器怎么能少的了关键的组件呢,我们还需要引入框架AVFoundation.framework。我们会用到组件AVAudioPlayer来播放我们的音频。
下面是简易音频播放器的截图:

1.功能介绍:
点击播放会播放默认歌曲,同时显示播放进度和播放当前时间,下面的slider可以调节音频的声音大小。
2.主要开发过程
1.在我们的XCode中新建一个SingleView的iPhone的工程,为了更好的理解和配置控件和view,就不使用storyboard来进行控件的拖拽啦。在我们新建工程下面的ViewController.m编写我们的代码,为了隐藏我们音频播放器使用的控件和控件回调的方法,我们在ViewController.m中用延展来对我们的组件和方法进行声明。代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
#import "ViewController.h"@interface ViewController ()//添加背景用的ImageView@property (strong, nonatomic) UIImageView *backView;//播放进度条@property (strong, nonatomic) UIProgressView *progress;//选项卡按钮,赋值播放和暂停@property (strong, nonatomic) UISegmentedControl * segment;//slider,用滑动器来设置音量的大小@property (strong, nonatomic) UISlider *slider;//timer,来更新歌曲的当前时间@property (strong, nonatomic) NSTimer *timer;//显示时间的lable@property (strong, nonatomic) UILabel *label;//加入图片,中间的图片@property (strong, nonatomic) UIImageView *imageView;//声明播放器,来播放我们的音频文件@property (strong, nonatomic) AVAudioPlayer *player;//在暂停和播放时回调此按钮-(void)tapSegment;//更新歌曲时间-(void)time;//改变声音大小-(void) changeVo;@end |
2.上面是我们的延展部分,来进行我们的组件的声明和方法的声明,具体的实现就写在本文件中的@implementation中,我们把组件的实现和配置写在-(void) viewDidLoad;方法中,该方法会在主视图加载完毕后执行。在编写实现代码之前我们要把我们用到的媒体文件拖入到我们的Project中,下面是具体代码的实现。
1.下面的代码是为我们的应用添加背景图片,也就是我们上面图片中的黑色背景图片,在初始化ImageView的时候我们知道view的位置和大小CGRectMack(x, y, width, height); 用Image来通过图片文件的名称来载入我们的图片,把图片视图插入到主视图的最底层,同时设置其index来实现,代码如下。
|
1
2
3
4
5
6
7
8
9
|
/*添加背景图片*///初始化ImageView,并设置大小self.backView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 20, 320, 480)];//加载图片,我们的图片名为backgroundUIImage *backImage = [UIImage imageNamed:@"background"];//添加背景图片到ImageViewself.backView.image = backImage;//把ImageView添加到view的最底层[self.view insertSubview:self.backView atIndex:0]; |
2.初始化我们的进度条并设置进度条的位置和大小,对进度值初始化为零。同时把进度条通过addSubView加入到我们的主视图中
|
1
2
3
4
|
/*实例化进度条,并添加到主视图*/self.progress = [[UIProgressView alloc] initWithFrame:CGRectMake(30, 60, 240, 10)];[self.view addSubview:self.progress];self.progress.progress = 0; |
3.添加中间的图片,和添加背景图片相似,在这就不赘述了代码如下:
|
1
2
3
4
5
|
//添加中间的图片 self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(80, 90, 160, 150)]; UIImage *image = [UIImage imageNamed:@"image.png"]; self.imageView.image = image; [self.view addSubview:self.imageView]; |
4.初始化我们的segment, 在初始化segment的同时,我们通过便利初始化方法来指定有几个按键和每个按键中的值。配置的时候我们可以通过tintColor来设置我们segment的颜色,通过Target-Action来注册segment要回调的方法,同时指定回调的事件,我们设置的时UIControlEventValueChange,就是当segment的selectedSegmentIndex改变时,调用我们注册的方法。代码如下:
|
1
2
3
4
5
6
7
|
//添加segmentControlself.segment = [[UISegmentedControl alloc] initWithItems:@[@"Play", @"Pause"]];self.segment.frame = CGRectMake(110, 255, 100, 40);self.segment.tintColor = [UIColor whiteColor];//注册回调方法,在segment的值改变的时候回调注册的方法[self.segment addTarget:self action:@selector(tapSegment) forControlEvents:UIControlEventValueChanged];[self.view addSubview:self.segment]; |
5.下面的代码是要初始化并配置我们的音频播放器组件,配置的时候指定我们音频所在路径的url,并且回写播放的错误代码如下
|
1
2
3
4
5
6
7
8
9
|
//配置播放器NSBundle *bundle = [NSBundle mainBundle];NSString * path = [bundle pathForResource:@"music" ofType:@"mp3"];NSURL *musicURL = [NSURL fileURLWithPath:path];NSError *error;self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:musicURL error:&error];if (self.player == nil) { NSLog(@"error = %@", [error localizedDescription]);} |
6.设置定时器,并注册我们要间隔调用的方法。下面的定时器是1秒中重复调用我们当前view中的time方法,在time方法中我们会获取当前音频的当前播放时间,并在lable中显示,稍后会提到
|
1
2
|
//设置时间,每一秒钟调用一次绑定的方法self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(time) userInfo:nil repeats:YES]; |
7.添加我们的音量控制组件,并绑定当slider的值改变是调用哪一个方法。同时指定slider的最大值和最小值,代码如下:
|
1
2
3
4
5
6
7
8
|
//添加sliderself.slider = [[UISlider alloc] initWithFrame:CGRectMake(100,300, 120 , 50)];[self.slider addTarget:self action:@selector(changeVo) forControlEvents:UIControlEventValueChanged];[self.view addSubview:self.slider];//设置slider最小值和最大值self.slider.minimumValue = 1;self.slider.maximumValue = 10; |
3.组件初始化和配置完毕,接下来我们就得实现各控件要回调的方法。
1.当slider的值改变是我们要调用的方法如下,就是要设置一下音频播放器的声音,代码如下:
|
1
2
3
4
5
|
//改变声音-(void)changeVo{ self.player.volume = self.slider.value;} |
2.定时器定时调用的方法如下,在此方法中我们要获取音频的总时间和当前播放时间,并把秒转换成分钟(下面的代码没有使用NSDateFormat来转换时间,读者可以用自己的方法来转换),转换完以后在label中显示当前时间和总时间,代码如下
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//更新时间-(void) time{ //获取音频的总时间 NSTimeInterval totalTimer = self.player.duration; //获取音频的当前时间 NSTimeInterval currentTime = self.player.currentTime; //根据时间比设置进度条的进度 self.progress.progress = (currentTime/totalTimer); //把秒转换成分钟 int currentM = currentTime/60; currentTime = (int)currentTime%60; int totalM = totalTimer/60; totalTimer = (int)totalTimer%60; //把时间显示在lable上 NSString *timeString = [NSString stringWithFormat:@"%02.0f:%02.0f|%02.0f:%02.0f",currentM, currentTime, totalM,totalTimer]; self.label.text = timeString;} |
3.下面是segment要回调的方法根据segment的selectedSegmentIndex来设置播放器的播放还是停止,代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//segment所回调的方法-(void) tapSegment{ int isOn = self.segment.selectedSegmentIndex; if (isOn == 0) { [self.player play]; } else { [self.player pause]; }} |
以上是整个简易播放器的代码,以为功能特别简单所以代码也不多。主要通过上面的简易播放器来熟悉一下IOS开发中控件和view的使用流程,笔者也在一直学习,水平有限,欢迎批评指正。
IOS开发之简单音频播放器的更多相关文章
- WIN32下使用DirectSound接口的简单音频播放器(支持wav和mp3)
刚好最近接触了一些DirectSound,就写了一个小程序练练手,可以用来添加播放基本的wav和mp3音频文件的播放器.界面只是简单的GDI,dxsdk只使用了DirectSound8相关的接口. D ...
- ios开发:一个音乐播放器的设计与实现
github地址:https://github.com/wzpziyi1/MusicPlauer 这个Demo,关于歌曲播放的主要功能都实现了的.下一曲.上一曲,暂停,根据歌曲的播放进度动态滚动歌词, ...
- ios开发学习- 简易音乐播放器2 (基于iPhone4s屏幕尺寸)-- 歌词解析--plist文件应用--imageNamed图片加载耗内存
声明:(部分图片来自网络,如果侵犯了您的权益请联系我,会尽快删除!) 又是音乐播放器,不过这次和上次不一样了,准确说这次更像播放器了,初学者不建议看这个,可以先看前面一个音乐播放器(1),当然 我没加 ...
- ffmpeg + sdl -03 简单音频播放器实现
没办法,工作中遇到了问题. 目前NEC EMMA的架构如下: 从USB读入文件 -> 文件分析并提取Packet中的Payload Data -> NEC HANDLE AVTrans ...
- iOS开发拓展篇—音频处理(音乐播放器1)
iOS开发拓展篇—音频处理(音乐播放器1) 说明:该系列文章通过实现一个简单的音乐播放器来介绍音频处理的相关知识点,需要重点注意很多细节的处理. 一.调整项目的结构,导入必要的素材 调整后的项目结构如 ...
- iOS开发拓展篇—音频处理(音乐播放器6)
iOS开发拓展篇—音频处理(音乐播放器6) 一.图片处理 说明: Aspect表示按照原来的宽高比进行缩放. Aspectfit表示按照原来的宽高比缩放,要求看到全部图片,后果是不能完全覆盖窗口,会留 ...
- iOS开发拓展篇—音频处理(音乐播放器2)
iOS开发拓展篇—音频处理(音乐播放器2) 说明:该文主要介绍音乐播放界面的搭建. 一.跳转 1.跳转到音乐播放界面的方法选择 (1)使用模态跳转(又分为手动的和自动的) (2)使用xib并设置跳转 ...
- iOS开发拓展篇—音频处理(音乐播放器3)
iOS开发拓展篇—音频处理(音乐播放器3) 说明:这篇文章主要介绍音频工具类和播放工具类的封装. 一.控制器间数据传递 1.两个控制器之间数据的传递 第一种方法:self.parentViewCont ...
- iOS开发拓展篇—音频处理(音乐播放器4)
iOS开发拓展篇—音频处理(音乐播放器4) 说明:该文主要介绍音乐播放器实现过程中的一些细节控制. 实现的效果: 一.完整的代码 YYPlayingViewController.m文件 // // Y ...
随机推荐
- cocoapods安装及使用
最近新换了电脑,重新安装cocoapods遇到了很多问题,在这里把问题还有解决方案记录一下 一.安装Cocoapods 在安装CocoaPods之前,首先要在本地安装好Ruby环境,一般Mac下都自带 ...
- eclipse 项目显示红叉
***修改eclipse 代码提示级别1.单个项目修改项目上右键-->properties-->java compiler-->building-->enable projec ...
- Java中有关Null的9件事
对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常 (NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我 ...
- MySQL操作使用
这只是一些简单的数据库命令,作为新手记录一下,以供后面查询使用. 查询服务器版本号和当前日期: select version(), current_date; 一个命令通常用一个SQL语句组成,后面跟 ...
- Android内存泄漏分享
内容概述 内存泄漏和内存管理相关基础. Android中的内存使用. 内存分析工具和实践. 以下内容不考虑非引用类型的数据,或者将其等同为对应的引用类型看待--一切皆对象. 内存泄漏概念 不再使用的对 ...
- SQLite 预写式日志
SQLite在3.7.0版本引入了WAL (Write-Ahead-Logging),WAL的全称是Write Ahead Logging,它是很多数据库中用于实现原子事务的一种机制,引入WAL机制之 ...
- Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放
UEditor组件是百度提供的一套开源的web在线所见即所得富文本编辑器,具有轻量,可定制,注重用户体验等特点,基于MIT协议,功能很强大.最近在使用的过程中发现其中上传的图片(或者插入已有的表情包图 ...
- EF:The provider did not return a ProviderManifest instance
报告错误1:指定的存储区提供程序在配置中找不到,或者无效. 报告错误2:System.Data.ProviderIncompatibleException: The provider did not ...
- Hadoop 裡的 fsck 指令
Hadoop 裡的 fsck 指令,可檢查 HDFS 裡的檔案 (file),是否有 corrupt (毀損) 或資料遺失,並產生 HDFS 檔案系統的整體健康報告.報告內容,包括:Total blo ...
- sublime3 插件
Sublime Text 3能用支持的插件推荐 从二月份用测试版本build 3012开始用sublime text 3,虽然很多插件在sublime text 3不工作了,因为sublime tex ...