好久没写过博客了,在这期间有很多同学通过博客评论、微博私信、邮件和我交流iOS音频方面的相关问题,其中被问到最多的是如何实现“边播边缓存”,这篇就来说一说这个话题。顺便一提,本文的题目虽然为“iOS音频播放”,但其中所涉及的部分技术方案在OSX平台或者在流播放视频下同样适用。

Read on →

距离上一篇博文发布已经有一个月多的时间了,在这其间我一直忙于筹办婚礼以至于这篇博文一直拖到了现在。

在之前一到六篇中我对iOS下的音频播放流程进行了阐述,在第七篇中介绍了如何播放iPod Lib中的歌曲,至此有关音频播放的话题就已经完结了,在这篇里我将会讲到的NowPlayingCenterRemoteControl这两个玩意本身和整个播放流程并没有什么关系,但它们可以让音频播放在iOS系统上获得更加好的用户体验。

Read on →

由于最近工作量非常饱和,所以这第七篇来的有点晚(创建时间是9月7日。。说出来都是泪)。

现在市面上的音乐播放器都支持iPod Library歌曲(俗称iPod音乐或者本地音乐)的播放,用户对于iPod音乐播放的需求也一直十分强烈。这篇要讲的是如何来播放iPod Library的歌曲。

Read on →

在前几篇中我分别讲到了AudioSessionAudioFileStreamAudioFileAudioQueue,这些类的功能已经涵盖了第一篇中所提到的音频播放所需要的步骤:

  1. 读取MP3文件 NSFileHandle
  2. 解析采样率、码率、时长等信息,分离MP3中的音频帧 AudioFileStream/AudioFile
  3. 对分离出来的音频帧解码得到PCM数据 AudioQueue
  4. 对PCM数据进行音效处理(均衡器、混响器等,非必须) 省略
  5. 把PCM数据解码成音频信号 AudioQueue
  6. 把音频信号交给硬件播放 AudioQueue
  7. 重复1-6步直到播放完成

下面我们就讲讲述如何用这些部件组成一个简单的本地音乐播放器,这里我会用到AudioSessionAudioFileStreamAudioFileAudioQueue

注意:在阅读本篇请实现阅读并理解前面1-5篇的内容以及2-5篇最后给出的封装类,本篇中的播放器实现将基于前面几篇中给出的MCAudioSessionMCAudioFileStreamMCAudioFileMCAudioOutputQueue进行实现。

Read on →

本来说好是要在第三篇中讲AudioFileStreamAudioQueue,但写着写着发现光AudioFileStream就好多内容,最后还是决定分篇介绍,这篇先来说一下AudioFileStream,下一篇计划说一下和AudioFileStream类似的AudioFile,下下篇再来说AudioQueue

在本篇那种将会提到计算音频时长duration和音频seek的方法,这些方法对于CBR编码形式的音频文件可以做到比较精确而对于VBR编码形式的会存在较大的误差(关于CBR和VBR,请看本系列的第一篇),具体讲到duration和seek时会再进行说明。

Read on →

从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改我也因此对于iOS下的音频播放实现有了一定的研究。写这个系列的博客目的一方面希望能够抛砖引玉,另一方面也是希望能帮助国内其他的iOS开发者和爱好者少走弯路(我自己就遇到了不少的坑=。=)。

本篇为《iOS音频播放》系列的第一篇,主要将对iOS下实现音频播放的方法进行概述。

Read on →
iOS

近期有部分用户反馈我们的app在使用时有发热现象,在排查原因的过程中发现了一个奇怪的问题。在某个页面推出时InstrumentsCore Animation会有帧数显示,数值在59~60,而此时并没有任何需要消耗Graphics的代码在跑,所有UI都是静止的。这个现象只会在iOS 7.1.x上出现,其他系统包括最新发布的iOS8 beta上均没有出现类似问题。

造成这个现象的页面比较特殊,其展现形式看上去虽然是一个UIViewController把一个UINavigationController用ModalView的形式push出来了,但实际上是把UINavigationController的.view直接add在了UIViewController的.view上,并用一个UIView动画展示页面。

为了弄清楚到底为什么会在UI静止的情况下产生Graphics消耗,我新建了一个空工程用相同的方法实现了一个推出页面的动画,然后profile却没有发现有问题。再次回头看app发现这个推出页面的controller是个UITabBarController,于是为测试工程加上tabBarController后再次profile,问题重现了,Core Animation在页面出现之后显示了帧数,页面隐藏之后帧数显示就消失了,从而可以推断是UITabBarController上的某个UI元素导致了这个问题。

接下来的步骤就是遍历UITabBarController的view上所有的subview并逐个隐藏来进行测试,幸运的是第一个就蒙对了,在我隐藏了UITabBarController的tabbar以后奇怪的帧数就不再出现了。这个现象很快让我想到了iOS 7以后苹果加入的模糊效果,这个效果在UINavigationBar、UITabBar、UIToolBar等UI控件上都有使用,下面把UITabBarController去掉,在view上直接add一个UIToolBar,发现问题同样会出现。至此基本确定是由于这个模糊效果造成的,至于为什么只会在7.1.x上出现这个问题。。可能只有苹果才知道了=。=。

测试程序代码点这里