iOS音频播放器锁屏歌词显示与性能优化

简介: iOS音频播放器锁屏歌词显示与性能优化

一、引言


   前边有博客探讨了有关iOS开发中音频播放的技术与进行后台音频播放并在后台与用户进行交互的方法,本篇将探讨一种在锁屏界面同步显示歌词歌词的方法,并在应用性能上进行一些处理。前边博客地址如下:


iOS音频开发AVAudioPlayer的应用:http://my.oschina.net/u/2340880/blog/420129


iOS后台音频开发与交互技术:http://my.oschina.net/u/2340880/blog/420183


二、在锁屏界面同步显示歌词


  我们知道,在音频后台播放时,锁屏界面的信息是由MPNowPlayingInfoCenter来设置的,其中的歌曲信息字典可以设置类似歌曲封面,艺术家,歌曲名,歌曲时间等。然而,对于MPNowPlayingInfoCenter中可以由开发者掌握的接口十分有限,若要在锁屏界面同步的显示歌曲歌词,一个比较简单的方法是不停的将当前歌词与封面进行图片合成,之后刷新锁屏界面的图片。下面代码是根据解析好的LRC歌词数据进行图片合成的示例代码:


//这个方法通过传入的LRC歌词数据进行图片的合成 array参数为每行lrc歌词数据集合 index为当前需要播放的lrc歌词行数

-(void)setCurretLRCArray:(NSArray *)array index:(int)index{

   //LRCItem是歌词模型 里面的lrc方法获取歌词文字字符串

   NSString * lineLRC = [(LRCItem *)array[index] lrc];

   //提高性能 进行判断 当前显示的歌词有无变化 如果没变化 不进行后续操作

   if ([_lrcLabel.text isEqualToString:lineLRC]) {

       return;

   }

   _lrcLabel.text = lineLRC;

   //将歌词整理成整齐数据

   //进行行数设置

       NSMutableString * lrcStr = [[NSMutableString alloc]init];

       if (index<_lines/2) {

           //前面用\n补齐

           int offset = (int)_lines/2-index;

           for (int j=0; j<offset; j++) {

               [lrcStr appendFormat:@"\n"];

           }

           for (int j=0; j<_lines-offset; j++) {

               [lrcStr appendFormat:@"%@\n",[(LRCItem *)array[j] lrc]];

           }

       } else if (array.count-1-index<_lines/2) {

           //后面用\n补齐

           int offset = (int)_lines/2-(int)(array.count-index-1);

           for (int j=index-(_lines/2); j<array.count; j++) {

               [lrcStr appendFormat:@"%@\n",[(LRCItem *)array[j] lrc]];

           }

           for (int j=0; j<offset; j++) {

               [lrcStr appendFormat:@"\n"];

           }

       }else {

           for (int j=0; j<_lines; j++) {

               [lrcStr appendString:[(LRCItem *)array[index-_lines/2+j] lrc]];

               [lrcStr appendString:@"\n"];

           }

       }

   //将当前显示的歌词部分高亮

   NSMutableAttributedString * attriStr = [[NSMutableAttributedString alloc]initWithString:lrcStr];

   NSRange range = [lrcStr rangeOfString:[array[index] lrc]];

   [attriStr setAttributes:@{NSForegroundColorAttributeName:[UIColor greenColor]} range:range];

   _lrcView.attributedText = attriStr;

   _lrcIMGLabel.attributedText = attriStr;

   //进行截屏

   if (!_lrcIMGbg) {

       _lrcIMGbg = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];

       _lrcIMGbg.image = [UIImage imageNamed:@"BG.jpeg"];

       [_lrcIMGbg addSubview:_lrcIMGLabel];


   }

   //获取添加了歌词数据的背景图

   UIGraphicsBeginImageContext(_lrcIMGbg.frame.size);

   CGContextRef context = UIGraphicsGetCurrentContext();

   [_lrcIMGbg.layer renderInContext:context];

   UIImage *img = UIGraphicsGetImageFromCurrentImageContext();

   UIGraphicsEndImageContext();

   _lrcImage = [img copy];

}


三、应用性能的优化


  从功能上来说,通过一直合成刷新锁屏界面的封面图是可行的,然而在使用中我发现,不停和合成图片和刷新操作将使设备非常耗电,如果可以完成下面的优化,则可以大大提高应用的性能:


1.应用在前台时不进行后台锁屏界面的刷新操作。


2.应用在后台时不进行前台歌词信息、歌曲信息的相应更新。


3.当屏幕变黑关闭时,停止所有刷新操作。


4.当屏幕从新被点亮时,进行后台信息刷新。


   上面4点需求,前两点十分容易搞定,在AppDelegate中有如下的方法可以监听应用程序前台与后台的切换:


//应用进入后台时调用

- (void)applicationWillResignActive:(UIApplication *)application {

  //发送通知

   [[NSNotificationCenter defaultCenter]postNotificationName:@"goBack" object:nil];

}

