iOS 9音频应用播放音频之iOS 9音频播放进度
iOS 9音频应用播放音频之iOS 9音频播放进度
iOS 9音频应用开发播放进度
音频文件在播放后经过了多久以及还有多久才可以播放完毕,想必是用户所关注的问题。为了解决这一问题,在很多的音乐播放器中都会有一个播放进度,如图2.32所示。本节将讲解两种查看播放进度的方法。

图2.32 QQ音乐
iOS 9音频应用开发通过进度时间查看进度
通过时间查看进度就是在图2.32中出现的两个时间,它有一个当前播放的时间,还有一个音频文件的总时间。通过这两个时间,用户就可以知道音频文件播放了多久,还需要多久播放完毕。
1.显示音频总时间
对于音频文件中总时间的获取可以使用到AVAudioPlayer类的duration属性,其语法形式如下:
- var duration: NSTimeInterval { get }
其中,该属性是一个只读属性,获取的值是一个NSTimeInterval类型(又名Double)的值,它是以秒为单位的。如果要想出现图2.32中时间的效果,就需要将该值进行转换,转换的具体步骤如下:
(1)获取分钟数:由于使用duration属性获取的值为以秒为单位的,不是用户所理解的时间。由于音频文件往往都是几分钟,所以就不需要小时。将秒转换为分钟,只需要将duration属性获取的值除以60就可以了。其转换格式如下:
- AVAudioPlayer对象名.duration/60
注意:用户所理解的时间格式如下:
- 时:分:秒
(2)将分钟数转换为整型:由于duration是NSTimeInterval类型即双精度类型,而分钟数往往没有小数点,所以需要将此类型的值转换为整型,转换格式如下:
Int(分钟数)
(3)获取秒数:对于秒数的获取就直接使用音频文件的总时间减去转换为整型的分钟数,其语法形式如下:
- AVAudioPlayer对象名.duration - Int(分钟数)
(4)将秒数转为为整型:和为分钟数转换类型一样,需要将获取的秒数转换为整型,转换格式如下:
- Int(秒数)
【示例2-7】以下将以第一个实例为基础,获取音频文件的总时间,并显示在Duration Label标注中。具体的操作步骤如下:
(1)将主视图中的Duration Label标签控件与插座变量durationTime进行关联。
(2)打开ViewController.swift文件,编写代码,实现音频总时间的获取。代码如下:
- override func viewDidLoad() {
- super.viewDidLoad()
- // Do any additional setup after loading the view, typically from a nib.
- moreSettingsView.hidden=true
- let path=NSBundle.mainBundle().pathForResource("Liekkas", ofType: "mp3")
- ……
- audioEffect?.pan = -1.0
- let durationMinutes:Int=Int(audioEffect!.duration/60) //获取分钟数
- let durationSeconds=Int(audioEffect!.duration - Double(durationMinutes * 60)) //获取秒数
- durationTime.text="\(durationMinutes):\(durationSeconds)"
- }
此时运行程序,会看到如图2.33所示的效果。

图2.33 主视图
2.获取iOS 9音频应用开发当前播放的时间
获取当前播放的时间,我们在2.3.2小节中提到过需要使用到AVAudioPlayer类中的currentTime属性。
注意:此时获取的当前播放时间也是NSTimeInterval类型(又名Double)。所以也需要进行转换,类型与音频文件总时间的转换。
【示例2-8】下面将以第一个实例为基础,获取音频文件当前播放的时间,并显示在Current Time Label标注中。具体的操作步骤如下:
(1)将主视图中的Current Time Label标签控件与插座变量currentTime进行关联。
(2)打开ViewController.swift文件,声明一个时间定时器,代码如下:
- var timer:NSTimer?=nil
(3)在playAudio()动作中,添加一行代码,实现定时器的创建,代码如下:
- @IBAction func playAudio(sender: AnyObject) {
- audioEffect?.play() //播放声音
- playButton.setBackgroundImage(UIImage(named: "pauseImage.png"), forState: UIControlState.Normal)
- playButton.addTarget(self, action: ("pauseAudio"), forControlEvents: UIControlEvents.TouchUpInside)
- //创建定时器
- timer=NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: ("updateProgress"), userInfo: nil, repeats: true)
- }
(4)添加updateProgress()方法,实现当前播放时间的更新。代码如下:
- func updateProgress(){
- let currentTimeMinutes=Int(self.audioEffect!.currentTime/60) //获取分钟数
- let currentTimeSeconds=Int(audioEffect!.currentTime - Double(currentTimeMinutes*60))//获取秒数
- currentTime.text="\(currentTimeMinutes):\(currentTimeSeconds)"
- }
此时运行程序,会看到如图2.34所示的效果。当轻拍播放按钮后,会看到当前时间在不停的进行更新,如图2.35所示。

