锁屏下歌词轮播

前言

通过这文章你会学到:

  • 如何使用AVAudioPlayer播放本地音乐
  • app进入后台时,仍能播放音乐,并且能在控制台控制播放暂停
  • 提供锁屏下的信息,例如图片
  • 将文字和图片合成为新的图片,实现类似 网易云 锁屏下轮播歌词的原理。

播放音乐


使用AVFoundation
在文件任意地方写下下面代码,然后执行playBackgroundMusic("音乐1")就可以播放音乐了

import AVFoundationvar backgroundMusicPlayer: AVAudioPlayer!func playBackgroundMusic(filename: String) {//获取播放文件的位置,通过文件名和后缀let url = NSBundle.mainBundle().URLForResource(filename, withExtension: "mp3")//如果找不到文件则返回错误if (url == nil) {println("Could not find the file \(filename)")}var error: NSError? = nil//将播放文件赋值给播放器backgroundMusicPlayer = AVAudioPlayer(contentsOfURL: url, error: &error)//如果建立不了播放器则,提错if backgroundMusicPlayer == nil {println("Could not create audio player: \(error!)")return}//负值表示单曲循环backgroundMusicPlayer.numberOfLoops = -1backgroundMusicPlayer.prepareToPlay()backgroundMusicPlayer.play()
}
playBackgroundMusic("大开眼界")//播放`大开眼界.mp3`

后台播放音乐并操作


按下暂停能暂停播放

首先在info.plist添加如图标注的字符串

info.plist