//应用进入前台时调用

- (void)applicationDidBecomeActive:(UIApplication *)application {

   [[NSNotificationCenter defaultCenter]postNotificationName:@"goForward" object:nil];

}

在相应的类中监听这两个通知即可以做到刷新模式的切换。


   对于上面需求的第3点与第4点,Foundation框架中没有提供公开的方法来监听屏幕设备的点亮状态,但是可以通过notify_register_dispath()方法来监听。使用示例代码如下:


#import <notify.h>


   //在定时器中使用如下代码实时监听屏幕状态

   uint64_t locked;

   __block int token = 0;    

   notify_register_dispatch("com.apple.springboard.hasBlankedScreen",&token,dispatch_get_main_queue(),^(int t){

   });

   notify_get_state(token, &locked);

   //如果屏幕变暗 直接不走更新方法 lock为1则为变暗关闭状态 0则为点亮状态

   if (locked) {

       return;

   }

  通过上面优化的代码,性能将会强很多。


   由于前面博客已经详细的介绍了音频开发与后台交互的内容,这篇博客主要探讨了锁屏歌词相关的开发思路与优化方向,提供的示例代码都是片段,并不完整,经过优化的音频播放器源码在如下git地址上,需要的朋友可以作为参考:


同步显示锁屏歌词的音乐播放器:https://github.com/ZYHshao/MyPlayer

目录
相关文章
|
1月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
160 4
|
7月前
|
算法 iOS开发 UED
iOS如何进行应用的性能优化?
iOS如何进行应用的性能优化?
100 2
|
4月前
|
缓存 监控 Android开发
探索iOS与安卓开发中的性能优化策略
在移动应用开发的竞技场上,iOS和安卓这两大操作系统不断推动着技术的边界。性能优化,作为提升用户体验的关键因素,已成为开发者们关注的焦点。本文将深入探讨两大平台上的性能优化实践,揭示如何通过工具、技术和策略来提升应用的响应速度和流畅度,同时考虑到电池寿命和内存管理等关键指标。
|
1月前
|
监控 iOS开发 开发者
iOS性能优化:深入函数调用栈与符号化技术
在iOS开发中,函数调用栈是理解程序执行流程和优化性能的关键。当应用出现性能问题或崩溃时,能够准确地读取和解析调用栈信息对于快速定位问题至关重要。本文将探讨iOS中的函数调用栈,以及如何通过符号化技术进行有效的性能调优。
35 3
|
6月前
|
Java Android开发 iOS开发
深入探讨移动操作系统的性能优化:安卓与iOS的对比分析
在现代移动设备中,操作系统的性能优化至关重要。本文从系统架构、内存管理、电池续航和应用程序运行效率等多个维度,深入探讨了安卓(Android)和iOS两大主流移动操作系统的优化策略及其实际效果,旨在为开发者和用户提供更清晰的了解和选择依据。
237 0
|
4月前
|
iOS开发 开发者
iOS平台RTMP|RTSP播放器如何实时回调YUV数据
我们在做RTMP、RTSP播放器的时候,有开发者需要自己处理拉取到的YUV数据,做二次分析之用,为此,我们做了以下的设计:InitPlayer之后,再调用SmartPlayerStart()接口之前,设置yuv数据回调即可。
|
4月前
|
编解码 开发工具 Android开发
iOS平台如何实现毫秒级延迟的RTMP|RTSP播放器
在我的blog里面,最近很少有提到iOS平台RTMP推送|轻量级RTSP服务和RTMP|RTSP直播播放模块,实际上,我们在2016年就发布了iOS平台直播推拉流、转发模块,只是因为传统行业,对iOS的需求比较少,所以一直没单独说明,本文主要介绍下,如何在iOS平台播放RTMP或RTSP流。
|
3月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
161 0
|
5月前
|
算法 数据库 Android开发
探索iOS与安卓应用开发的性能优化策略
在移动应用开发领域,性能优化是提升用户体验、增强应用市场竞争力的关键因素。本文深入探讨了iOS和安卓平台下,开发者如何通过具体技术和方法有效优化应用性能。文章首先概述了性能优化的重要性,随后详细分析了iOS和安卓开发中的优化策略,包括代码优化、资源管理和异步处理等技术手段。最后,通过案例分析,展示了这些优化措施在实际开发中的应用效果,旨在为开发者提供实用的性能提升建议。
|
7月前
|
缓存 Android开发 iOS开发
打造高效移动应用:Android与iOS性能优化策略
【4月更文挑战第29天】 在移动设备日益成为用户日常互动的主要平台的今天,应用程序的性能已成为决定其成功的关键因素之一。本文将探讨针对Android和iOS平台的性能优化技巧,涵盖内存管理、多线程处理、网络请求优化以及用户界面的流畅性提升等方面。通过分析不同操作系统的架构特点,我们旨在提供一套综合性的策略,帮助开发者构建快速、响应迅捷且用户体验良好的应用。