图2.34 初始状态 图2.35 更新当前播放时间
注意:当用户轻拍暂停按钮后,此时的音频文件就会暂停播放,当前播放的时间停止更新,此时需要在pauseAudio()动作中添加一行代码,实现此功能,代码如下:
- func pauseAudio(){
- audioEffect?.stop() //暂停
- playButton.setBackgroundImage(UIImage(named: "playImage.png"), forState: UIControlState.Normal)
- playButton.addTarget(self, action: ("playAudio:"), forControlEvents: UIControlEvents.TouchUpInside)
- timer?.invalidate() //让定时器失效
- }
iOS 9音频应用通过进度条查看进度
通过进度条查看进度可以让用户更为直接的看出音频文件播放了多少,还剩余多少,在图2.32中也使用到了此方法。在iOS中有两个控件可以实现进度条的功能:一种是Progress View控件;另一种是Slider控件。在本书中为了更为直观的看到音频文件多放了多少,还剩多少没有播放,我们采用Slider实现进度条的功能。
【示例2-9】以下将以第一个实例为基础,实现通过进度条查看进度的功能。具体的操作步骤如下:
(1)将主视图中的Progress Slider滑块控件与插座变量progressSlider进行关联。
(2)打开ViewController.swift文件,在updateProgress()方法中添加一行代码,对Slider控件的值进行设置,代码如下:
- func updateProgress(){
- let currentTimeMinutes=Int(self.audioEffect!.currentTime/60)
- let currentTimeSeconds=Int(Double(audioEffect!.currentTime) - Double(currentTimeMinutes*60))
- currentTime.text="\(currentTimeMinutes):\(currentTimeSeconds)"
- self.progressSlider.value=Float(self.audioEffect!.currentTime/self.audioEffect!.duration)
- }
此时运行程序,会看到如图2.36所示的效果。当轻拍播放按钮后,会看到当前时间在不停的进行更新,如图2.37所示。

图2.36 初始状态 图2.37 更新进度
iOS 9音频应用拖动进度条播放
在音乐应用中,用户都可以以拖动进度条的方式指定音频文件播放的位置。此功能的实现还需要使用到currentTime属性。
【示例2-10】以下将以第一个实例为基础,实现拖动进度条实现播放的功能。具体的操作步骤如下:
- @IBAction func dragPlayAudio(sender: AnyObject) {
- if(audioEffect!.playing){
- //设置当前播放的时间
- audioEffect!.currentTime=Double(progressSlider.value) * Double(audioEffect!.duration)
- }else{
- let alertController = UIAlertController(title: "提示", message: "音乐没有播放,拖动无效", preferredStyle: UIAlertControllerStyle.Alert)
- let action = UIAlertAction(title: "知道了", style: UIAlertActionStyle.Default){
- (action: UIAlertAction!) -> Void in
- self.audioEffect?.currentTime=0.0
- self.progressSlider.value=0.0
- }
- alertController.addAction(action)
- self.presentViewController(alertController, animated: true, completion: nil)
- }
- }
此时运行程序,在出现的模拟器界面中轻拍播放按钮,此时iOS 9音频应用开发音频文件就会播放。当开发者拖动进度条中的滑块后,音频文件就会播放滑块所在位置处的声音。
注意:拖动iOS 9音频应用开发进度条播放并需要在音频文件播放时实现,否则就会出现“音乐没有播放,拖动无效”的警告视图,如图2.38所示。