就是在函数playBackgroundMusic(filename: String)加上以下代码,就可以实现后台播放:

    do {//播放器独占后台,其它音乐会停止try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)}catch{print(error)}

接着则是后台时控制

首先在viewDidLoad设置app接收remote event并且将viewController成为FirstResponder.

那么添加如下代码在viewDidload

UIApplication.sharedApplication().beginReceivingRemoteControlEvents()self.becomeFirstResponder()

并且在viewController覆盖canBecomeFirstResponder

    override func canBecomeFirstResponder() -> Bool {return true}

viewWillDispper添加代码

UIApplication.sharedApplication().resignFirstResponder() self.resignFirstResponder()

最后通过viewController处理事件,在viewController添加如下代码。
就能在程序切换到后台时不结束音乐。并实现如图中按下播放按键暂停或者播发音乐。

    override func remoteControlReceivedWithEvent(event: UIEvent?) {if event == nil {return}//播放或者暂停按钮按下时执行相应操作if event?.type == UIEventType.RemoteControl{switch(event!.subtype){case .RemoteControlPlay:backgroundMusicPlayer.play()case .RemoteControlPause:backgroundMusicPlayer.pause()default:print(event!.subtype)}}}

这样就能响应事件了。

锁屏下的音乐信息


lockScreen

使用MPNowPlayingInfoCenter

import MediaPlayer
func configNowPlaying(currentTime:NSTimeInterval,fireTime:NSTimeInterval){let mpPlayer = MPNowPlayingInfoCenter.defaultCenter()let image25 = UIImage(named:"25image")!//设置:歌名,封面图片,现在的所在播放时间,播放速度,音乐的时长let tmpPlayingInfo = [ MPMediaItemPropertyTitle : "25min",MPMediaItemPropertyArtwork : MPMediaItemArtwork(image: image25) ,MPNowPlayingInfoPropertyElapsedPlaybackTime : NSNumber(double: currentTime),MPNowPlayingInfoPropertyPlaybackRate : 1.0,MPMediaItemPropertyPlaybackDuration: fireTime]//将设置好的dict设置到infoCentermpPlayer.nowPlayingInfo = tmpPlayingInfo
}

锁屏下合成图片


效果:

锁屏下轮播文字

实现思路,就是通过NSTimer不断在后台每一秒合成图片和文字。
然后将合成后的图片如上函数configNowPlaying(_::)赋值给nowPlayingInfo的封面图片

那么合成图片的代码

func textToImage(drawText: NSString, inImage: UIImage)->UIImage{// 设置字体格式let textFont: UIFont = UIFont(name: "Helvetica Bold", size: textSize)!//用图片大小设置image context的大小UIGraphicsBeginImageContext(inImage.size)//将图片画进去inImage.drawInRect(CGRectMake(0, 0, inImage.size.width, inImage.size.height))//使用函数drawString,将文字画进去。(下面会有这个自定义函数)drawSting(drawText, withFont: textFont, inRect: CGRectMake(0, 0, inImage.size.width, inImage.size.height))// 然后获取描绘好的图片let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()// 结束imageContext描绘UIGraphicsEndImageContext()//将合成图片传递return newImage
}

以下是居中描绘文字的函数drawString

func drawSting(s:NSString,withFont font:UIFont,inRect contextRect: CGRect){//设置文字显示,居中let paragraphStyle = NSParagraphStyle.defaultParagraphStyle().mutableCopy() as! NSMutableParagraphStyleparagraphStyle.lineBreakMode = NSLineBreakMode.ByTruncatingTailparagraphStyle.alignment = NSTextAlignment.Center//设置文字属性,待会描绘文字时用let attr = [NSFontAttributeName : font,NSForegroundColorAttributeName : UIColor.blackColor(),NSParagraphStyleAttributeName : paragraphStyle]//将字符串赋予属性let size = s.sizeWithAttributes(attr)//设置文字局中的位置let xOffset = contextRect.origin.x + floor((contextRect.size.width - size.width) / 2)let yOffset = contextRect.origin.y + floor((contextRect.size.height - size.height) / 2)let textRect = CGRectMake(xOffset, yOffset, size.width, size.height)//描绘文字s.drawInRect(textRect, withAttributes: attr)
}
let whiteImage = UIImage(named:"whiteImage")!
let newImage = textToImage("24:55", inImage: whiteImage)//效果如下

合成图片

我这里是用白色的图片加上字符串实现的。

同理要实现网易云的那种效果则只需将白底的图片换成封面图加上歌词就可以了。

最后


本教程基本上就实现一个播放器的基本功能。

(END and Thank U)


参考链接:
后台播放
更多remote中控制的做法

音乐播放器 - iOS开发相关推荐

  1. Android 音乐播放器的开发教程(三) 小卷毛播放器的主界面开发 ---- 小达

    Android 音乐播放器的开发教程(三) 小卷毛播放器的主界面开发 拿好素材之后,打开你们的开发工具,小达这里用的是android studio1.0, 新建一个项目,打开activity_main ...

  2. Android音乐播放器的开发实例(2021新版-Java版)

    Android音乐播放器的开发实例 介绍 该项目旨在引导喜爱 Android 开发爱好者入门教程实例,可以一步一步的跟着来完成属于自己的项目开发过程. 此项目为基于 Java 语言开发,使用 Recy ...

  3. Android 音乐播放器的开发教程(二)反编译apk ----- 小达

    Android 音乐播放器的开发教程(二)基本布局 在上一篇中简单的介绍了下小卷毛播放器的基本情况,现在就正式的开始一步一步的做播放器.首先想要一个漂亮的UI(不是我的这个...),就需要好的素材,没 ...

  4. [转]大话企业级Android应用开发实战 音乐播放器的开发

    29.2  创 建 界 面 在main.xml中添按钮等控件,完成音乐播放器的界面,代码如下: main.xml <?xml version="1.0" encoding=& ...

  5. 基于智能手机Android平台音乐播放器全程开发实战

    基于android开发的智能手机平台的应用越来越多,目前也是一块比较热门的技术,本项目为基于android系统的音乐播放器项目,学习本项目的目的是为了让学员尽快掌握android领域的小应用的开发.项 ...

  6. 音乐播放器Android开发的目的,基于Android的手机音乐播放器的设计与开发

    摘要: 人们生活节奏的不断加快,伴随着智能手机和3G网络的普及以及云计算技术的不断发展和成熟,移动互联网衍生的很多业务已经成为人们生活娱乐的不可或缺的一部分.在移动音乐播放器开发领域,如何将移动社区业 ...

  7. android音乐播放器的开发与设计,Android音乐播放器的设计与实现

    内容简介: Android音乐播放器的设计与实现,毕业论文,共21页,7729字. 摘要:本文主要介绍了一个基于Andriod的音乐播放器的设计与实现.主要包括可行性分析,需求分析,App功能设计及实 ...

  8. 安卓音乐播放器app开发(一)---功能分析及启动页的制作

    音乐播放器app-功能分析及启动页的制作 现如今的音乐播放器的app种类繁多,让有选择困难症的同胞们难以抉择.现在,让Ryan带你打造一款属于自己的音乐播放器app. 功能介绍 实现本地音乐及在线音乐 ...

  9. html5开发一个音乐播放器,HTML5开发学习(1):使用aduio标签打造音乐播放器

    关于html5的炒作已经有一段时间了,小弟亦是个跟风之人,对该新鲜事物也充满好奇和期待.本文为该系列(html5尝鲜)第一节,先以一个简单的demo开胃,希望能勾起各位同学对html5的兴趣和关注. ...

  10. android开发音乐播放器,Android开发简易音乐播放器

    这里介绍一个简易的音乐播放器,供大家参考,具体内容如下 效果图如下: 但是,由于这是一个简易版的音乐播放器,所播放的音乐只有一首,且被写死,但,操作却十分简单,方便理解! 这是代码的主要设计: 音乐主 ...

最新文章

  1. Qt 5 打包成一个单文件方法,可以在其他电脑运行(附资源)
  2. 关于网站根目录下面robots.txt文件的作用
  3. java自定义findbugs规则_静态代码扫描 (三)——FindBugs 自定义规则入门
  4. Pycharm安装第三方库
  5. switch 的性能提升了 3 倍,我只用了这一招!
  6. 他帮 10 多家公司变身独角兽,总结出一份“成功”清单
  7. 为什么单独循环中的元素加法比组合循环中的要快得多?
  8. tensorflow之control_dependencies
  9. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅵ
  10. 悄悄地我走了 著名的非自然死亡
  11. 多维正态分布与图形识别
  12. 资深工程师PCB经验介绍
  13. 瀑布模型的问题是什么?
  14. 雷神笔记本做java,详细爆料雷神911Air星战三代 15.6寸笔记本好不好用?怎么样呢?大神吐槽真心话...
  15. 心血来潮——gitlab-ce汉化版
  16. 举世无双语音合成系统 VITS 发展历程(2023.03.31 SNAC)
  17. 《绝地求生:大逃杀》百万级别数据分析项目,还有源码+数据
  18. vue+photo-sphere-viewer 渲染全景图片,带给你沉浸式体验
  19. 等级保护测评常见的疑难杂症,这篇文章一招制胜
  20. 区块链架构--fabric基本介绍

热门文章

  1. 6种方法轻松将PDF转换为Word文档,办公必备!
  2. 2021-06-01-HPC-performance-test
  3. 为什么vb6中 Recordset对象的RecordCount属性总是 -1
  4. qq说说时间轴php实现,qq空间时间轴 PHP实现时间轴函数代码
  5. Android应用内加载pdf 使用pdf.js
  6. 你必须会的微服务之Hystrix熔断器
  7. CSS 布局案例:不会还有人不会布局吧
  8. 计算机晋级职称考试内容,职称计算机考试内容
  9. echarts双折线图自定义tooltips样式
  10. ebyte Lora 转 4G 透传通讯测试