图2.38 警告视图
本文选自:iOS 9音频应用开发基础教程大学霸内部资料,转载请注明出处,尊重技术尊重IT人!
iOS 9音频应用播放音频之iOS 9音频播放进度的更多相关文章
- iOS开发系列--音频播放(音效和音乐)播放本地的
音频 在iOS中音频播放从形式上可以分为音效播放和音乐播放.前者主要指的是一些短音频播放,通常作为 点缀音频,对于这类音频不需要进行进度.循环等控制.后者指的是一些较长的音频,通常是主音频,对于这些音 ...
- iOS音频学习笔记二:iOS SDK中与音频有关的相关框架
上层: Media Player Framework: 包含MPMoviePlayerController.MPMoviePlayerViewController.MPMusicPla ...
- JavaScript多个音频audio标签,点击其中一个播放时,其他的停止播放
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 李洪强iOS开发之【零基础学习iOS开发】【01-前言】02-准备
在上一讲中,介绍了什么是iOS开发.说简单一点,iOS开发,就是开发运行在iPhone或者iPad上的软件.这么一说完,应该有很多人就会产生一些疑惑,比如学习iOS开发是不是一定要买iPhone?需不 ...
- 李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇
从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂 ...
- iOS开发技术分享(1)— iOS本地数据存储
iOS开发技术分享(1)— iOS本地数据存储 前言: 我本是一名asp.net程序员,后来加入了iOS游戏开发队伍,到现在也有一年多的时间了.这一年来,每天都干到2.3点钟才睡觉,不为别的,只为了学 ...
- javaCV开发详解之7:让音频转换更加简单,实现通用音频编码格式转换、重采样等音频参数的转换功能(以pcm16le编码的wav转mp3为例)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
- Delphi for iOS开发指南(3):创建一个FireMonkey iOS应用程序
http://cache.baiducontent.com/c?m=9d78d513d9d431a94f9d92697d60c015134381132ba1d0020fa48449e3732b4b50 ...
- iOS 9应用开发教程之创建iOS 9项目与模拟器介绍
iOS 9应用开发教程之创建iOS 9项目与模拟器介绍 编写第一个iOS 9应用 本节将以一个iOS 9应用程序为例,为开发者讲解如何使用Xcode 7.0去创建项目,以及iOS模拟器的一些功能.编辑 ...
- 李洪强iOS之集成极光推送三iOS集成指南
李洪强iOS之集成极光推送三iOS集成指南 SDK说明 适用版本 本文匹配的 SDK版本:r2.1.5 以后.查看最近更新了解最新的SDK更新情况.使用Xcode 6及以上版本可以使用新版Push S ...
随机推荐
- HDU 3977 斐波那契循环节
这类型的题目其实没什么意思..知道怎么做后,就有固定套路了..而且感觉这东西要出的很难的话,有这种方法解常数会比较大吧..所以一般最多套一些比较简单的直接可以暴力求循环节的题目了.. /** @Dat ...
- webapi + windows计划 + mshta 实现定时执行任务
当然,实现定时任务有更好的操作方式,比如方式一:asp.net mvc+quartz.net +corn +webapi,asp.net mvc做任务管理的平台,使用CronTrigger做定时触发, ...
- 重构改善既有代码设计--重构手法11:Move Field (搬移字段)
你的程序中,某个字段被其所驻类之外的另一个类更多的用到.在目标类建立一个新字段,修改源字段的所有用户,令它们改用新字段. 动机:在类之间移动状态和行为,是重构过程中必不可少的措施.随着系 ...
- iOS 程序启动流程
iOS程序启动原理 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong iOS应用程序运行 ...
- 【leetcode 简单】 第五十一题 有效电话号码
给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个 bash 脚本输出所有有效的电话号码. 你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxx ...
- 60、简述 yield和yield from关键字。
1.可迭代对象与迭代器的区别 可迭代对象:指的是具备可迭代的能力,即enumerable. 在Python中指的是可以通过for-in 语句去逐个访问元素的一些对象,比如元组tuple,列表list ...
- docker 升级后,配置 idea 连接 docker
[root@A01-R02-I188-87 ~]# docker version Client: Version: 18.06.1-ce API version: 1.24 Go version: g ...
- CTF线下赛AWD套路小结
近打了2场CTF线下赛,把AWD模式中的一些小套路做一些总结,本人web狗,二进制部分就不班门弄斧了. 一. AWD模式简介 AWD:Attack With Defence,比赛中每个队伍维护多台服务 ...
- 55.Jump Game---dp
题目链接 题目大意:给一个数组,第i个位置的值表示当前可以往前走的最远距离,求从第一个位置能否顺利走到最后一个位置.例子如下: 法一(借鉴):DP,dp[i]表示从上一个位置走到当前位置时,剩余的可以 ...
- POJ - Problem 2282 - The Counting Problem
整体思路:对于每一位,先将当前未达到$limit$部分的段 [如 $0$ ~ $10000$] 直接处理好,到下一位时再处理达到$limit$的部分. · $1 × 10 ^ n$以内每个数(包括$0 ...